import test from 'node:test'; import assert from 'node:assert/strict'; import fs from 'node:fs/promises'; import path from 'node:path'; import request from 'supertest'; import { createTestApp, loginToken } from './helpers.js'; test('HTTP auth, role filtering, validation, and progress update are real', async () => { const { app, prisma } = await createTestApp(); try { await request(app.getHttpServer()).get('/api/v1/objectives').expect(401); const employeeToken = await loginToken(app, 'employee'); const managerToken = await loginToken(app, 'manager'); const employeeObjectives = await request(app.getHttpServer()) .get('/api/v1/objectives') .set('Authorization', `Bearer ${employeeToken}`) .expect(200); assert.equal(employeeObjectives.body.success, true); assert.deepEqual( employeeObjectives.body.data.map((objective: { ownerId: number }) => objective.ownerId), [3], ); const managerObjectives = await request(app.getHttpServer()) .get('/api/v1/objectives') .set('Authorization', `Bearer ${managerToken}`) .expect(200); assert.equal(managerObjectives.body.data.length, 3); await request(app.getHttpServer()) .post('/api/v1/objectives') .set('Authorization', `Bearer ${employeeToken}`) .send({ title: '', ownerId: 3, quarter: '2026-Q2' }) .expect(400); const progressResponse = await request(app.getHttpServer()) .patch('/api/v1/key-results/2/progress') .set('Authorization', `Bearer ${employeeToken}`) .send({ progress: 70, comment: 'Updated in e2e test' }) .expect(200); assert.equal(progressResponse.body.data.progress, 70); await prisma.keyResult.update({ where: { id: 2 }, data: { progress: 60 } }); await prisma.progressUpdate.deleteMany({ where: { keyResultId: 2, progress: 70 } }); } finally { await app.close(); } }); test('golden objective list response does not drift', async () => { const { app } = await createTestApp(); try { const token = await loginToken(app, 'manager'); const response = await request(app.getHttpServer()) .get('/api/v1/objectives') .set('Authorization', `Bearer ${token}`) .expect(200); const canonical = JSON.stringify( { success: response.body.success, data: response.body.data.map((objective: { id: number; title: string; quarter: string; status: string; keyResults: { id: number; title: string; progress: number }[] }) => ({ id: objective.id, title: objective.title, quarter: objective.quarter, status: objective.status, keyResults: objective.keyResults.map((keyResult) => ({ id: keyResult.id, title: keyResult.title, progress: keyResult.progress, })), })), meta: response.body.meta, }, null, 2, ); const fixture = await fs.readFile(path.resolve('test/golden/objectives.manager.json'), 'utf8'); assert.equal(`${canonical}\n`, fixture); } finally { await app.close(); } });