51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { openDatabase } from '../src/db.js'
|
|
import {
|
|
hashPassword,
|
|
verifyPassword,
|
|
createUser,
|
|
createSession,
|
|
getUserBySession,
|
|
deleteSession,
|
|
} from '../src/auth.js'
|
|
|
|
describe('passwords', () => {
|
|
it('hashes and verifies', async () => {
|
|
const hash = await hashPassword('correct horse battery staple')
|
|
expect(hash).not.toContain('correct')
|
|
expect(await verifyPassword(hash, 'correct horse battery staple')).toBe(true)
|
|
expect(await verifyPassword(hash, 'wrong')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('sessions', () => {
|
|
it('creates a user and resolves a valid session, rejects expired', async () => {
|
|
const db = openDatabase(':memory:')
|
|
const user = createUser(db, 'sam', await hashPassword('password123'), true)
|
|
expect(user.is_admin).toBe(1)
|
|
|
|
const token = await createSession(db, user.id)
|
|
const resolved = getUserBySession(db, token, () => Date.now())
|
|
expect(resolved?.username).toBe('sam')
|
|
|
|
const expiredToken = await createSession(db, user.id)
|
|
db.prepare('UPDATE sessions SET expires_at = ? WHERE token = ?').run(
|
|
'2000-01-01T00:00:00.000Z',
|
|
expiredToken
|
|
)
|
|
expect(getUserBySession(db, expiredToken, () => Date.now())).toBeNull()
|
|
expect(
|
|
db.prepare('SELECT COUNT(*) AS n FROM sessions').get() as { n: number }
|
|
).toEqual({ n: 1 })
|
|
|
|
deleteSession(db, token)
|
|
expect(getUserBySession(db, token, () => Date.now())).toBeNull()
|
|
})
|
|
|
|
it('rejects duplicate usernames', async () => {
|
|
const db = openDatabase(':memory:')
|
|
createUser(db, 'sam', 'hash1', false)
|
|
expect(() => createUser(db, 'sam', 'hash2', false)).toThrow()
|
|
})
|
|
})
|