BillTracker/tests/migrationModules.test.js

36 lines
1.9 KiB
JavaScript

'use strict';
// IMP-CODE-02: the migration arrays were extracted from db/database.js into
// factory modules. These guard the invariants db/database.js relies on:
// - both modules load and build their arrays (run/check bodies aren't invoked
// at construction, so empty deps are fine);
// - the versioned list has no duplicate versions;
// - every legacy-reconcile version exists in the versioned list (reconcile only
// marks known migrations as applied — a reconcile version with no versioned
// counterpart is the drift the in-app assertion warns about).
const test = require('node:test');
const assert = require('node:assert/strict');
const buildVersioned = require('../db/migrations/versionedMigrations');
const buildReconcile = require('../db/migrations/legacyReconcileMigrations');
test('both migration modules build their arrays with no deps needed at construction', () => {
const versioned = buildVersioned({});
const reconcile = buildReconcile({});
assert.ok(Array.isArray(versioned) && versioned.length > 0, 'versioned array non-empty');
assert.ok(Array.isArray(reconcile) && reconcile.length > 0, 'reconcile array non-empty');
for (const m of versioned) assert.equal(typeof m.run, 'function', `${m.version} has a run()`);
for (const m of reconcile) assert.equal(typeof m.check, 'function', `${m.version} has a check()`);
});
test('versioned migration versions are unique', () => {
const versions = buildVersioned({}).map(m => m.version);
assert.equal(new Set(versions).size, versions.length, 'no duplicate versions');
});
test('every legacy-reconcile version exists in the versioned list (no drift)', () => {
const versionedSet = new Set(buildVersioned({}).map(m => m.version));
const orphans = buildReconcile({}).map(m => m.version).filter(v => !versionedSet.has(v));
assert.deepEqual(orphans, [], `reconcile versions with no versioned counterpart: ${orphans.join(', ')}`);
});