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) class CRMStandardFormulaFunctionBundlesTest(unittest.TestCase): def test_crm_formula_bundle_is_manifest_owned(self): manifest = load_json(CRM_PACK / "pack.json") components = manifest["components"] formula_components = [ component for component in components if component.get("kind") == "formula_function_bundle" ] self.assertEqual( formula_components, [ { "kind": "formula_function_bundle", "businessKey": "crm_formula_functions", "manageability": "locked", "path": "formula_functions/crm_formula_functions.json", } ], ) self.assertLess( components.index(formula_components[0]), next( index for index, component in enumerate(components) if component.get("kind") == "object_spec" and component.get("businessKey") == "standard_objects_spec:crm" ), ) def test_crm_formula_function_bundle_shape(self): bundle = load_json( CRM_PACK / "formula_functions" / "crm_formula_functions.json" ) functions = { function["name"]: function for function in bundle["functions"] } self.assertEqual( set(functions), { "INCLUDES", "ISPICKVAL", "HYPERLINK", "CASESAFEID", "IMAGE", "ADDMONTHS", }, ) function = functions["INCLUDES"] self.assertEqual(function["name"], "INCLUDES") self.assertEqual(function["minArgs"], 2) self.assertEqual(function["maxArgs"], 2) self.assertEqual(function["return"], {"kind": "fixed", "type": "boolean"}) self.assertEqual( function["args"], [ {"type": "string", "nullable": True}, {"type": "string", "nullable": True}, ], ) self.assertEqual( function["evaluator"], { "kind": "formula_expr_v1", "params": ["field", "value"], "body": "INCLUDES(field, value)", }, ) function = functions["ISPICKVAL"] self.assertEqual(function["name"], "ISPICKVAL") self.assertEqual(function["minArgs"], 2) self.assertEqual(function["maxArgs"], 2) self.assertEqual(function["return"], {"kind": "fixed", "type": "boolean"}) self.assertEqual( function["args"], [ {"type": "string", "nullable": True}, {"type": "string", "nullable": True}, ], ) self.assertEqual( function["evaluator"], { "kind": "formula_expr_v1", "params": ["field", "value"], "body": 'BLANKVALUE(field, "") == BLANKVALUE(value, "")', }, ) function = functions["HYPERLINK"] self.assertEqual(function["name"], "HYPERLINK") self.assertEqual(function["minArgs"], 2) self.assertEqual(function["maxArgs"], 3) self.assertEqual(function["return"], {"kind": "fixed", "type": "string"}) self.assertEqual( function["evaluator"], { "kind": "formula_expr_v1", "params": ["url", "friendlyName"], "body": "friendlyName", }, ) function = functions["CASESAFEID"] self.assertEqual(function["name"], "CASESAFEID") self.assertEqual(function["minArgs"], 1) self.assertEqual(function["maxArgs"], 1) self.assertEqual(function["return"], {"kind": "fixed", "type": "string"}) self.assertEqual(function["args"], [{"type": "string", "nullable": True}]) self.assertEqual(function["evaluator"]["kind"], "formula_expr_v1") self.assertEqual(function["evaluator"]["params"], ["arg0"]) self.assertIn("LEN(arg0) == 15", function["evaluator"]["body"]) function = functions["IMAGE"] self.assertEqual(function["name"], "IMAGE") self.assertEqual(function["minArgs"], 2) self.assertEqual(function["maxArgs"], 4) self.assertEqual(function["return"], {"kind": "fixed", "type": "string"}) self.assertEqual(function["args"], [{"type": "string", "nullable": True}]) self.assertEqual( function["evaluator"], { "kind": "formula_expr_v1", "params": ["arg0", "arg1"], "body": "arg0", }, ) function = functions["ADDMONTHS"] self.assertEqual(function["name"], "ADDMONTHS") self.assertEqual(function["minArgs"], 2) self.assertEqual(function["maxArgs"], 2) self.assertEqual(function["return"], {"kind": "fixed", "type": "date"}) self.assertEqual( function["args"], [ {"dateLikeLiteral": True}, {"type": "number"}, ], ) self.assertEqual( function["evaluator"], { "kind": "formula_expr_v1", "params": ["arg0", "arg1"], "body": "__DATE_ADD_MONTHS__(arg0, arg1)", }, ) if __name__ == "__main__": unittest.main()