quality / changes (push) Successful in 7s
quality / commitlint (push) Skipped
quality / openapi (push) Successful in 30s
quality / web (push) Successful in 1m3s
quality / api (push) Successful in 1m15s
quality / linux-agent-smoke (push) Failing after 27s
quality / docker-check (push) Failing after 2m28s
CD / quality (push) Failing after 5m52s
CD / publish (push) Skipped
Implement reliable agent apply, telemetry v2, analytics retention, guarded rollouts, enrollment, labels and webhooks. Improve ReUI frontend data safety and bounded list loading, and add Docker smoke, recovery and resource checks. Document local verification and pending native acceptance.
51 lines
2.6 KiB
JavaScript
51 lines
2.6 KiB
JavaScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { createRequire } from 'node:module'
|
|
import { mkdtempSync, rmSync, writeFileSync, existsSync } from 'node:fs'
|
|
import { tmpdir } from 'node:os'
|
|
import { resolve, join } from 'node:path'
|
|
import { spawnSync } from 'node:child_process'
|
|
const root = resolve(import.meta.dirname, '../..')
|
|
const Database = createRequire(join(root, 'packages/db/package.json'))('better-sqlite3')
|
|
const script = join(root, 'deploy/docker/evofw/sqlite-backup.mjs')
|
|
|
|
test('online backup includes committed WAL and restore verifies before offline replacement', () => {
|
|
const directory = mkdtempSync(join(tmpdir(), 'evofw-backup-test-'))
|
|
let db
|
|
const run = (...args) => spawnSync(process.execPath, [script, ...args], { cwd: directory, encoding: 'utf8', env: { ...process.env, NODE_PATH: join(root, 'packages/db/node_modules') } })
|
|
try {
|
|
const source = join(directory, 'source.db')
|
|
const backup = join(directory, 'backup.db')
|
|
const restored = join(directory, 'restored.db')
|
|
db = new Database(source)
|
|
db.pragma('journal_mode = WAL')
|
|
db.exec('CREATE TABLE records(id INTEGER PRIMARY KEY, value TEXT); INSERT INTO records VALUES(1,\'committed WAL\')')
|
|
assert.ok(existsSync(`${source}-wal`))
|
|
const result = run('backup', source, backup)
|
|
assert.equal(result.status, 0, result.stderr)
|
|
const snapshot = new Database(backup, { readonly: true })
|
|
assert.equal(snapshot.prepare('SELECT value FROM records').get().value, 'committed WAL')
|
|
snapshot.close()
|
|
assert.notEqual(run('backup', source, backup).status, 0, 'never overwrite an existing backup')
|
|
assert.notEqual(run('restore', backup, restored).status, 0, 'offline declaration required')
|
|
writeFileSync(restored, 'old offline data')
|
|
writeFileSync(`${restored}-wal`, 'stale')
|
|
writeFileSync(`${restored}-shm`, 'stale')
|
|
const recovery = run('restore', backup, restored, '--offline')
|
|
assert.equal(recovery.status, 0, recovery.stderr)
|
|
assert.ok(!existsSync(`${restored}-wal`))
|
|
const recovered = new Database(restored, { readonly: true })
|
|
assert.equal(recovered.prepare('SELECT value FROM records').get().value, 'committed WAL')
|
|
recovered.close()
|
|
const invalid = join(directory, 'invalid.db')
|
|
writeFileSync(invalid, 'not sqlite')
|
|
assert.notEqual(run('restore', invalid, restored, '--offline').status, 0)
|
|
const preserved = new Database(restored, { readonly: true })
|
|
assert.equal(preserved.prepare('SELECT count(*) AS n FROM records').get().n, 1)
|
|
preserved.close()
|
|
} finally {
|
|
db?.close()
|
|
rmSync(directory, { recursive: true, force: true })
|
|
}
|
|
})
|