import { describe, it, expect, afterAll, beforeEach } from 'vitest' import request from 'supertest' import { createApp } from '@app/createApp' import { buildPrisma, cleanupTestDb, createTestUser, generateTestToken, } from '../test-helper' const app = createApp() const db = buildPrisma() afterAll(() => db.$disconnect()) beforeEach(() => cleanupTestDb(db)) async function seedActivationCode( userId: number, code = '123456', expiresInMs = 5 * 60 * 1000 ) { return db.user.update({ where: { id: userId }, data: { activationCode: code, activationCodeExpiresAt: new Date(Date.now() + expiresInMs), }, }) } describe('POST /auth/activate', () => { it('activates the user and clears the code', async () => { const user = await createTestUser(db, { email: 'activate@example.com' }) await seedActivationCode(user.id) const res = await request(app) .post('/auth/activate') .send({ code: 123456 }) expect(res.status).toBe(200) expect(res.body.user.active).toBe(true) expect(res.body.user.activationCode).toBeNull() const dbUser = await db.user.findUnique({ where: { id: user.id } }) expect(dbUser!.active).toBe(true) expect(dbUser!.activationCode).toBeNull() }) it('returns 422 for an unknown code', async () => { await createTestUser(db, { email: 'activate@example.com' }) const res = await request(app) .post('/auth/activate') .send({ code: 999999 }) expect(res.status).toBe(422) expect(res.body.error).toBeTruthy() }) it('returns 400 when the code is not a number', async () => { const res = await request(app) .post('/auth/activate') .send({ code: '123456' }) expect(res.status).toBe(400) expect(res.body.fields).toBeTruthy() }) }) describe('POST /auth/resend_code', () => { it('issues a fresh activation code for the authenticated user', async () => { const user = await createTestUser(db, { email: 'resend@example.com' }) const token = generateTestToken(user.id, user.email) const res = await request(app) .post('/auth/resend_code') .set('Authorization', `Bearer ${token}`) expect(res.status).toBe(200) const dbUser = await db.user.findUnique({ where: { id: user.id } }) expect(dbUser!.activationCode).toMatch(/^\d{6}$/) expect(dbUser!.activationCodeExpiresAt).not.toBeNull() }) it('returns 401 without a token', async () => { const res = await request(app).post('/auth/resend_code') expect(res.status).toBe(401) }) })