安全:隔离报表选项扫码与首页数据
This commit is contained in:
@@ -22,6 +22,7 @@ from module_business.controller import report_controller as report_controller_mo
|
||||
from module_business.dao import report_dao as report_dao_module
|
||||
from module_business.dao.access_dao import AccessDao
|
||||
from module_business.domain.enums import DocumentStatus, PalletEventType, PalletFlowState, ReturnStatus
|
||||
from module_business.domain.test_batch_scope import TestBatchScope
|
||||
from module_business.entity.vo.report_vo import (
|
||||
ConsumptionReportModel,
|
||||
ConsumptionReportQueryModel,
|
||||
@@ -206,12 +207,12 @@ class TestReportPublicContract(unittest.TestCase):
|
||||
report_dao = getattr(report_dao_module, 'ReportDao', None)
|
||||
self.assertIsNotNone(report_dao, 'ReportDao 尚未实现')
|
||||
expected_signatures = {
|
||||
'get_pallet_inventory_list': ('db', 'query_object', 'warehouse_ids', 'site_ids'),
|
||||
'get_filling_report_list': ('db', 'query_object', 'warehouse_ids'),
|
||||
'get_shipment_report_list': ('db', 'query_object', 'warehouse_ids', 'site_ids'),
|
||||
'get_consumption_report_list': ('db', 'query_object', 'site_ids'),
|
||||
'get_return_report_list': ('db', 'query_object', 'site_ids', 'warehouse_ids'),
|
||||
'get_pallet_trace_list': ('db', 'query_object', 'warehouse_ids', 'site_ids'),
|
||||
'get_pallet_inventory_list': ('db', 'query_object', 'scope', 'warehouse_ids', 'site_ids'),
|
||||
'get_filling_report_list': ('db', 'query_object', 'scope', 'warehouse_ids'),
|
||||
'get_shipment_report_list': ('db', 'query_object', 'scope', 'warehouse_ids', 'site_ids'),
|
||||
'get_consumption_report_list': ('db', 'query_object', 'scope', 'site_ids'),
|
||||
'get_return_report_list': ('db', 'query_object', 'scope', 'site_ids', 'warehouse_ids'),
|
||||
'get_pallet_trace_list': ('db', 'query_object', 'scope', 'warehouse_ids', 'site_ids'),
|
||||
}
|
||||
|
||||
for method_name, expected_parameters in expected_signatures.items():
|
||||
@@ -237,7 +238,7 @@ class TestReportPublicContract(unittest.TestCase):
|
||||
method = getattr(report_service, method_name, None)
|
||||
self.assertIsNotNone(method, f'ReportService.{method_name} 尚未实现')
|
||||
self.assertEqual(
|
||||
('query_db', 'query_object', 'current_user'),
|
||||
('query_db', 'query_object', 'current_user', 'test_scope'),
|
||||
tuple(inspect.signature(method).parameters),
|
||||
)
|
||||
|
||||
@@ -335,6 +336,7 @@ class TestReportDaoQueries(unittest.IsolatedAsyncioTestCase):
|
||||
hasNext=False,
|
||||
)
|
||||
paginate = AsyncMock(return_value=page)
|
||||
scope.setdefault('scope', TestBatchScope.formal())
|
||||
with patch.object(PageUtil, 'paginate', new=paginate):
|
||||
try:
|
||||
result = await method(self.db, query_object, **scope)
|
||||
@@ -659,23 +661,24 @@ class TestReportServices(unittest.IsolatedAsyncioTestCase):
|
||||
dao_method = AsyncMock(return_value=page)
|
||||
warehouse_scope = AsyncMock(return_value=[8, 7, 7])
|
||||
site_scope = AsyncMock(return_value=[10, 9, 9])
|
||||
test_scope = TestBatchScope.formal()
|
||||
with (
|
||||
patch.object(ReportDao, dao_name, new=dao_method),
|
||||
patch.object(AccessDao, 'list_user_warehouse_ids', new=warehouse_scope),
|
||||
patch.object(AccessDao, 'list_user_site_ids', new=site_scope),
|
||||
):
|
||||
try:
|
||||
result = await getattr(ReportService, service_name)(self.db, query_object, self.user)
|
||||
result = await getattr(ReportService, service_name)(self.db, query_object, self.user, test_scope)
|
||||
except NotImplementedError:
|
||||
self.fail(f'ReportService.{service_name} 尚未实现数据范围和行转换')
|
||||
|
||||
dao_method.assert_awaited_once_with(self.db, query_object, **expected_scope)
|
||||
dao_method.assert_awaited_once_with(self.db, query_object, test_scope, **expected_scope)
|
||||
if 'warehouse_ids' in expected_scope:
|
||||
warehouse_scope.assert_awaited_once_with(self.db, 7)
|
||||
warehouse_scope.assert_awaited_once_with(self.db, 7, test_scope)
|
||||
else:
|
||||
warehouse_scope.assert_not_awaited()
|
||||
if 'site_ids' in expected_scope:
|
||||
site_scope.assert_awaited_once_with(self.db, 7)
|
||||
site_scope.assert_awaited_once_with(self.db, 7, test_scope)
|
||||
else:
|
||||
site_scope.assert_not_awaited()
|
||||
self.assertEqual(17, result.total)
|
||||
@@ -779,6 +782,7 @@ class TestReportServices(unittest.IsolatedAsyncioTestCase):
|
||||
)
|
||||
for service_name, dao_name, query_object, expected_scope in cases:
|
||||
with self.subTest(service_name=service_name):
|
||||
test_scope = TestBatchScope.formal()
|
||||
dao_method = AsyncMock(
|
||||
return_value=PageModel(
|
||||
rows=[],
|
||||
@@ -796,13 +800,13 @@ class TestReportServices(unittest.IsolatedAsyncioTestCase):
|
||||
patch.object(AccessDao, 'list_user_site_ids', new=site_scope),
|
||||
):
|
||||
try:
|
||||
await getattr(ReportService, service_name)(self.db, query_object, make_user(1))
|
||||
await getattr(ReportService, service_name)(self.db, query_object, make_user(1), test_scope)
|
||||
except NotImplementedError:
|
||||
self.fail(f'ReportService.{service_name} 尚未实现管理员范围语义')
|
||||
|
||||
warehouse_scope.assert_not_awaited()
|
||||
site_scope.assert_not_awaited()
|
||||
dao_method.assert_awaited_once_with(self.db, query_object, **expected_scope)
|
||||
dao_method.assert_awaited_once_with(self.db, query_object, test_scope, **expected_scope)
|
||||
|
||||
async def _assert_empty_page_without_dao(
|
||||
self,
|
||||
@@ -813,6 +817,7 @@ class TestReportServices(unittest.IsolatedAsyncioTestCase):
|
||||
site_ids: list[int] | None,
|
||||
) -> None:
|
||||
dao_method = AsyncMock()
|
||||
test_scope = TestBatchScope.formal()
|
||||
with (
|
||||
patch.object(ReportDao, dao_name, new=dao_method),
|
||||
patch.object(
|
||||
@@ -827,7 +832,7 @@ class TestReportServices(unittest.IsolatedAsyncioTestCase):
|
||||
),
|
||||
):
|
||||
try:
|
||||
result = await getattr(ReportService, service_name)(self.db, query_object, self.user)
|
||||
result = await getattr(ReportService, service_name)(self.db, query_object, self.user, test_scope)
|
||||
except NotImplementedError:
|
||||
self.fail(f'ReportService.{service_name} 尚未实现空范围短路')
|
||||
|
||||
@@ -888,7 +893,12 @@ class TestReportServices(unittest.IsolatedAsyncioTestCase):
|
||||
patch.object(AccessDao, 'list_user_site_ids', new=AsyncMock(return_value=[])),
|
||||
):
|
||||
try:
|
||||
await getattr(ReportService, service_name)(self.db, query_object, self.user)
|
||||
await getattr(ReportService, service_name)(
|
||||
self.db,
|
||||
query_object,
|
||||
self.user,
|
||||
TestBatchScope.formal(),
|
||||
)
|
||||
except NotImplementedError:
|
||||
self.fail(f'ReportService.{service_name} 尚未实现单侧 OR 范围可见性')
|
||||
dao_method.assert_awaited_once()
|
||||
|
||||
Reference in New Issue
Block a user