mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-11 14:00:29 +00:00
9e39ffc920
Contract-Neutral: mobile compatibility generation does not change agent lifecycle or storage recovery contracts
50 lines
1.7 KiB
Python
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()
|