from __future__ import annotations import io import json import subprocess from pathlib import Path import pytest from gyxx_flow.catalog import WorkflowCatalog from gyxx_flow.cli import EXIT_SUCCESS, build_default_registry, main from gyxx_flow.core.config import Settings PROJECT_ROOT = Path(__file__).resolve().parents[1] MODULE_SOURCE_ROOT = PROJECT_ROOT / "src" / "gyxx_flow" / "modules" def test_workflow_catalog_uses_native_execution_schema() -> None: payload = json.loads( (PROJECT_ROOT / "config" / "workflows.json").read_text(encoding="utf-8") ) assert payload["schema_version"] == 2 for workflow in payload["workflows"]: assert "legacy" not in workflow assert set(workflow["execution"]) >= {"entry"} def test_every_available_workflow_entry_exists_inside_its_new_module() -> None: catalog = WorkflowCatalog.load(PROJECT_ROOT / "config") missing: list[str] = [] for workflow in catalog.workflows: if workflow.trigger == "unavailable": continue entry = MODULE_SOURCE_ROOT / workflow.module / "runtime" / workflow.entry if not entry.is_file(): missing.append(f"{workflow.workflow_id}: {entry}") assert missing == [] def test_runtime_catalog_does_not_require_old_project_roots() -> None: source = (PROJECT_ROOT / "config" / "workflows.json").read_text(encoding="utf-8") assert "GYXX_LEGACY_" not in source assert "D:\\yingxiaoyunying" not in source assert "D:\\shop-data-flow" not in source assert "D:\\product-collector-analyze-flow" not in source assert "E:\\auto-flow" not in source def test_all_registered_workflows_dry_run_without_old_roots_or_processes( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: for name in ( "GYXX_LEGACY_CONTENT_ROOT", "GYXX_LEGACY_SHOP_ROOT", "GYXX_LEGACY_PRODUCT_ROOT", "GYXX_LEGACY_SUPPLY_ROOT", ): monkeypatch.delenv(name, raising=False) def fail_process(*args: object, **kwargs: object) -> object: raise AssertionError("dry-run must not start a module script") monkeypatch.setattr(subprocess, "run", fail_process) settings = Settings(project_root=PROJECT_ROOT, data_root=tmp_path) registry = build_default_registry(settings) for workflow_id in registry.catalog.workflows: if not registry.is_registered(workflow_id.workflow_id): continue output = io.StringIO() exit_code = main( ["run", workflow_id.workflow_id, "--date", "2026-07-27"], registry=registry, settings=settings, stdout=output, ) assert exit_code == EXIT_SUCCESS, workflow_id.workflow_id assert json.loads(output.getvalue())["dry_run"] is True