- 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>
44 lines
1.4 KiB
TypeScript
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();
|
|
});
|
|
});
|