Files
pulse/scripts/release_control/generate_mobile_compatibility_test.py
T
rcourtman 9e39ffc920 Enforce Pulse Mobile compatibility from the core contract
Contract-Neutral: mobile compatibility generation does not change agent lifecycle or storage recovery contracts
2026-07-22 13:41:09 +01:00

50 lines
1.7 KiB
Python

#!/usr/bin/env python3
"""Unit tests for the canonical Pulse Mobile contract generator."""
from __future__ import annotations
import copy
import unittest
from generate_mobile_compatibility import (
ManifestError,
REPO_ROOT,
generated_outputs,
load_manifest,
validate_manifest,
)
class MobileCompatibilityGeneratorTest(unittest.TestCase):
def setUp(self) -> None:
self.manifest, _ = load_manifest(REPO_ROOT)
def test_manifest_renders_backend_projections(self) -> None:
outputs = generated_outputs(REPO_ROOT, None)
rendered = "\n".join(outputs.values())
self.assertIn("relayMobileRouteAttentionList", rendered)
self.assertIn("PushActionDecideAction", rendered)
self.assertIn('onboardingSchemaVersion = "pulse-mobile-onboarding-v1"', rendered)
def test_duplicate_route_ids_fail_closed(self) -> None:
payload = copy.deepcopy(self.manifest)
payload["routes"][1]["id"] = payload["routes"][0]["id"]
with self.assertRaisesRegex(ManifestError, "duplicate route id"):
validate_manifest(payload)
def test_unknown_scope_fails_closed(self) -> None:
payload = copy.deepcopy(self.manifest)
payload["routes"][0]["required_scope"] = "mobile:anything"
with self.assertRaisesRegex(ManifestError, "unsupported scope"):
validate_manifest(payload)
def test_invalid_mobile_impact_fails_closed(self) -> None:
payload = copy.deepcopy(self.manifest)
payload["routes"][0]["mobile_impact"] = "maybe-mobile"
with self.assertRaisesRegex(ManifestError, "invalid mobile_impact"):
validate_manifest(payload)
if __name__ == "__main__":
unittest.main()