111 lines
4.3 KiB
TypeScript
111 lines
4.3 KiB
TypeScript
/**
|
|
* Characterization / snapshot test: migrationRunner.ts god-file decomposition.
|
|
*
|
|
* The static migration-compatibility data tables were extracted verbatim from
|
|
* src/lib/db/migrationRunner.ts into the pure-data leaf
|
|
* src/lib/db/migrationRunner/constants.ts (no imports, no DB, no behaviour).
|
|
*
|
|
* These tables drive the reconciliation / dedup / already-applied detection
|
|
* paths in runMigrations(). The existing db-migration-runner.test.ts proves the
|
|
* BEHAVIOUR is unchanged; this test PINS THE DATA so a bad move (a dropped row,
|
|
* a transposed version, a corrupted sentinel) is caught immediately — the data
|
|
* is the thing the move could silently break.
|
|
*
|
|
* Pure value assertions — no DB handle is opened.
|
|
*/
|
|
|
|
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
RENAMED_MIGRATION_COMPATIBILITY,
|
|
LEGACY_VERSION_SLOT_MIGRATIONS,
|
|
SUPERSEDED_DUPLICATE_MIGRATIONS,
|
|
PHYSICAL_SCHEMA_SENTINELS,
|
|
INITIAL_SCHEMA_SENTINELS,
|
|
OPTIONAL_FTS5_MIGRATION_VERSIONS,
|
|
} from "../../src/lib/db/migrationRunner/constants.ts";
|
|
|
|
// ── small tables — full snapshot ─────────────────────────────────────────────
|
|
|
|
describe("migrationRunner/constants — exact small-table snapshots", () => {
|
|
it("LEGACY_VERSION_SLOT_MIGRATIONS is the 9-entry list, in order", () => {
|
|
assert.deepEqual(
|
|
LEGACY_VERSION_SLOT_MIGRATIONS.map((m) => `${m.version}:${m.name}`),
|
|
[
|
|
"028:evals_tables",
|
|
"029:webhooks_templates",
|
|
"030:mcp_scopes_api_keys",
|
|
"031:api_keys_expires",
|
|
"032:detailed_logs_warnings",
|
|
"033:provider_connections_block_extra_usage",
|
|
"033:add_batch_id_to_call_logs",
|
|
"046:remove_status_from_files",
|
|
"051:remove_status_from_files",
|
|
]
|
|
);
|
|
});
|
|
|
|
it("SUPERSEDED_DUPLICATE_MIGRATIONS is the single 041→050 session_account_affinity entry", () => {
|
|
assert.deepEqual(SUPERSEDED_DUPLICATE_MIGRATIONS, [
|
|
{
|
|
version: "041",
|
|
name: "session_account_affinity",
|
|
supersededByVersion: "050",
|
|
supersededByName: "session_account_affinity",
|
|
},
|
|
]);
|
|
});
|
|
|
|
it("INITIAL_SCHEMA_SENTINELS pins the three baseline tables", () => {
|
|
assert.deepEqual(INITIAL_SCHEMA_SENTINELS, ["provider_connections", "combos", "call_logs"]);
|
|
});
|
|
|
|
it("OPTIONAL_FTS5_MIGRATION_VERSIONS is exactly {022, 023}", () => {
|
|
assert.ok(OPTIONAL_FTS5_MIGRATION_VERSIONS instanceof Set);
|
|
assert.deepEqual([...OPTIONAL_FTS5_MIGRATION_VERSIONS].sort(), ["022", "023"]);
|
|
});
|
|
});
|
|
|
|
// ── large tables — count + shape + spot-checks (corruption guard) ─────────────
|
|
|
|
describe("migrationRunner/constants — large-table integrity", () => {
|
|
it("RENAMED_MIGRATION_COMPATIBILITY has 10 well-formed entries", () => {
|
|
assert.equal(RENAMED_MIGRATION_COMPATIBILITY.length, 10);
|
|
for (const e of RENAMED_MIGRATION_COMPATIBILITY) {
|
|
assert.equal(typeof e.fromVersion, "string");
|
|
assert.equal(typeof e.fromName, "string");
|
|
assert.equal(typeof e.toVersion, "string");
|
|
assert.equal(typeof e.toName, "string");
|
|
}
|
|
});
|
|
|
|
it("RENAMED_MIGRATION_COMPATIBILITY spot-checks the boundary renames", () => {
|
|
const first = RENAMED_MIGRATION_COMPATIBILITY[0];
|
|
assert.deepEqual(first, {
|
|
fromVersion: "022",
|
|
fromName: "call_logs_summary_storage",
|
|
toVersion: "025",
|
|
toName: "call_logs_summary_storage",
|
|
});
|
|
// both manifest_routing collisions (052→059 and 056→059) must survive
|
|
const manifest = RENAMED_MIGRATION_COMPATIBILITY.filter((e) => e.toName === "manifest_routing");
|
|
assert.deepEqual(manifest.map((e) => e.fromVersion).sort(), ["052", "056"]);
|
|
});
|
|
|
|
it("PHYSICAL_SCHEMA_SENTINELS has 15 well-formed entries incl. the newest 064", () => {
|
|
assert.equal(PHYSICAL_SCHEMA_SENTINELS.length, 15);
|
|
for (const e of PHYSICAL_SCHEMA_SENTINELS) {
|
|
assert.equal(typeof e.version, "string");
|
|
assert.equal(typeof e.tableName, "string");
|
|
assert.equal(typeof e.description, "string");
|
|
}
|
|
const byVersion = Object.fromEntries(
|
|
PHYSICAL_SCHEMA_SENTINELS.map((e) => [e.version, e.tableName])
|
|
);
|
|
assert.equal(byVersion["064"], "session_model_history");
|
|
assert.equal(byVersion["002"], "mcp_tool_audit");
|
|
assert.equal(byVersion["028"], "batches");
|
|
});
|
|
});
|