feat: consolidate legacy workflows into gyxx-flow
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
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
|
||||
Reference in New Issue
Block a user