mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-11-03 19:20:16 +08:00
add # 新增作物、种子仓库界面
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
from dataclasses import replace
|
||||
from io import BytesIO
|
||||
import unittest
|
||||
|
||||
from PIL import Image
|
||||
|
||||
from farm_core import Catalogue
|
||||
from farm_core.domain import Account, InventoryItem, Plot, Snapshot
|
||||
from farm_render import FarmRenderer
|
||||
from farm_render.warehouse import (
|
||||
render_warehouse, warehouse_page, warehouse_rows, warehouse_text,
|
||||
)
|
||||
|
||||
|
||||
class WarehouseTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.catalogue = Catalogue.bundled()
|
||||
self.carrot = self.catalogue.get('胡萝卜')
|
||||
self.berry = self.catalogue.get('草莓')
|
||||
self.snapshot = Snapshot(Account('仓库', 500, 0, 0), (
|
||||
InventoryItem('草莓', 3, 8, True, self.berry.plant_id),
|
||||
InventoryItem('胡萝卜', 2, 10, False, self.carrot.plant_id),
|
||||
InventoryItem('零库存', 0, 0, False, 999999),
|
||||
), (Plot(1), Plot(2)))
|
||||
|
||||
def test_separate_positive_stocks_groups_and_exclude_locked_value(self):
|
||||
crops = warehouse_rows(self.snapshot, self.catalogue, 'crops')
|
||||
self.assertEqual([r.group for r in crops], ['可出售', '已锁定'])
|
||||
text = warehouse_text(crops, self.snapshot, 'crops', 1, 1)
|
||||
self.assertIn(f'可出售价值 {10*self.carrot.price:,}', text)
|
||||
self.assertIn('胡萝卜(#1) 10个', text)
|
||||
self.assertNotIn('零库存', text)
|
||||
seeds = warehouse_rows(self.snapshot, self.catalogue, 'seeds')
|
||||
self.assertEqual([r.group for r in seeds], ['单季种子', '多季种子'])
|
||||
self.assertEqual([r.quantity for r in seeds], [2, 3])
|
||||
self.assertIn('当前空地 2/2块', warehouse_text(
|
||||
seeds, self.snapshot, 'seeds', 1, 1,
|
||||
))
|
||||
|
||||
def test_pagination_preserves_ids_and_unknown_directory_is_not_zero(self):
|
||||
items = tuple(InventoryItem('未知', 1, 2, False, i)
|
||||
for i in range(9000, 9025))
|
||||
snapshot = replace(self.snapshot, inventory=items)
|
||||
rows = warehouse_rows(snapshot, self.catalogue, 'seeds')
|
||||
self.assertEqual([r.plant_id for r in warehouse_page(rows, 2)[0]],
|
||||
list(range(9012, 9024)))
|
||||
self.assertEqual(warehouse_page(rows, 3)[1], 3)
|
||||
self.assertEqual(rows[0].group, '信息缺失')
|
||||
for page in (0, 4, True):
|
||||
with self.assertRaises(ValueError):
|
||||
warehouse_page(rows, page)
|
||||
crops = warehouse_rows(snapshot, self.catalogue, 'crops')
|
||||
self.assertIn('不含目录缺失项', warehouse_text(
|
||||
crops, snapshot, 'crops', 1, 3,
|
||||
))
|
||||
|
||||
def test_empty_stock_and_no_snapshot_mutation(self):
|
||||
snapshot = replace(self.snapshot, inventory=())
|
||||
rows = warehouse_rows(snapshot, self.catalogue, 'seeds')
|
||||
self.assertEqual(warehouse_page(rows, 1), ((), 1))
|
||||
self.assertIn('种子商店', warehouse_text(
|
||||
rows, snapshot, 'seeds', 1, 1,
|
||||
))
|
||||
self.assertEqual(snapshot.inventory, ())
|
||||
|
||||
def test_render_crops_and_seeds_as_compressed_jpeg(self):
|
||||
from scripts.ci_font import choose_font
|
||||
renderer = FarmRenderer(choose_font())
|
||||
for kind in ('crops', 'seeds'):
|
||||
rows = warehouse_rows(self.snapshot, self.catalogue, kind)
|
||||
content = render_warehouse(renderer, rows, self.snapshot,
|
||||
kind, 1, 1)
|
||||
with Image.open(BytesIO(content)) as image:
|
||||
self.assertEqual(image.format, 'JPEG')
|
||||
self.assertEqual(image.size, (1024, 1536))
|
||||
self.assertLess(len(content), 500000)
|
||||
@@ -83,6 +83,38 @@ class ZhenxunRuntimeTests(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertIn('待开垦(24块):7、8、9', text)
|
||||
self.assertIn('农场详述', text)
|
||||
|
||||
async def test_classified_warehouse_images_text_and_read_only_paging(self):
|
||||
from io import BytesIO
|
||||
from PIL import Image
|
||||
from unittest.mock import AsyncMock
|
||||
self.assertEqual(self.module.COMMANDS['我的作物'], 'crops')
|
||||
self.assertEqual(self.module.COMMANDS['我的种子'], 'seeds')
|
||||
await self.call('register')
|
||||
await self.call('buy', '胡萝卜 2', 'warehouse-buy')
|
||||
before = await self.runtime.service.snapshot(self.runtime_identity())
|
||||
with patch.object(self.runtime.service, 'snapshot',
|
||||
new=AsyncMock(return_value=before)) as query:
|
||||
content = await self.call('seeds', message=None)
|
||||
query.assert_awaited_once()
|
||||
with Image.open(BytesIO(content)) as image:
|
||||
self.assertEqual(image.format, 'JPEG')
|
||||
self.assertEqual(before, await self.runtime.service.snapshot(
|
||||
self.runtime_identity(),
|
||||
))
|
||||
for invalid in ('0', '999', 'abc'):
|
||||
self.assertIn('页码无效', await self.call('seeds', invalid))
|
||||
self.assertIn('开通农场', await self.call('crops', user_id='other'))
|
||||
rendering = self.runtime.rendering
|
||||
self.runtime.rendering = None
|
||||
try:
|
||||
text = await self.call('seeds', message=None)
|
||||
self.assertIn('胡萝卜(#1) 2粒', text)
|
||||
self.assertNotIn('累计经验', text)
|
||||
self.assertIn('暂无作物', await self.call('crops', message=None))
|
||||
self.assertEqual(text, await self.call('farm', 'my-seed'))
|
||||
finally:
|
||||
self.runtime.rendering = rendering
|
||||
|
||||
async def test_original_commands_transactions_and_png(self):
|
||||
self.assertNotIn("测试农场", self.module.COMMANDS)
|
||||
self.assertIn("开通农场", self.module.COMMANDS)
|
||||
@@ -204,7 +236,7 @@ class ZhenxunRuntimeTests(unittest.IsolatedAsyncioTestCase):
|
||||
from PIL import Image
|
||||
from unittest.mock import AsyncMock
|
||||
self.assertEqual(self.module.COMMANDS['农场详述'], 'details')
|
||||
self.assertEqual(self.module.COMMANDS['我的种子'], 'inventory')
|
||||
self.assertEqual(self.module.COMMANDS['我的种子'], 'seeds')
|
||||
await self.call('register')
|
||||
await self.call('buy', '白萝卜 1', 'buy-details')
|
||||
await self.call('sow', '白萝卜 1', 'sow-details')
|
||||
|
||||
Reference in New Issue
Block a user