| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import re
- from pathlib import Path
- ROOT = Path(__file__).resolve().parents[1]
- ROUTES = ROOT / "frontend/src/router/routes.js"
- def _route_block(source: str, *, indent: int, name: str) -> str:
- """Return one route object, scoped to its direct indentation level."""
- start_token = "\n" + " " * indent + "{\n"
- name_token = " " * (indent + 2) + f"name: '{name}'"
- assert source.count(name_token) == 1, f"route {name!r} must be unique"
- name_at = source.index(name_token)
- start = source.rfind(start_token, 0, name_at)
- if start >= 0:
- start += 1
- elif source.startswith(start_token[1:]):
- start = 0
- terminators = [
- "\n" + " " * indent + "},",
- "\n" + " " * indent + "}",
- ]
- ends = [(source.find(token, name_at), token) for token in terminators]
- valid_ends = [(end, token) for end, token in ends if end >= 0]
- assert start >= 0 and valid_ends, f"route {name!r} block boundaries not found"
- end, end_token = min(valid_ends)
- return source[start : end + len(end_token)]
- def _assert_exact_line(block: str, *, indent: int, field: str, value: str) -> None:
- expected = " " * indent + f"{field}: {value}"
- assert re.search(rf"(?m)^{re.escape(expected)},?$", block), f"missing exact line: {expected}"
- def _assert_inline_meta_permission(route: str, *, indent: int, permission: str) -> None:
- marker = " " * indent + "meta: { permissions: ["
- match = re.search(rf"(?m)^{re.escape(marker)}([^\]]*)\]", route)
- assert match, "route meta permissions array not found"
- assert match.group(1).strip() == f"'{permission}'", (
- f"permissions must be exactly ['{permission}']"
- )
- def _direct_child_names(parent_route: str, *, child_indent: int) -> list[str]:
- return re.findall(
- rf"(?m)^{re.escape(' ' * (child_indent + 2))}name: '([^']+)'",
- parent_route,
- )
- def test_enterprise_connectors_are_owned_only_by_data_factory():
- routes = ROUTES.read_text(encoding="utf-8")
- data_research = _route_block(routes, indent=4, name="data-governance")
- data_factory = _route_block(routes, indent=4, name="dataFactory")
- assert routes.count("name: 'enterpriseConnectors'") == 1
- assert "enterpriseConnectors" not in data_research
- assert "path: '/data-governance/development/enterprise-connectors'" not in data_research
- assert "component: 'dataGovernance/development/enterpriseConnectors'" not in data_research
- connector = _route_block(data_factory, indent=8, name="enterpriseConnectors")
- for field, value in [
- ("icon", "'mdi-connection'"),
- ("title", "'企业连接器'"),
- ("path", "'/data-governance/development/enterprise-connectors'"),
- ("children", "[]"),
- ("label", "'企业连接器'"),
- ("sort", "4"),
- ("component", "'dataGovernance/development/enterpriseConnectors'"),
- ("name", "'enterpriseConnectors'"),
- ]:
- _assert_exact_line(connector, indent=10, field=field, value=value)
- _assert_inline_meta_permission(connector, indent=10, permission="connectors:read")
- def test_data_factory_connector_and_orchestration_navigation_order_is_stable():
- routes = ROUTES.read_text(encoding="utf-8")
- data_factory = _route_block(routes, indent=4, name="dataFactory")
- names = [
- "enterpriseConnectors",
- "productionLineDeployment",
- "productionLine",
- "workflowIndex",
- "dataObservability",
- "connectionPoolIndex",
- ]
- child_blocks = [_route_block(data_factory, indent=8, name=name) for name in names]
- child_names = _direct_child_names(data_factory, child_indent=8)
- connector_index = child_names.index("enterpriseConnectors")
- deployment_index = child_names.index("productionLineDeployment")
- assert deployment_index == connector_index + 1
- assert child_names[connector_index : child_names.index("connectionPoolIndex") + 1] == names
- assert [re.search(r"(?m)^\s+name: '([^']+)'", block).group(1) for block in child_blocks] == names
|