import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import { describe, it } from "vitest"; import { findMissingTestFiles, formatMissingTestFiles, gateLabel, testFiles, vitestArgs, } from "./verify-permission-matrix.mjs"; const packageJson = JSON.parse(readFileSync("package.json", "utf8")); describe("verify-permission-matrix", () => { it("defines the S05 permission matrix Vitest gate without E2E commands", () => { assert.equal(gateLabel, "Permissions Audit S05 permission matrix"); assert.deepEqual(testFiles, [ "apps/web/app/utils/services/rolesAndPermissionsService.role-matrix.test.ts", "apps/web/app/routes/admin/audit-trails.test.tsx", "apps/web/app/routes/app.$tenant/settings/logs/index.test.tsx", "apps/web/app/routes/app.$tenant/settings/logs/events.test.tsx", "apps/web/app/routes/app.$tenant/settings/logs/events.$id.test.tsx", ]); assert.deepEqual(vitestArgs(), ["exec", "vitest", "run", ...testFiles]); const commandText = vitestArgs().join(" "); assert.doesNotMatch(commandText, /playwright/i); assert.doesNotMatch(commandText, /cypress/i); assert.doesNotMatch(commandText, /test:e2e/i); }); it("fails fast when a required test file is missing", async () => { const missingFiles = await findMissingTestFiles(["apps/web/app/routes/not-a-real-audit-permission.test.tsx"]); assert.deepEqual(missingFiles, ["apps/web/app/routes/not-a-real-audit-permission.test.tsx"]); assert.match(formatMissingTestFiles(missingFiles), /^Permissions Audit S05 permission matrix: missing required test file/); assert.match(formatMissingTestFiles(missingFiles), /not-a-real-audit-permission\.test\.tsx/); }); it("registers the package script for the permission matrix gate", () => { assert.equal(packageJson.scripts["verify:permission-matrix"], "node scripts/verify-permission-matrix.mjs"); }); });