Files
Wegwichtel/test/editor-database-schema.test.js
T
Florian Zumpe be9df67e18
Sonarqube Scanner / Build and analyze (push) Successful in 1m8s
fixed Sonarqube Code Issues
2026-09-02 01:05:30 +02:00

64 lines
2.3 KiB
JavaScript

import assert from 'node:assert/strict';
import fs from 'node:fs/promises';
import path from 'node:path';
import test from 'node:test';
const root = path.resolve(import.meta.dirname, '..');
async function read(relativePath) {
return fs.readFile(path.join(root, relativePath), 'utf8');
}
function normalizedTokens(line) {
return line
.trim()
.replaceAll(',', ' ')
.replaceAll(';', ' ')
.replaceAll('(', ' ')
.replaceAll(')', ' ')
.split(' ')
.map(token => token.trim().toUpperCase())
.filter(Boolean);
}
function routeTableLines(schema) {
const lines = schema.split('\n');
const start = lines.findIndex(line => normalizedTokens(line).join(' ') === 'CREATE TABLE IF NOT EXISTS ROUTES');
assert.notEqual(start, -1, 'database/schema.sql must define the routes table');
const end = lines.findIndex((line, index) => index > start && normalizedTokens(line).includes('STRICT'));
assert.notEqual(end, -1, 'the routes table must be declared STRICT');
return lines.slice(start, end + 1);
}
function hasActivatedAtTextDefaultNull(lines) {
return lines.some(line => {
const tokens = normalizedTokens(line);
return tokens[0] === 'ACTIVATED_AT'
&& tokens[1] === 'TEXT'
&& tokens.includes('DEFAULT')
&& tokens.includes('NULL');
});
}
function containsTokenSequence(sql, sequence) {
const tokens = sql
.split('\n')
.flatMap(normalizedTokens);
return tokens.some((_, index) => sequence.every((token, offset) => tokens[index + offset] === token));
}
test('initial database schema creates routes with a nullable activation timestamp', async () => {
const schema = await read('database/schema.sql');
const migration = await read('database/migrations/20260901_add_route_activated_at.sql');
const routes = routeTableLines(schema);
assert.equal(hasActivatedAtTextDefaultNull(routes), true);
assert.equal(containsTokenSequence(routes.join('\n'), ['ACTIVATED_AT', 'DATETIME']), false);
assert.equal(containsTokenSequence(routes.join('\n'), ['ON', 'UPDATE', 'CURRENT_TIMESTAMP']), false);
assert.equal(containsTokenSequence(migration, ['ALTER', 'TABLE', 'ROUTES', 'ADD', 'COLUMN', 'ACTIVATED_AT', 'TEXT']), true);
assert.equal(containsTokenSequence(migration, ['ACTIVATED_AT', 'DATETIME']), false);
assert.equal(migration.includes('activated_at is NULL'), true);
});