import json import unittest from pathlib import Path REPO_ROOT = Path(__file__).resolve().parents[1] CRM_PACK = REPO_ROOT / "salesforce-crm-standard" def load_json(path: Path): with path.open(encoding="utf-8") as handle: return json.load(handle) def object_spec(api_name: str): specs = load_json(CRM_PACK / "objects" / "standard_objects_spec.json") return next(spec for spec in specs if spec["apiName"] == api_name) def relationships_by_field(api_name: str): spec = object_spec(api_name) return {rel["fieldApiName"]: rel for rel in spec.get("managedRelationships", [])} class ManagedRelationshipSemanticsTest(unittest.TestCase): def test_campaign_member_relationships_cover_formula_joins(self): rels = relationships_by_field("CampaignMember") self.assertEqual(set(rels), {"CampaignId", "LeadId", "ContactId"}) self.assertTrue(rels["CampaignId"]["isSharingParent"]) self.assertFalse(rels["LeadId"]["isSharingParent"]) self.assertFalse(rels["ContactId"]["isSharingParent"]) self.assertTrue(all(rel["cascadeDelete"] is False for rel in rels.values())) def test_opportunity_lookup_relationships_are_non_sharing(self): rels = relationships_by_field("Opportunity") self.assertEqual(set(rels), {"AccountId", "CampaignId"}) self.assertTrue(all(rel["isSharingParent"] is False for rel in rels.values())) self.assertTrue(all(rel["cascadeDelete"] is False for rel in rels.values())) def test_quote_inherits_sharing_from_opportunity(self): spec = object_spec("Quote") rels = relationships_by_field("Quote") self.assertEqual(spec["sharingModel"], "ControlledByParent") self.assertEqual(set(rels), {"AccountId", "OpportunityId", "ContractId", "ContactId"}) sharing_parents = {field for field, rel in rels.items() if rel["isSharingParent"]} self.assertEqual(sharing_parents, {"OpportunityId"}) self.assertTrue(all(rel["cascadeDelete"] is False for rel in rels.values())) def test_order_relationships_are_lookup_only(self): spec = object_spec("Order") rels = relationships_by_field("Order") self.assertEqual(spec["sharingModel"], "Private") self.assertEqual(set(rels), {"AccountId", "ContractId", "OpportunityId", "QuoteId"}) self.assertTrue(all(rel["isSharingParent"] is False for rel in rels.values())) self.assertTrue(all(rel["cascadeDelete"] is False for rel in rels.values())) def test_contract_account_relationship_stays_non_cascading(self): rels = relationships_by_field("Contract") self.assertIn("AccountId", rels) self.assertTrue(rels["AccountId"]["isSharingParent"]) self.assertFalse(rels["AccountId"]["cascadeDelete"]) if __name__ == "__main__": unittest.main()