76 lines
3.4 KiB
JavaScript
76 lines
3.4 KiB
JavaScript
import fs from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
|
|
import { verifyPrismaBaseline } from "./verify-prisma-baseline.mjs";
|
|
|
|
const fixtures = [];
|
|
|
|
function copyBaselineFixture() {
|
|
const fixture = fs.mkdtempSync(path.join(os.tmpdir(), "hivegrid-prisma-baseline-"));
|
|
fixtures.push(fixture);
|
|
fs.mkdirSync(path.join(fixture, "prisma"), { recursive: true });
|
|
fs.cpSync(path.join(process.cwd(), "prisma/migrations"), path.join(fixture, "prisma/migrations"), { recursive: true });
|
|
fs.copyFileSync(path.join(process.cwd(), "prisma/baseline-legacy-manifest.json"), path.join(fixture, "prisma/baseline-legacy-manifest.json"));
|
|
fs.copyFileSync(path.join(process.cwd(), "prisma/baseline-legacy-migrations.tar.gz"), path.join(fixture, "prisma/baseline-legacy-migrations.tar.gz"));
|
|
return fixture;
|
|
}
|
|
|
|
afterEach(() => {
|
|
while (fixtures.length > 0) fs.rmSync(fixtures.pop(), { recursive: true, force: true });
|
|
});
|
|
|
|
describe("verifyPrismaBaseline", () => {
|
|
it("accepts the committed consolidated baseline", () => {
|
|
expect(verifyPrismaBaseline(process.cwd()).failures).toEqual([]);
|
|
});
|
|
|
|
it("fails when the active baseline no longer matches the adoption manifest", () => {
|
|
const fixture = copyBaselineFixture();
|
|
fs.appendFileSync(path.join(fixture, "prisma/migrations/00000000000000_hivegrid_baseline/migration.sql"), "\n-- changed\n");
|
|
|
|
expect(verifyPrismaBaseline(fixture).failures).toContain(
|
|
"baseline checksum, audit archive, migration name, or source revision differs from the legacy manifest"
|
|
);
|
|
});
|
|
|
|
it("fails when the legacy audit archive no longer matches the adoption manifest", () => {
|
|
const fixture = copyBaselineFixture();
|
|
fs.appendFileSync(path.join(fixture, "prisma/baseline-legacy-migrations.tar.gz"), "changed");
|
|
|
|
expect(verifyPrismaBaseline(fixture).failures).toContain(
|
|
"baseline checksum, audit archive, migration name, or source revision differs from the legacy manifest"
|
|
);
|
|
});
|
|
|
|
it("fails when a reviewed historical checksum variant is not pinned to a source revision", () => {
|
|
const fixture = copyBaselineFixture();
|
|
const manifestPath = path.join(fixture, "prisma/baseline-legacy-manifest.json");
|
|
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
|
|
delete manifest.legacyChecksumVariants[0].sourceCommit;
|
|
fs.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
|
|
expect(verifyPrismaBaseline(fixture).failures).toContain(
|
|
"legacy adoption manifest must pin exactly 10 unique reviewed checksum variants with source revisions"
|
|
);
|
|
});
|
|
|
|
it("accepts later forward-only migrations after the baseline", () => {
|
|
const fixture = copyBaselineFixture();
|
|
fs.mkdirSync(path.join(fixture, "prisma/migrations/20260723000000_unreviewed"));
|
|
fs.writeFileSync(path.join(fixture, "prisma/migrations/20260723000000_unreviewed/migration.sql"), "SELECT 1;\n");
|
|
|
|
expect(verifyPrismaBaseline(fixture).failures).toEqual([]);
|
|
});
|
|
|
|
it("fails when a migration sorts before the baseline", () => {
|
|
const fixture = copyBaselineFixture();
|
|
fs.mkdirSync(path.join(fixture, "prisma/migrations/00000000000000_aaa"), { recursive: true });
|
|
fs.writeFileSync(path.join(fixture, "prisma/migrations/00000000000000_aaa/migration.sql"), "SELECT 1;\n");
|
|
|
|
expect(verifyPrismaBaseline(fixture).failures).toContain("active Prisma history must start with 00000000000000_hivegrid_baseline");
|
|
});
|
|
});
|