108 lines
3.7 KiB
TypeScript
108 lines
3.7 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import { API_KEY_HEADER, createTestTask, deleteTestTask } from './helpers'
|
|
|
|
test.describe('Notifications', () => {
|
|
const cleanup: number[] = []
|
|
|
|
test.afterEach(async ({ request }) => {
|
|
for (const id of cleanup) {
|
|
await deleteTestTask(request, id).catch(() => {})
|
|
}
|
|
cleanup.length = 0
|
|
})
|
|
|
|
// ── GET /api/notifications ───────────────────
|
|
|
|
test('GET returns notifications for recipient', async ({ request }) => {
|
|
// Create a task assigned to an agent (triggers notification)
|
|
const { id } = await createTestTask(request, { assigned_to: 'notif-agent' })
|
|
cleanup.push(id)
|
|
|
|
const res = await request.get('/api/notifications?recipient=notif-agent', {
|
|
headers: API_KEY_HEADER,
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.notifications).toBeDefined()
|
|
expect(Array.isArray(body.notifications)).toBe(true)
|
|
expect(body).toHaveProperty('total')
|
|
expect(body).toHaveProperty('unreadCount')
|
|
})
|
|
|
|
test('GET returns 400 without recipient param', async ({ request }) => {
|
|
const res = await request.get('/api/notifications', { headers: API_KEY_HEADER })
|
|
expect(res.status()).toBe(400)
|
|
})
|
|
|
|
test('GET filters by unread_only', async ({ request }) => {
|
|
const res = await request.get('/api/notifications?recipient=notif-agent&unread_only=true', {
|
|
headers: API_KEY_HEADER,
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
// All returned notifications should be unread (read_at is null)
|
|
for (const n of body.notifications) {
|
|
expect(n.read_at).toBeNull()
|
|
}
|
|
})
|
|
|
|
// ── POST /api/notifications ──────────────────
|
|
|
|
test('POST marks notifications as delivered', async ({ request }) => {
|
|
// Create assignment to trigger a notification
|
|
const { id } = await createTestTask(request, { assigned_to: 'deliver-agent' })
|
|
cleanup.push(id)
|
|
|
|
const res = await request.post('/api/notifications', {
|
|
headers: API_KEY_HEADER,
|
|
data: { action: 'mark-delivered', agent: 'deliver-agent' },
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.success).toBe(true)
|
|
})
|
|
|
|
test('POST rejects missing agent', async ({ request }) => {
|
|
const res = await request.post('/api/notifications', {
|
|
headers: API_KEY_HEADER,
|
|
data: { action: 'mark-delivered' },
|
|
})
|
|
expect(res.status()).toBe(400)
|
|
})
|
|
|
|
// ── PUT /api/notifications ───────────────────
|
|
|
|
test('PUT marks specific notification ids as read', async ({ request }) => {
|
|
// Create assignment
|
|
const { id: taskId } = await createTestTask(request, { assigned_to: 'read-agent' })
|
|
cleanup.push(taskId)
|
|
|
|
// Get the notification id
|
|
const listRes = await request.get('/api/notifications?recipient=read-agent', {
|
|
headers: API_KEY_HEADER,
|
|
})
|
|
const listBody = await listRes.json()
|
|
const notifIds = listBody.notifications.map((n: any) => n.id)
|
|
|
|
if (notifIds.length > 0) {
|
|
const res = await request.put('/api/notifications', {
|
|
headers: API_KEY_HEADER,
|
|
data: { ids: notifIds },
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.success).toBe(true)
|
|
}
|
|
})
|
|
|
|
test('PUT marks all as read for recipient', async ({ request }) => {
|
|
const res = await request.put('/api/notifications', {
|
|
headers: API_KEY_HEADER,
|
|
data: { recipient: 'read-agent', markAllRead: true },
|
|
})
|
|
expect(res.status()).toBe(200)
|
|
const body = await res.json()
|
|
expect(body.success).toBe(true)
|
|
})
|
|
})
|