import json import re import subprocess import unittest from pathlib import Path REPO_ROOT = Path(__file__).resolve().parents[1] SOURCE_INDEX_PATH = REPO_ROOT / "frontend" / "source-index.json" CRM_FRONTEND = REPO_ROOT / "salesforce-crm-standard" / "frontend" MANIFEST_PATH = CRM_FRONTEND / "source-manifest.json" FRONTEND_MANIFESTS = [ CRM_FRONTEND / "source-manifest.json", ] FORBIDDEN_GENERATED_ARTIFACTS = { "generated-api.ts", "generated-schema.ts", "generated-error-codes.ts", } TEST_CASE_PATTERN = re.compile( r"\b(?:it|test)\s*\(\s*(?:'((?:\\.|[^'\\])*)'|\"((?:\\.|[^\"\\])*)\"|`((?:\\.|[^`\\])*)`)", re.DOTALL, ) def load_json(path: Path): with path.open(encoding="utf-8") as handle: return json.load(handle) def run_frontend_npm_script(script: str): return subprocess.run( ["npm", "--prefix", "frontend", "run", script], cwd=REPO_ROOT, check=False, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) def declared_test_cases(source: str): cases = set() for match in TEST_CASE_PATTERN.finditer(source): case = next(group for group in match.groups() if group is not None) cases.add(case.replace("\\'", "'").replace('\\"', '"').replace("\\`", "`")) return cases class FrontendSourceSupplyTest(unittest.TestCase): def test_frontend_source_index_declares_app_owned_manifests(self): source_index = load_json(SOURCE_INDEX_PATH) self.assertEqual(source_index["schemaVersion"], "nexuscrm.appPacksFrontendSourceIndex.v1") self.assertEqual(source_index["owner"], "nexuscrm-app-packs") indexed = { (entry["pack"], entry["manifest"]) for entry in source_index["appFrontendManifests"] } self.assertEqual( indexed, {("salesforce-crm-standard", "salesforce-crm-standard/frontend/source-manifest.json")}, ) for pack, manifest_path in indexed: with self.subTest(pack=pack): manifest = load_json(REPO_ROOT / manifest_path) self.assertEqual(manifest["pack"], pack) def test_crm_frontend_source_manifest_defines_shape_1_supply(self): manifest = load_json(MANIFEST_PATH) self.assertEqual(manifest["schemaVersion"], "nexuscrm.frontendSource.v1") self.assertEqual(manifest["pack"], "salesforce-crm-standard") self.assertEqual(manifest["sourceKind"], "trusted-shape-1-crm-frontend") self.assertIn("src", manifest["sourceRoots"]) self.assertEqual(manifest["hostSdk"]["contract"], "app-blind") self.assertEqual( manifest["hostSdk"]["publicImportSurface"], "frontend/app-source-public-import-surface.json", ) self.assertEqual( manifest["hostSdk"]["boundaryCheck"], "npm run check:l0-sdk-boundary", ) self.assertEqual( manifest["metadataRecordRenderer"]["phase2DefaultOwner"], "crm-l1", ) def test_declared_crm_frontend_source_roots_exist(self): manifest = load_json(MANIFEST_PATH) for source_root in manifest["sourceRoots"]: with self.subTest(source_root=source_root): path = CRM_FRONTEND / source_root self.assertTrue(path.is_dir(), path) def test_frontend_manifests_define_structural_package_builds(self): for manifest_path in FRONTEND_MANIFESTS: with self.subTest(manifest=manifest_path.relative_to(REPO_ROOT).as_posix()): frontend_root = manifest_path.parent manifest = load_json(manifest_path) package_build = manifest["packageBuild"] self.assertEqual( package_build["proof"], "npm --prefix frontend run check:frontend-app-package-build", ) self.assertTrue((frontend_root / package_build["packageJson"]).is_file()) self.assertTrue((frontend_root / package_build["tsconfig"]).is_file()) self.assertGreater(len(package_build["entrypoints"]), 0) for entrypoint in package_build["entrypoints"]: self.assertTrue((frontend_root / entrypoint).is_file(), entrypoint) def test_declared_frontend_package_build_proof_runs(self): result = run_frontend_npm_script("check:frontend-app-package-build") self.assertEqual(result.returncode, 0, result.stdout + result.stderr) def test_manifest_required_source_cases_exist_in_the_owned_tests(self): manifest = load_json(MANIFEST_PATH) required_cases = manifest["sourceTests"]["requiredCases"] declared_files = set() for entry in required_cases: source_file = entry["file"] with self.subTest(source_file=source_file): self.assertTrue(source_file.startswith("source-tests/"), source_file) self.assertNotIn(source_file, declared_files) declared_files.add(source_file) source_path = CRM_FRONTEND / source_file self.assertTrue(source_path.is_file(), source_path) cases = entry["cases"] self.assertTrue(cases, source_file) self.assertEqual(len(cases), len(set(cases)), source_file) declared = declared_test_cases(source_path.read_text(encoding="utf-8")) for case in cases: self.assertIn(case, declared, f"{source_file}: {case}") def test_frontend_package_build_self_test_fails_closed(self): result = run_frontend_npm_script("check:frontend-app-package-build:self-test") self.assertEqual(result.returncode, 0, result.stdout + result.stderr) def test_crm_frontend_package_owns_first_l1_slice(self): package_json = load_json(CRM_FRONTEND / "package.json") self.assertEqual(package_json["name"], "@nexuscrm/salesforce-crm-standard-frontend") self.assertIn("./approval-recipient-types", package_json["exports"]) self.assertTrue((CRM_FRONTEND / "src" / "approval-recipient-types.ts").is_file()) def test_crm_frontend_package_owns_flow_type_contracts(self): package_json = load_json(CRM_FRONTEND / "package.json") manifest = load_json(MANIFEST_PATH) self.assertIn("./flow-types", package_json["exports"]) self.assertEqual(package_json["exports"]["./flow-types"], "./src/flow-types.ts") self.assertIn("src/flow-types.ts", manifest["packageBuild"]["entrypoints"]) self.assertTrue((CRM_FRONTEND / "src" / "flow-types.ts").is_file()) def test_filter_expression_helper_is_supplied_and_exported(self): package_json = load_json(CRM_FRONTEND / "package.json") manifest = load_json(MANIFEST_PATH) source_path = "src/platform/components/formula/filterExpression.ts" self.assertEqual( package_json["exports"]["./platform/components/formula/filterExpression"], f"./{source_path}", ) self.assertIn(source_path, manifest["packageBuild"]["entrypoints"]) self.assertTrue((CRM_FRONTEND / source_path).is_file()) def test_generated_frontend_artifacts_are_not_copied_into_app_pack_source(self): for manifest_path in FRONTEND_MANIFESTS: with self.subTest(manifest=manifest_path.relative_to(REPO_ROOT).as_posix()): frontend_root = manifest_path.parent manifest = load_json(manifest_path) policy = manifest["generatedArtifactPolicy"] self.assertEqual(policy["owner"], "nexuscrm-platform") self.assertEqual(policy["provisioning"], "from-platform-revision") self.assertEqual( policy["platformContractLock"], "frontend/app-generated-contract.lock.json", ) self.assertEqual(set(policy["forbidCopiedArtifacts"]), FORBIDDEN_GENERATED_ARTIFACTS) copied = [ path.relative_to(frontend_root).as_posix() for path in frontend_root.rglob("*") if path.is_file() and path.name in FORBIDDEN_GENERATED_ARTIFACTS ] self.assertEqual(copied, []) if __name__ == "__main__": unittest.main()