/** * Unit Tests — user-db.js */ import { describe, it, expect, beforeAll, afterAll } from 'vitest'; import fs from 'fs'; import path from 'path'; import crypto from 'crypto'; describe('user-db', () => { let userDb; const uid = crypto.randomUUID().substring(0, 8); const uniqueEmail = `test-${uid}@example.com`; const oauthEmail = `gh-${uid}@example.com`; beforeAll(() => { // user-db uses hardcoded data/users.sqlite — just clear module cache Object.keys(require.cache).filter(k => k.includes('user-db')).forEach(k => delete require.cache[k]); userDb = require(path.resolve(__dirname, '../../services/user-db')); }); afterAll(() => { // Clean up test users (emails are unique per run via crypto UUID) }); describe('createUser + findByEmail', () => { it('should create a user', () => { const user = userDb.createUser({ email: uniqueEmail, passwordHash: 'hashed_pw', displayName: 'Test User', provider: 'local', }); expect(user).toBeDefined(); expect(user.id).toBeDefined(); expect(user.email).toBe(uniqueEmail); }); it('should find user by email', () => { const user = userDb.findByEmail(uniqueEmail); expect(user).toBeDefined(); expect(user.email).toBe(uniqueEmail); }); it('should return falsy for non-existent email', () => { expect(userDb.findByEmail('nope-nonexist@no.com')).toBeFalsy(); }); }); describe('updateLastLogin', () => { it('should not throw', () => { const user = userDb.findByEmail(uniqueEmail); expect(() => userDb.updateLastLogin(user.id)).not.toThrow(); }); }); describe('toPublicUser', () => { it('should strip sensitive fields', () => { const user = userDb.findByEmail(uniqueEmail); const pub = userDb.toPublicUser(user); expect(pub).toHaveProperty('id'); expect(pub).toHaveProperty('email'); expect(pub).not.toHaveProperty('password_hash'); }); }); describe('findOrCreateOAuthUser', () => { const oauthProviderId = `test-provider-${uid}`; it('should create OAuth user', () => { const user = userDb.findOrCreateOAuthUser({ provider: 'github', providerId: oauthProviderId, email: oauthEmail, displayName: 'GitHub User', avatarUrl: 'https://example.com/avatar.png', }); expect(user).toBeDefined(); expect(user.email).toBe(oauthEmail); }); it('should find existing OAuth user on re-call', () => { const user = userDb.findOrCreateOAuthUser({ provider: 'github', providerId: oauthProviderId, email: oauthEmail, displayName: 'GitHub User', }); expect(user).toBeDefined(); expect(user.email).toBe(oauthEmail); }); }); });