diff --git a/tests/test_full_stack_contract.py b/tests/test_full_stack_contract.py new file mode 100644 index 0000000..f6a0dd4 --- /dev/null +++ b/tests/test_full_stack_contract.py @@ -0,0 +1,30 @@ +from pathlib import Path + +from a2a_pack.cli.local import load_local_project + + +ROOT = Path(__file__).resolve().parents[1] + + +def test_full_stack_product_contract(): + manifest = (ROOT / "a2a.yaml").read_text(encoding="utf-8") + source = (ROOT / "agent.py").read_text(encoding="utf-8") + frontend = (ROOT / "frontend" / "src" / "App.jsx").read_text(encoding="utf-8") + frontend_client = (ROOT / "frontend" / "src" / "a2a.js").read_text(encoding="utf-8") + + assert "frontend:" in manifest and "mount: /app" in manifest + assert "resources:" in manifest and "databases:" in manifest + assert "migrations:" in manifest and "db/migrations" in manifest + assert "PlatformUserAuth" in source + assert "AgentPlatformResources" in source and "AgentDatabase(" in source + assert "Skill runner" not in frontend, "replace the generic scaffold with the product workflow" + assert "unwrapInvokeResponse" in frontend_client, "unwrap the /invoke result envelope before rendering" + + migrations = list((ROOT / "db" / "migrations").glob("*.sql")) + assert migrations and all(path.read_text(encoding="utf-8").strip() for path in migrations) + + card = load_local_project(ROOT).agent_cls().card() + databases = card.runtime.platform_resources.databases + assert databases, "live Agent Card must declare its managed database" + assert databases[0].migrations is not None + assert databases[0].migrations.path == "db/migrations"