为基础资料维护页面增加导入导出
This commit is contained in:
@@ -29,6 +29,7 @@ CONTROLLER_NAMES = (
|
||||
'test_batch',
|
||||
'dashboard',
|
||||
'tunnel',
|
||||
'master_excel',
|
||||
)
|
||||
TARGET_PREFIXES = (
|
||||
'/master',
|
||||
@@ -85,10 +86,24 @@ EXPECTED_BUTTON_PERMISSIONS = frozenset(
|
||||
'master:pallet:add',
|
||||
'master:pallet:edit',
|
||||
'master:pallet:print',
|
||||
'master:strain:import',
|
||||
'master:strain:export',
|
||||
'master:customer:import',
|
||||
'master:customer:export',
|
||||
'master:site:import',
|
||||
'master:site:export',
|
||||
'master:line:import',
|
||||
'master:line:export',
|
||||
'master:warehouse:import',
|
||||
'master:warehouse:export',
|
||||
'master:pallet:import',
|
||||
'master:pallet:export',
|
||||
'master:tunnel:query',
|
||||
'master:tunnel:add',
|
||||
'master:tunnel:edit',
|
||||
'master:tunnel:remove',
|
||||
'master:tunnel:import',
|
||||
'master:tunnel:export',
|
||||
'business:inbound:query',
|
||||
'business:inbound:add',
|
||||
'business:inbound:edit',
|
||||
@@ -142,6 +157,7 @@ VUE_PAGE_PATHS = (
|
||||
'src/views/report/consumption/index.vue',
|
||||
'src/views/report/return/index.vue',
|
||||
'src/views/report/palletTrace/index.vue',
|
||||
'src/components/MasterExcelActions/index.vue',
|
||||
)
|
||||
PERMISSION_LITERAL_PATTERN = re.compile(r'(?:master|business|report|system):[a-z]+:[a-z]+')
|
||||
UNGUARDED_AUTHENTICATED_ROUTES = {
|
||||
@@ -196,6 +212,16 @@ def _build_expected_route_permissions() -> dict[tuple[str, str], str]:
|
||||
('/master/tunnel/{tunnel_ids}', 'DELETE'): 'master:tunnel:remove',
|
||||
}
|
||||
)
|
||||
for resource in ('strain', 'customer', 'site', 'line', 'warehouse', 'pallet', 'tunnel'):
|
||||
root = f'/master/{resource}'
|
||||
permission_root = f'master:{resource}'
|
||||
expected.update(
|
||||
{
|
||||
(f'{root}/importData', 'POST'): f'{permission_root}:import',
|
||||
(f'{root}/importTemplate', 'POST'): f'{permission_root}:import',
|
||||
(f'{root}/export', 'POST'): f'{permission_root}:export',
|
||||
}
|
||||
)
|
||||
|
||||
expected.update(
|
||||
{
|
||||
@@ -323,7 +349,7 @@ def _auth_dependencies(route: APIRoute) -> list[CheckUserInterfaceAuth]:
|
||||
|
||||
def _assert_controller_permission_literals(test_case: unittest.TestCase, literals: list[str]) -> None:
|
||||
expected = Counter(EXPECTED_ROUTE_PERMISSIONS.values())
|
||||
test_case.assertEqual(98, expected.total())
|
||||
test_case.assertEqual(119, expected.total())
|
||||
test_case.assertEqual(expected, Counter(literals))
|
||||
test_case.assertEqual(EXPECTED_PERMISSIONS, frozenset(expected))
|
||||
|
||||
@@ -475,7 +501,7 @@ class ApiPermissionContractTest(unittest.TestCase):
|
||||
}
|
||||
|
||||
self.assertEqual(set(EXPECTED_ROUTE_PERMISSIONS) | UNGUARDED_AUTHENTICATED_ROUTES, actual_operations)
|
||||
self.assertEqual(100, len(actual_operations))
|
||||
self.assertEqual(121, len(actual_operations))
|
||||
|
||||
openapi_ai_paths = sorted(path for path in self.schema['paths'] if path == '/ai' or path.startswith('/ai/'))
|
||||
app_ai_paths = sorted(
|
||||
@@ -529,9 +555,9 @@ class ApiPermissionContractTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual([], malformed_calls)
|
||||
self.assertEqual(19, len(EXPECTED_PAGE_PERMISSIONS))
|
||||
self.assertEqual(48, len(EXPECTED_BUTTON_PERMISSIONS))
|
||||
self.assertEqual(62, len(EXPECTED_BUTTON_PERMISSIONS))
|
||||
self.assertFalse(EXPECTED_PAGE_PERMISSIONS & EXPECTED_BUTTON_PERMISSIONS)
|
||||
self.assertEqual(67, len(EXPECTED_PERMISSIONS))
|
||||
self.assertEqual(81, len(EXPECTED_PERMISSIONS))
|
||||
_assert_controller_permission_literals(self, literals)
|
||||
self.assertEqual(
|
||||
{
|
||||
@@ -541,6 +567,8 @@ class ApiPermissionContractTest(unittest.TestCase):
|
||||
'close',
|
||||
'confirm',
|
||||
'edit',
|
||||
'export',
|
||||
'import',
|
||||
'list',
|
||||
'print',
|
||||
'purge',
|
||||
@@ -554,7 +582,7 @@ class ApiPermissionContractTest(unittest.TestCase):
|
||||
|
||||
def test_controller_ast_permission_contract_rejects_duplicate_call(self) -> None:
|
||||
literals = list(EXPECTED_ROUTE_PERMISSIONS.values())
|
||||
self.assertEqual(98, len(literals))
|
||||
self.assertEqual(119, len(literals))
|
||||
literals.append(literals[0])
|
||||
|
||||
with self.assertRaises(AssertionError):
|
||||
@@ -572,8 +600,8 @@ class ApiPermissionContractTest(unittest.TestCase):
|
||||
|
||||
def test_vue_pages_have_exact_guarded_permission_contract(self) -> None:
|
||||
actual_permissions = set()
|
||||
self.assertEqual(18, len(VUE_PAGE_PATHS))
|
||||
self.assertEqual(18, len(set(VUE_PAGE_PATHS)))
|
||||
self.assertEqual(19, len(VUE_PAGE_PATHS))
|
||||
self.assertEqual(19, len(set(VUE_PAGE_PATHS)))
|
||||
for relative_path in VUE_PAGE_PATHS:
|
||||
source = (FRONTEND_ROOT / relative_path).read_text(encoding='utf-8')
|
||||
guarded = _extract_guarded_vue_permissions(source)
|
||||
@@ -758,7 +786,7 @@ class ApiPermissionContractTest(unittest.TestCase):
|
||||
for method in route.methods & WRITE_METHODS:
|
||||
actual_write_routes[(route.path_format, method)] = route
|
||||
|
||||
self.assertEqual(46, len(expected_write_permissions))
|
||||
self.assertEqual(67, len(expected_write_permissions))
|
||||
self.assertEqual(set(expected_write_permissions), set(actual_write_routes))
|
||||
for key, expected_permission in expected_write_permissions.items():
|
||||
with self.subTest(operation=key):
|
||||
|
||||
Reference in New Issue
Block a user