Files
nanodrop/tests/unit/db-users.test.ts
Brendan Chen b6aa6211a9 Scaffold project and implement config, DB schema/queries
- Set up package.json (ESM, scripts), tsconfig.json, vitest.config.ts
- Install runtime and dev dependencies
- Add CLAUDE.md with architecture notes and code quality rules
- Config module with env var parsing and JWT_SECRET validation
- DB schema: users + files tables with FK cascade
- DB queries: createUser, getUserBy*, createFile, getFileById, getFilesByUserId, deleteFile
- Tests for config, db/users, db/files (15 tests passing)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 15:48:21 -08:00

44 lines
1.4 KiB
TypeScript

import { describe, it, expect, beforeEach } from 'vitest';
import { initDb } from '../../src/db/schema.ts';
import { createUser, getUserByUsername, getUserById } from '../../src/db/users.ts';
import type Database from 'better-sqlite3';
describe('db/users', () => {
let db: Database.Database;
beforeEach(() => {
db = initDb(':memory:');
});
it('creates a user and retrieves by username', () => {
const user = createUser(db, { username: 'alice', passwordHash: 'hash123' });
expect(user.id).toBeTypeOf('number');
expect(user.username).toBe('alice');
expect(user.password_hash).toBe('hash123');
expect(user.created_at).toBeTruthy();
const found = getUserByUsername(db, 'alice');
expect(found).toEqual(user);
});
it('returns undefined for unknown username', () => {
expect(getUserByUsername(db, 'ghost')).toBeUndefined();
});
it('retrieves user by id', () => {
const user = createUser(db, { username: 'bob', passwordHash: 'hash456' });
const found = getUserById(db, user.id);
expect(found).toEqual(user);
});
it('returns undefined for unknown id', () => {
expect(getUserById(db, 999)).toBeUndefined();
});
it('enforces unique username constraint', () => {
createUser(db, { username: 'carol', passwordHash: 'hash' });
expect(() => createUser(db, { username: 'carol', passwordHash: 'other' })).toThrow();
});
});