Pulse/scripts/release_control/mobile_compatibility_test.py

63 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Unit tests for provider/consumer Pulse Mobile compatibility checks."""
from __future__ import annotations
import copy
import unittest
from generate_mobile_compatibility import REPO_ROOT, load_manifest
from mobile_compatibility import compare_contracts, load_consumer
from repo_file_io import canonical_workspace_repos_root
MOBILE_REPO = canonical_workspace_repos_root(REPO_ROOT) / "pulse-mobile"
class MobileCompatibilityTest(unittest.TestCase):
def setUp(self) -> None:
if not (MOBILE_REPO / "config/mobile-api-surface.json").is_file():
self.skipTest(f"Pulse Mobile checkout not available at {MOBILE_REPO}")
self.provider, _ = load_manifest(REPO_ROOT)
self.consumer = load_consumer(MOBILE_REPO)
def test_checked_in_contracts_are_compatible(self) -> None:
self.assertEqual(compare_contracts(self.provider, self.consumer), [])
def test_removed_mobile_route_is_rejected(self) -> None:
provider = copy.deepcopy(self.provider)
provider["routes"] = [
route for route in provider["routes"] if route["id"] != "attention-list"
]
self.assertTrue(
any(
"removed mobile route 'attention-list'" in error
for error in compare_contracts(provider, self.consumer)
)
)
def test_response_field_type_change_is_rejected(self) -> None:
provider = copy.deepcopy(self.provider)
route = next(route for route in provider["routes"] if route["id"] == "attention-list")
field = next(field for field in route["response_fields"] if field["path"] == "data")
field["type"] = "object"
self.assertTrue(
any(
"field 'data' changed type" in error
for error in compare_contracts(provider, self.consumer)
)
)
def test_pairing_and_push_drift_are_rejected(self) -> None:
provider = copy.deepcopy(self.provider)
provider["pairing"]["host"] = "pair"
provider["push"]["actions"] = [
action for action in provider["push"]["actions"] if action["value"] != "decide_action"
]
errors = compare_contracts(provider, self.consumer)
self.assertTrue(any("pairing host" in error for error in errors))
self.assertTrue(any("removed action 'decide_action'" in error for error in errors))
if __name__ == "__main__":
unittest.main()