import json import unittest from pathlib import Path REPO_ROOT = Path(__file__).resolve().parents[1] CRM_PACK = REPO_ROOT / "salesforce-crm-standard" EXPECTED_FIELDS = [ "Product2Id", "PricebookEntryId", "Quantity", "UnitPrice", "ListPrice", "Discount", "TotalPrice", "ServiceDate", "Description", ] def load_json(path: Path): with path.open(encoding="utf-8") as handle: return json.load(handle) def object_spec(api_name: str): for spec in load_json(CRM_PACK / "objects" / "standard_objects_spec.json"): if spec.get("apiName") == api_name: return spec raise AssertionError(f"{api_name} object spec missing") def related_list_rule(key: str): payload = load_json(CRM_PACK / "related_lists" / "standard_related_list_rules.json") for rule in payload.get("rules", []): if rule.get("key") == key: return rule raise AssertionError(f"{key} related-list rule missing") def component(kind: str, business_key: str): for entry in load_json(CRM_PACK / "pack.json").get("components", []): if entry.get("kind") == kind and entry.get("businessKey") == business_key: return entry raise AssertionError(f"{kind}/{business_key} component missing") class OpportunityLineItemLayoutContractsTest(unittest.TestCase): def test_list_and_related_list_fields_prioritize_product_and_pricing(self): list_fields = load_json(CRM_PACK / "ux" / "standard_listfields.json") self.assertEqual(list_fields["OpportunityLineItem"], EXPECTED_FIELDS) related = related_list_rule("opportunity-line-items") self.assertEqual(related["childObjectApiName"], "OpportunityLineItem") self.assertEqual(related["lookupField"], "OpportunityId") self.assertEqual(related["fields"], EXPECTED_FIELDS) def test_curated_page_layout_surfaces_product_then_pricing(self): layout = load_json(CRM_PACK / "layouts" / "opportunity_line_item_page_layout.json") self.assertEqual(layout["objectApiName"], "OpportunityLineItem") self.assertTrue(layout["isDefault"]) self.assertEqual( layout["compactLayout"], ["Product2Id", "Quantity", "UnitPrice", "TotalPrice", "ServiceDate"], ) sections = {section["label"]: section["fields"] for section in layout["sections"]} self.assertEqual( sections["Product Information"], ["OpportunityId", "Product2Id", "PricebookEntryId"], ) self.assertEqual( sections["Pricing"], ["Quantity", "UnitPrice", "ListPrice", "Discount", "TotalPrice"], ) self.assertEqual(sections["Service Details"], ["ServiceDate", "Description"]) def test_layout_is_registered_in_pack_manifest(self): entry = component("page_layout", "OpportunityLineItem/default") self.assertEqual(entry["path"], "layouts/opportunity_line_item_page_layout.json") self.assertEqual(entry["manageability"], "defaults_only") def test_declared_layout_fields_exist_and_formula_fields_are_read_only(self): spec = object_spec("OpportunityLineItem") fields = {field["apiName"]: field for field in spec["fields"]} layout = load_json(CRM_PACK / "layouts" / "opportunity_line_item_page_layout.json") layout_fields = { field for section in layout["sections"] for field in section["fields"] } | set(layout["compactLayout"]) self.assertTrue(layout_fields.issubset(fields)) self.assertEqual(fields["TotalPrice"]["type"], "formula") self.assertFalse(fields["TotalPrice"]["createable"]) self.assertFalse(fields["TotalPrice"]["updateable"]) if __name__ == "__main__": unittest.main()