Files
qinglong/packages/ql3-cluster-postgres/test/schema.test.cjs
T

68 lines
2.1 KiB
JavaScript

require('ts-node/register/transpile-only');
const assert = require('node:assert/strict');
const { test } = require('node:test');
const { getTableConfig } = require('drizzle-orm/pg-core');
const {
postgresqlControlSchemaContract,
ql3PostgresTables,
} = require('../dist');
function describeTable(table) {
const config = getTableConfig(table);
const primaryIndexes = config.columns
.filter((column) => column.primary)
.map(() => `${config.name}_pkey`);
return {
name: config.name,
schema: config.schema,
columns: config.columns.map((column) => column.name),
indexes: [
...primaryIndexes,
...config.primaryKeys.map((entry) => entry.getName()),
...config.indexes.map((entry) => entry.config.name),
],
checks: config.checks.map((entry) => entry.name),
foreignKeys: config.foreignKeys.map((entry) => entry.getName()),
};
}
test('Drizzle schema exactly matches the reviewed ql3 table and index contract', () => {
const drizzleTables = ql3PostgresTables.map(describeTable);
assert.deepEqual(
drizzleTables.map(({ name, schema, columns }) => ({
name,
schema,
columns,
})),
postgresqlControlSchemaContract.tables.map(({ name, columns }) => ({
name,
schema: postgresqlControlSchemaContract.schema,
columns: [...columns],
})),
);
assert.deepEqual(
drizzleTables.flatMap(({ indexes }) => indexes).sort(),
[...postgresqlControlSchemaContract.indexes].sort(),
);
});
test('Drizzle schema carries every named ql3 check and foreign-key boundary', () => {
const drizzleTables = ql3PostgresTables.map(describeTable);
const checks = drizzleTables.flatMap((table) => table.checks).sort();
const foreignKeys = drizzleTables
.flatMap((table) => table.foreignKeys)
.sort();
assert.deepEqual(checks, [...postgresqlControlSchemaContract.checks].sort());
assert.deepEqual(
foreignKeys,
[...postgresqlControlSchemaContract.foreignKeys].sort(),
);
assert.equal(
drizzleTables.some(({ name }) =>
['crontabs', 'envs', 'subscriptions', 'runninginstances'].includes(name),
),
false,
);
});