1
0
Files
record-shop/server/test/auth.test.ts

51 lines
1.6 KiB
TypeScript
Raw Normal View History

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()
})
})