83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
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
|