import { test, expect } from '@playwright/test'; import { seedAuthenticatedSession } from '../helpers/session'; /** * Авто-capture фронтовых ошибок Admin SPA → POST /v1/tickets (source=frontend). * Ручной «сообщить о проблеме» — клиентский сценарий, не UI Control Center. */ test.describe('frontend error auto-report (mock)', () => { test('reportClientError шлёт POST /v1/tickets с source=frontend', async ({ page }) => { await seedAuthenticatedSession(page); let reported: { error_message?: string; source?: string } | null = null; await page.route('**/v1/tickets', async (route) => { if (route.request().method() === 'POST') { reported = route.request().postDataJSON() as typeof reported; await route.fulfill({ status: 201, contentType: 'application/json', body: JSON.stringify({ id: 't-fe-1', source: 'frontend', status: 'open', count: 1, error_hash: 'abc', error_message: reported?.error_message ?? 'err', }), }); return; } await route.continue(); }); await page.goto('/dashboard'); await expect(page.getByTestId('layout-shell')).toBeVisible(); await page.waitForFunction(() => typeof window.__ehReportClientError === 'function'); await page.evaluate(async () => { await window.__ehReportClientError!({ message: 'e2e-frontend-auto-report', stack: 'Error: e2e-frontend-auto-report\n at e2e:1:1', source: 'frontend', }); }); await expect.poll(() => reported?.source, { timeout: 10_000 }).toBe('frontend'); expect(reported?.error_message).toContain('e2e-frontend-auto-report'); }); });