import { test, expect } from '@playwright/test'; import { login, PORT_SLUG } from './helpers'; test.describe('Audit log read view (Phase B)', () => { test.beforeEach(async ({ page }) => { await login(page, 'super_admin'); }); test('admin audit page renders search + entity + action filters', async ({ page }) => { // First-hit dev-mode compile of the upgraded route can exceed 30s. await page.goto(`/${PORT_SLUG}/admin/audit`, { timeout: 60_000 }); await expect(page.getByRole('heading', { name: /audit log/i })).toBeVisible({ timeout: 30_000, }); await expect(page.getByTestId('audit-search')).toBeVisible({ timeout: 10_000 }); await expect(page.getByTestId('audit-entity')).toBeVisible(); await expect(page.getByTestId('audit-action')).toBeVisible(); // Date filters render alongside. await expect(page.getByLabel(/^from$/i)).toBeVisible(); await expect(page.getByLabel(/^to$/i)).toBeVisible(); }); test('audit API returns cursor-paginated rows with the new shape', async ({ page }) => { // Pull the port id from the admin/ports list so the audit request can // pass X-Port-Id (the audit endpoint scopes results to a single port). const portsRes = await page.request.get('/api/v1/admin/ports'); const portsBody = (await portsRes.json()) as { data: Array<{ id: string }> }; const portId = portsBody.data[0]?.id; expect(portId).toBeTruthy(); const auditRes = await page.request.get(`/api/v1/admin/audit?limit=5`, { headers: { 'X-Port-Id': portId! }, timeout: 60_000, }); expect(auditRes.status()).toBe(200); const body = (await auditRes.json()) as { data: Array<{ action: string; entityType: string }>; pagination: { nextCursor: { createdAt: string; id: string } | null }; }; expect(Array.isArray(body.data)).toBe(true); expect(body.pagination).toHaveProperty('nextCursor'); }); });