112 lines
3.3 KiB
TypeScript
112 lines
3.3 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import { API_KEY_HEADER, createTestTask, deleteTestTask } from './helpers'
|
|
|
|
test.describe('Quality Review', () => {
|
|
const cleanup: number[] = []
|
|
|
|
test.afterEach(async ({ request }) => {
|
|
for (const id of cleanup) {
|
|
await deleteTestTask(request, id).catch(() => {})
|
|
}
|
|
cleanup.length = 0
|
|
})
|
|
|
|
// ── POST /api/quality-review ─────────────────
|
|
|
|
test('POST creates review for existing task', async ({ request }) => {
|
|
const { id: taskId } = await createTestTask(request)
|
|
cleanup.push(taskId)
|
|
|
|
const res = await request.post('/api/quality-review', {
|
|
headers: API_KEY_HEADER,
|
|
data: {
|
|
taskId,
|
|
reviewer: 'aegis',
|
|
status: 'approved',
|
|
notes: 'Looks good to me',
|
|
},
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.success).toBe(true)
|
|
expect(body.id).toBeDefined()
|
|
})
|
|
|
|
test('POST returns 404 for non-existent task', async ({ request }) => {
|
|
const res = await request.post('/api/quality-review', {
|
|
headers: API_KEY_HEADER,
|
|
data: {
|
|
taskId: 999999,
|
|
reviewer: 'aegis',
|
|
status: 'rejected',
|
|
notes: 'Task does not exist',
|
|
},
|
|
})
|
|
expect(res.status()).toBe(404)
|
|
})
|
|
|
|
test('POST rejects missing required fields', async ({ request }) => {
|
|
const { id: taskId } = await createTestTask(request)
|
|
cleanup.push(taskId)
|
|
|
|
const res = await request.post('/api/quality-review', {
|
|
headers: API_KEY_HEADER,
|
|
data: { taskId },
|
|
})
|
|
expect(res.status()).toBe(400)
|
|
})
|
|
|
|
// ── GET /api/quality-review ──────────────────
|
|
|
|
test('GET returns reviews for taskId', async ({ request }) => {
|
|
const { id: taskId } = await createTestTask(request)
|
|
cleanup.push(taskId)
|
|
|
|
// Create a review first
|
|
await request.post('/api/quality-review', {
|
|
headers: API_KEY_HEADER,
|
|
data: {
|
|
taskId,
|
|
reviewer: 'aegis',
|
|
status: 'approved',
|
|
notes: 'LGTM',
|
|
},
|
|
})
|
|
|
|
const res = await request.get(`/api/quality-review?taskId=${taskId}`, {
|
|
headers: API_KEY_HEADER,
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.reviews).toBeDefined()
|
|
expect(Array.isArray(body.reviews)).toBe(true)
|
|
expect(body.reviews.length).toBeGreaterThanOrEqual(1)
|
|
})
|
|
|
|
test('GET batch lookup by taskIds', async ({ request }) => {
|
|
const { id: taskId1 } = await createTestTask(request)
|
|
const { id: taskId2 } = await createTestTask(request)
|
|
cleanup.push(taskId1, taskId2)
|
|
|
|
// Create review for task1
|
|
await request.post('/api/quality-review', {
|
|
headers: API_KEY_HEADER,
|
|
data: { taskId: taskId1, reviewer: 'aegis', status: 'approved', notes: 'ok' },
|
|
})
|
|
|
|
const res = await request.get(`/api/quality-review?taskIds=${taskId1},${taskId2}`, {
|
|
headers: API_KEY_HEADER,
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.latest).toBeDefined()
|
|
expect(body.latest[taskId1]).not.toBeNull()
|
|
expect(body.latest[taskId2]).toBeNull() // no review for task2
|
|
})
|
|
|
|
test('GET returns 400 without taskId', async ({ request }) => {
|
|
const res = await request.get('/api/quality-review', { headers: API_KEY_HEADER })
|
|
expect(res.status()).toBe(400)
|
|
})
|
|
})
|