35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { analyzeMigrationSafety } from "../src/index.ts";
|
|
|
|
describe("expand and contract migration analysis", () => {
|
|
test("detects destructive and rollout-unsafe SQL with guidance", () => {
|
|
const issues = analyzeMigrationSafety({
|
|
name: "0002_breaking",
|
|
up: `ALTER TABLE users RENAME COLUMN name TO full_name;
|
|
ALTER TABLE users ADD COLUMN tenant_id UUID NOT NULL;
|
|
ALTER TABLE users ALTER COLUMN age TYPE BIGINT;
|
|
DROP TABLE legacy_users;
|
|
CREATE INDEX users_email_idx ON users(email);`,
|
|
down: "",
|
|
});
|
|
expect(issues.map((issue) => issue.code)).toEqual([
|
|
"WRN-DB-RENAME",
|
|
"WRN-DB-ADD-REQUIRED",
|
|
"WRN-DB-TYPE-CHANGE",
|
|
"WRN-DB-DROP-TABLE",
|
|
"WRN-DB-BLOCKING-INDEX",
|
|
]);
|
|
expect(issues.every((issue) => issue.recommendation.length > 20)).toBe(true);
|
|
});
|
|
|
|
test("accepts the additive phase of an expand/contract rollout", () => {
|
|
expect(
|
|
analyzeMigrationSafety({
|
|
name: "0002_expand",
|
|
up: "ALTER TABLE users ADD COLUMN full_name TEXT;",
|
|
down: "",
|
|
}),
|
|
).toEqual([]);
|
|
});
|
|
});
|