87 lines
3.1 KiB
TypeScript
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')
|
|
})
|
|
})
|