Files
gyxx-flow/tests/test_runtime_output_boundaries.py
T

48 lines
1.7 KiB
Python

from __future__ import annotations
from pathlib import Path
import pytest
PROJECT_ROOT = Path(__file__).resolve().parents[1]
MODULE_ROOT = PROJECT_ROOT / "src" / "gyxx_flow" / "modules"
@pytest.mark.parametrize(
("module", "forbidden"),
[
("content_marketing", 'Path("data") / "v2_results"'),
("product_commerce", 'Path("data/logs")'),
("product_commerce", 'SCRIPT_DIR / "data"'),
("product_commerce", 'PROJECT_ROOT / "debug"'),
("product_commerce", "relative_to(PROJECT_ROOT)"),
("shop_intelligence", 'os.path.join(os.getcwd(), "debug"'),
("supply_chain", 'PACKAGE_ROOT / "shared-data"'),
("supply_chain", "~/Downloads/停产产品.xlsx"),
],
)
def test_migrated_runtimes_have_no_known_mutable_output_bypasses(
module: str, forbidden: str
) -> None:
offenders = []
for path in (MODULE_ROOT / module).rglob("*.py"):
source = path.read_text(encoding="utf-8-sig")
if forbidden in source:
offenders.append(path.relative_to(PROJECT_ROOT).as_posix())
assert offenders == [], f"{forbidden!r} bypasses the canonical data boundary"
def test_runtime_path_modules_do_not_use_source_local_data_fallbacks() -> None:
path_files = [
MODULE_ROOT / "content_marketing" / "runtime_paths.py",
MODULE_ROOT / "product_commerce" / "runtime_paths.py",
MODULE_ROOT / "shop_intelligence" / "paths.py",
MODULE_ROOT / "supply_chain" / "paths.py",
]
forbidden = ('MODULE_ROOT / ".runtime-data"', 'module_root / "var"', 'PROJECT_ROOT / "data"')
for path in path_files:
source = path.read_text(encoding="utf-8-sig")
assert not any(pattern in source for pattern in forbidden), path