import { describe, expect, test } from 'bun:test'; import type { DbClient } from '../../db/client'; import { auditSchema } from './schema'; const fakeDb = {} as DbClient; const journalWith = (tags: string[]) => () => ({ version: '5', dialect: 'sqlite', entries: tags.map((tag, i) => ({ idx: i, tag, when: 1700000000 + i })), }); describe('auditSchema', () => { test('an unreadable journal is unmeasured, not clean', async () => { // Was `expect(result).toEqual([])`. Silence rendered as READY, and pending // migrations are the difference between a `.deb` that installed and a // `.deb` that works — `apt upgrade` does not run them (celilo#169). const result = await auditSchema({ journal: () => null, applied: () => [], db: fakeDb, }); expect(result).toHaveLength(1); expect(result[0]?.severity).toBe('unmeasured'); expect(result[0]?.code).toBe('schema_journal_unreadable'); }); test('no finding when every journal entry is applied', async () => { const result = await auditSchema({ journal: journalWith(['0000_init', '0001_add_zones']), applied: () => ['0000_init', '0001_add_zones'], db: fakeDb, }); expect(result).toEqual([]); }); test('blocked finding when migrations are pending', async () => { const result = await auditSchema({ journal: journalWith(['0000_init', '0001_add_zones', '0002_backup_tables']), applied: () => ['0000_init'], db: fakeDb, }); expect(result).toHaveLength(1); expect(result[0]).toMatchObject({ category: 'schema', severity: 'blocked', code: 'schema_pending_migrations', subject: 'system', }); expect(result[0].message).toContain('2 pending'); expect(result[0].details).toContain('0001_add_zones'); expect(result[0].details).toContain('0002_backup_tables'); }); test('singular wording for exactly one pending migration', async () => { const result = await auditSchema({ journal: journalWith(['0000_init', '0001_add_zones']), applied: () => ['0000_init'], db: fakeDb, }); expect(result[0].message).toBe('1 pending DB migration'); }); test('treats applied set as a set (order-independent)', async () => { const result = await auditSchema({ journal: journalWith(['0000_init', '0001_add_zones']), applied: () => ['0001_add_zones', '0000_init'], // reversed db: fakeDb, }); expect(result).toEqual([]); }); });