Files
ecm_sync_system/tests/unit/test_strategy_dependency_helpers.py
T
strepsiades 4a9c444b10 first commit
2026-03-09 16:31:42 +08:00

86 lines
2.6 KiB
Python

from __future__ import annotations
from sync_state_machine.common.types import BindingStatus, SyncStatus
from sync_state_machine.sync_system.strategy_ops.bind_ops import (
check_dependency_satisfied,
collect_dependency_errors,
)
from tests.fixtures.mock_domain import (
TestProjectNode as ProjectNode,
)
def _normal_dep_node(*, data_id: str = "dep-1") -> ProjectNode:
return ProjectNode(
node_id="dep-node",
data_id=data_id,
data={"id": data_id or "", "name": "dep", "code": "DEP"},
binding_status=BindingStatus.NORMAL,
status=SyncStatus.PENDING,
)
def test_check_dependency_satisfied_allows_empty_ref_by_default() -> None:
ok = check_dependency_satisfied(
dependency_nodes=[None],
field_values=[""],
)
assert ok is True
def test_check_dependency_satisfied_blocks_empty_ref_when_strict() -> None:
ok = check_dependency_satisfied(
dependency_nodes=[None],
field_values=[""],
allow_empty_dependency_ref=False,
)
assert ok is False
def test_check_dependency_satisfied_missing_dep_data_id_strict_mode() -> None:
node = _normal_dep_node(data_id="")
loose = check_dependency_satisfied(
dependency_nodes=[node],
field_values=["P-1"],
allow_missing_dep_data_id=True,
)
strict = check_dependency_satisfied(
dependency_nodes=[node],
field_values=["P-1"],
allow_missing_dep_data_id=False,
)
assert loose is True
assert strict is False
def test_collect_dependency_errors_covers_not_found_bad_status_and_no_data_id() -> None:
bad_status_node = ProjectNode(
node_id="dep-bad-status",
data_id="dep-2",
data={"id": "dep-2", "name": "dep2", "code": "DEP2"},
binding_status=BindingStatus.WARNING,
status=SyncStatus.PENDING,
)
no_data_id_node = ProjectNode(
node_id="dep-no-id",
data_id="",
data={"id": "", "name": "dep3", "code": "DEP3"},
binding_status=BindingStatus.NORMAL,
status=SyncStatus.SUCCESS,
)
errors = collect_dependency_errors(
dependency_nodes=[None, bad_status_node, no_data_id_node],
field_names=["project_ref", "supplier_ref", "company_ref"],
field_types=["project", "supplier", "company"],
field_values=["P-404", "S-1", "C-1"],
allow_empty_dependency_ref=False,
allow_missing_dep_data_id=False,
)
assert errors == [
"not_found|project_ref|project|P-404",
"bad_status|supplier_ref|warning",
"no_data_id|company_ref|status=SUCCESS",
]