测试:加强一级菜单稳定字段契约

This commit is contained in:
焦龙言
2026-07-27 20:41:20 +08:00
parent 619f3d5d63
commit db5755586d
@@ -590,6 +590,14 @@ EXPECTED_TOP_LEVEL_MENU_POSITIONS = {
2: ('系统监控', 0, 5), 2: ('系统监控', 0, 5),
3: ('系统工具', 0, 6), 3: ('系统工具', 0, 6),
} }
EXPECTED_TOP_LEVEL_MENU_STABLE_FIELDS = {
121: ('基础资料维护', 'businessMaster', None, '', '', '1', '0', 'M', '0', '0', '', '#'),
122: ('业务管理', 'businessOperation', None, '', '', '1', '0', 'M', '0', '0', '', '#'),
123: ('报表查询', 'businessReport', None, '', '', '1', '0', 'M', '0', '0', '', '#'),
1: ('系统管理', 'system', None, '', '', '1', '0', 'M', '0', '0', '', 'system'),
2: ('系统监控', 'monitor', None, '', '', '1', '0', 'M', '0', '0', '', 'monitor'),
3: ('系统工具', 'tool', None, '', '', '1', '0', 'M', '0', '0', '', 'tool'),
}
MENU_PROMOTION_IDS = set(EXPECTED_TOP_LEVEL_MENU_POSITIONS) MENU_PROMOTION_IDS = set(EXPECTED_TOP_LEVEL_MENU_POSITIONS)
BUSINESS_MENU_IDS = set(range(121, 124)) | set(range(502, 519)) | set(range(1065, 1109)) BUSINESS_MENU_IDS = set(range(121, 124)) | set(range(502, 519)) | set(range(1065, 1109))
MYSQL_MENU_STABLE_COLUMNS = ( MYSQL_MENU_STABLE_COLUMNS = (
@@ -870,6 +878,15 @@ def _business_menu_rows(sql: str) -> dict[int, list]:
return _menu_rows(sql, BUSINESS_MENU_IDS) return _menu_rows(sql, BUSINESS_MENU_IDS)
def _assert_top_level_menu_fields(test_case: unittest.TestCase, sql: str) -> None:
rows = _menu_rows(sql, MENU_PROMOTION_IDS)
actual_positions = {menu_id: (row[1], int(row[2]), int(row[3])) for menu_id, row in rows.items()}
test_case.assertEqual(EXPECTED_TOP_LEVEL_MENU_POSITIONS, actual_positions)
stable_indexes = (1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
actual_stable_fields = {menu_id: tuple(row[index] for index in stable_indexes) for menu_id, row in rows.items()}
test_case.assertEqual(EXPECTED_TOP_LEVEL_MENU_STABLE_FIELDS, actual_stable_fields)
def _assert_business_menu_fields( def _assert_business_menu_fields(
test_case: unittest.TestCase, test_case: unittest.TestCase,
sql: str, sql: str,
@@ -1002,9 +1019,27 @@ class SqlContractTest(unittest.TestCase):
for filename in INITIALIZERS: for filename in INITIALIZERS:
with self.subTest(filename=filename): with self.subTest(filename=filename):
sql = (SQL_ROOT / filename).read_text(encoding='utf-8') sql = (SQL_ROOT / filename).read_text(encoding='utf-8')
rows = _menu_rows(sql, MENU_PROMOTION_IDS) _assert_top_level_menu_fields(self, sql)
actual = {menu_id: (row[1], int(row[2]), int(row[3])) for menu_id, row in rows.items()}
self.assertEqual(EXPECTED_TOP_LEVEL_MENU_POSITIONS, actual) def test_top_level_menu_contract_rejects_same_stable_field_drift_in_both_initializers(self) -> None:
mutations = (
(1, '系统管理', 'system', 'driftSystemIcon'),
(121, '基础资料维护', '#', 'driftBusinessIcon'),
)
for filename in INITIALIZERS:
sql = (SQL_ROOT / filename).read_text(encoding='utf-8')
for menu_id, menu_name, original_icon, drifted_icon in mutations:
with self.subTest(filename=filename, menu_id=menu_id):
mutated, replacements = re.subn(
rf"(\(?\s*'?{menu_id}'?\s*,\s*'{menu_name}'.*?,\s*)'{re.escape(original_icon)}'"
r"(\s*,\s*'admin')",
rf"\1'{drifted_icon}'\2",
sql,
count=1,
)
self.assertEqual(1, replacements)
with self.assertRaises(AssertionError):
_assert_top_level_menu_fields(self, mutated)
def test_business_permission_inventory_rejects_duplicate_permission(self) -> None: def test_business_permission_inventory_rejects_duplicate_permission(self) -> None:
sql = (SQL_ROOT / INITIALIZERS[0]).read_text(encoding='utf-8') sql = (SQL_ROOT / INITIALIZERS[0]).read_text(encoding='utf-8')