44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
|
|
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');
|
||
|
|
});
|
||
|
|
});
|