mission-control/tests/task-comments.spec.ts

109 lines
3.5 KiB
TypeScript

import { test, expect } from '@playwright/test'
import { API_KEY_HEADER, createTestTask, deleteTestTask } from './helpers'
test.describe('Task Comments', () => {
const cleanup: number[] = []
test.afterEach(async ({ request }) => {
for (const id of cleanup) {
await deleteTestTask(request, id).catch(() => {})
}
cleanup.length = 0
})
// ── POST /api/tasks/[id]/comments ────────────
test('POST adds comment to existing task', async ({ request }) => {
const { id } = await createTestTask(request)
cleanup.push(id)
const res = await request.post(`/api/tasks/${id}/comments`, {
headers: API_KEY_HEADER,
data: { content: 'Test comment from e2e' },
})
expect(res.status()).toBe(201)
const body = await res.json()
expect(body.comment).toBeDefined()
expect(body.comment.content).toBe('Test comment from e2e')
expect(body.comment.task_id).toBe(id)
})
test('POST rejects empty content', async ({ request }) => {
const { id } = await createTestTask(request)
cleanup.push(id)
const res = await request.post(`/api/tasks/${id}/comments`, {
headers: API_KEY_HEADER,
data: { content: '' },
})
expect(res.status()).toBe(400)
})
test('POST returns 404 for non-existent task', async ({ request }) => {
const res = await request.post('/api/tasks/999999/comments', {
headers: API_KEY_HEADER,
data: { content: 'orphan comment' },
})
expect(res.status()).toBe(404)
})
test('POST creates threaded reply', async ({ request }) => {
const { id } = await createTestTask(request)
cleanup.push(id)
// Create parent comment
const parentRes = await request.post(`/api/tasks/${id}/comments`, {
headers: API_KEY_HEADER,
data: { content: 'Parent comment' },
})
const parentBody = await parentRes.json()
const parentId = parentBody.comment.id
// Create reply
const replyRes = await request.post(`/api/tasks/${id}/comments`, {
headers: API_KEY_HEADER,
data: { content: 'Reply comment', parent_id: parentId },
})
expect(replyRes.status()).toBe(201)
const replyBody = await replyRes.json()
expect(replyBody.comment.parent_id).toBe(parentId)
})
// ── GET /api/tasks/[id]/comments ─────────────
test('GET returns comments array for task', async ({ request }) => {
const { id } = await createTestTask(request)
cleanup.push(id)
// Add a comment
await request.post(`/api/tasks/${id}/comments`, {
headers: API_KEY_HEADER,
data: { content: 'First comment' },
})
const res = await request.get(`/api/tasks/${id}/comments`, { headers: API_KEY_HEADER })
expect(res.status()).toBe(200)
const body = await res.json()
expect(body.comments).toBeDefined()
expect(Array.isArray(body.comments)).toBe(true)
expect(body.comments.length).toBeGreaterThanOrEqual(1)
expect(body.total).toBeGreaterThanOrEqual(1)
})
test('GET returns empty array for task with no comments', async ({ request }) => {
const { id } = await createTestTask(request)
cleanup.push(id)
const res = await request.get(`/api/tasks/${id}/comments`, { headers: API_KEY_HEADER })
expect(res.status()).toBe(200)
const body = await res.json()
expect(body.comments).toEqual([])
expect(body.total).toBe(0)
})
test('GET returns 404 for non-existent task', async ({ request }) => {
const res = await request.get('/api/tasks/999999/comments', { headers: API_KEY_HEADER })
expect(res.status()).toBe(404)
})
})