from __future__ import annotations import pytest from backend.tests.test_mcp_hub_governed_topology import _legacy_target, _load_controller LEGACY_SOURCE = "/srv/example/appdata/itworx-mcp-hub/deployment/repository" def observed_legacy_target(controller): project = _legacy_target(controller) project.pop("exact_source") project.pop("verify_oci_revision") project["source_dir"] = LEGACY_SOURCE project["compose_dir"] = "infrastructure/compose" project["compose_files"] = list(controller.MCP_HUB_COMPOSE_FILES[:3]) project["env_source"] = "/srv/example/appdata/itworx-mcp-hub/deploy.env" return project @pytest.mark.parametrize("legacy", [False, True]) def test_observed_hub_legacy_source_is_only_normalized_in_memory(legacy): controller = _load_controller() project = observed_legacy_target(controller) if legacy else _legacy_target(controller) canonical = (controller.EXACT_SOURCE_ROOT / "itworx-mcp-hub").as_posix() original = LEGACY_SOURCE if legacy else canonical project["source_dir"] = original effective = controller.effective_mcp_hub_project(controller.MCP_HUB_REPOSITORY, project) assert effective["source_dir"] == canonical assert project["source_dir"] == original assert effective["containers"] == list(controller.MCP_HUB_CONTAINERS) assert effective["compose_files"] == list(controller.MCP_HUB_COMPOSE_FILES) assert effective["_mcp_hub_contract"] == controller.MCP_HUB_TOPOLOGY_CONTRACT def test_observed_legacy_registry_omissions_are_upgraded_only_in_memory(): controller = _load_controller() project = observed_legacy_target(controller) effective = controller.effective_mcp_hub_project(controller.MCP_HUB_REPOSITORY, project) assert effective["exact_source"] is True assert effective["verify_oci_revision"] is True assert "exact_source" not in project assert "verify_oci_revision" not in project @pytest.mark.parametrize( "field,value", [ ("source_dir", "/mnt/cache/appdata/gitea-deploy-runners/sources/itworx-mcp-hub"), ("compose_dir", "."), ("compose_files", ["other.yml"]), ("env_source", "/tmp/deploy.env"), ("exact_source", None), ("exact_source", False), ("exact_source", True), ("verify_oci_revision", None), ("verify_oci_revision", False), ("verify_oci_revision", True), ("clean_untracked_paths", None), ("clean_untracked_paths", False), ("clean_untracked_paths", []), ("clean_untracked_paths", ["local.env"]), ], ) def test_legacy_registry_omissions_do_not_widen_other_target_shapes(field, value): controller = _load_controller() project = observed_legacy_target(controller) project[field] = value with pytest.raises(controller.DeployError, match="exact legacy 15-container contract"): controller.effective_mcp_hub_project(controller.MCP_HUB_REPOSITORY, project) @pytest.mark.parametrize("field", ["exact_source", "verify_oci_revision"]) def test_fully_declared_legacy_target_rejects_explicit_false_verification(field): controller = _load_controller() project = observed_legacy_target(controller) project[field] = False with pytest.raises(controller.DeployError, match="exact legacy 15-container contract"): controller.effective_mcp_hub_project(controller.MCP_HUB_REPOSITORY, project) @pytest.mark.parametrize( "source", [ None, True, {}, LEGACY_SOURCE + "/", LEGACY_SOURCE + "/../repository", "/mnt/cache/appdata/itworx-mcp-hub/deployment/repository", "/srv/example/appdata/another-hub/deployment/repository", "/tmp/repository", ], ) def test_hub_legacy_source_compatibility_rejects_other_spellings_and_types(source): controller = _load_controller() project = _legacy_target(controller) project["source_dir"] = source with pytest.raises(controller.DeployError, match="exact legacy 15-container contract"): controller.effective_mcp_hub_project(controller.MCP_HUB_REPOSITORY, project)