38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
|
|
import { describe, it, expect } from 'vitest'
|
||
|
|
import { openDatabase } from '../src/db.js'
|
||
|
|
|
||
|
|
describe('openDatabase', () => {
|
||
|
|
it('creates the full schema', () => {
|
||
|
|
const db = openDatabase(':memory:')
|
||
|
|
const tables = (
|
||
|
|
db.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all() as {
|
||
|
|
name: string
|
||
|
|
}[]
|
||
|
|
).map((r) => r.name)
|
||
|
|
for (const t of [
|
||
|
|
'users',
|
||
|
|
'sessions',
|
||
|
|
'settings',
|
||
|
|
'collection_items',
|
||
|
|
'digital_albums',
|
||
|
|
'match_links',
|
||
|
|
'app_meta',
|
||
|
|
]) {
|
||
|
|
expect(tables).toContain(t)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
it('enforces unique (user_id, discogs_release_id)', () => {
|
||
|
|
const db = openDatabase(':memory:')
|
||
|
|
db.prepare(
|
||
|
|
"INSERT INTO users (username, password_hash, is_admin) VALUES ('sam', 'x', 1)"
|
||
|
|
).run()
|
||
|
|
const insert = db.prepare(
|
||
|
|
`INSERT INTO collection_items (user_id, discogs_release_id, title, artist)
|
||
|
|
VALUES (1, 100, 'Album', 'Artist')`
|
||
|
|
)
|
||
|
|
insert.run()
|
||
|
|
expect(() => insert.run()).toThrow()
|
||
|
|
})
|
||
|
|
})
|