mission-control/tests/mentions.spec.ts

87 lines
3.1 KiB
TypeScript

import { test, expect } from '@playwright/test'
import { API_KEY_HEADER, createTestAgent, deleteTestAgent, createTestTask, deleteTestTask, createTestUser, deleteTestUser } from './helpers'
test.describe('Mentions (@users + @agents)', () => {
const createdTaskIds: number[] = []
const createdAgentIds: number[] = []
const createdUserIds: number[] = []
test.afterEach(async ({ request }) => {
for (const taskId of createdTaskIds.splice(0)) {
await deleteTestTask(request, taskId)
}
for (const agentId of createdAgentIds.splice(0)) {
await deleteTestAgent(request, agentId)
}
for (const userId of createdUserIds.splice(0)) {
await deleteTestUser(request, userId)
}
})
test('task description mentions notify both user and agent', async ({ request }) => {
const { id: agentId, name: agentName } = await createTestAgent(request)
createdAgentIds.push(agentId)
const { id: userId, username } = await createTestUser(request)
createdUserIds.push(userId)
const taskRes = await request.post('/api/tasks', {
headers: API_KEY_HEADER,
data: {
title: `e2e-mention-task-${Date.now()}`,
description: `Please review @${username} and @${agentName}`,
},
})
expect(taskRes.status()).toBe(201)
const taskBody = await taskRes.json()
const taskId = Number(taskBody.task?.id)
createdTaskIds.push(taskId)
const userNotifsRes = await request.get(`/api/notifications?recipient=${encodeURIComponent(username)}`, {
headers: API_KEY_HEADER,
})
expect(userNotifsRes.status()).toBe(200)
const userNotifsBody = await userNotifsRes.json()
expect(userNotifsBody.notifications.some((n: any) => n.type === 'mention' && n.source_type === 'task' && n.source_id === taskId)).toBe(true)
const agentNotifsRes = await request.get(`/api/notifications?recipient=${encodeURIComponent(agentName)}`, {
headers: API_KEY_HEADER,
})
expect(agentNotifsRes.status()).toBe(200)
const agentNotifsBody = await agentNotifsRes.json()
expect(agentNotifsBody.notifications.some((n: any) => n.type === 'mention' && n.source_type === 'task' && n.source_id === taskId)).toBe(true)
})
test('rejects unknown mention in task description', async ({ request }) => {
const res = await request.post('/api/tasks', {
headers: API_KEY_HEADER,
data: {
title: `e2e-mention-invalid-${Date.now()}`,
description: 'invalid mention @does-not-exist-xyz',
},
})
expect(res.status()).toBe(400)
const body = await res.json()
expect(String(body.error || '')).toContain('Unknown mentions')
})
test('rejects unknown mention in comments', async ({ request }) => {
const { id: taskId } = await createTestTask(request)
createdTaskIds.push(taskId)
const res = await request.post(`/api/tasks/${taskId}/comments`, {
headers: API_KEY_HEADER,
data: {
author: 'system',
content: 'hello @not-a-real-target-zz',
},
})
expect(res.status()).toBe(400)
const body = await res.json()
expect(String(body.error || '')).toContain('Unknown mentions')
})
})