feat(admin): Playwright E2E каркас — TESTIDS, login/shell/roles, CI mock. Refs EventHub/EventHubFrontAdmin#33 #34 #35
CI / test (push) Failing after 14m2s
CI / push-image (push) Has been skipped
CI / ci-done (push) Failing after 0s

This commit is contained in:
2026-07-14 22:18:34 +03:00
parent 2a32465050
commit 87c6b55e81
19 changed files with 493 additions and 1462 deletions
+29
View File
@@ -0,0 +1,29 @@
import { test, expect } from '@playwright/test';
import { installAdminApiMocks, MOCK_ADMIN } from '../mocks/adminApi';
test.describe('auth / login (mock)', () => {
test.beforeEach(async ({ page }) => {
await installAdminApiMocks(page);
});
test('успешный вход ведёт на dashboard', async ({ page }) => {
await page.goto('/login');
await expect(page.getByTestId('page-login')).toBeVisible();
await page.getByLabel(/email/i).fill(MOCK_ADMIN.email);
await page.getByLabel(/пароль|password/i).fill('e2e-pass');
await page.getByRole('button', { name: /войти|log in|sign in/i }).click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page.getByTestId('page-dashboard')).toBeVisible();
});
test('неверный пароль показывает ошибку', async ({ page }) => {
await page.goto('/login');
await page.getByLabel(/email/i).fill(MOCK_ADMIN.email);
await page.getByLabel(/пароль|password/i).fill('wrong');
await page.getByTestId('btn-login').click();
await expect(page.getByText(/неверный email или пароль|invalid/i)).toBeVisible();
await expect(page).toHaveURL(/\/login/);
});
});
+10
View File
@@ -0,0 +1,10 @@
import { test } from '@playwright/test';
/** IFT smoke project placeholder — filled in phase 6. */
test.describe('IFT smoke', () => {
test.skip(!process.env.E2E_ADMIN_EMAIL, 'Set E2E_ADMIN_EMAIL / E2E_ADMIN_PASSWORD for IFT');
test('placeholder', async () => {
// Implemented in E2E phase 6
});
});
+68
View File
@@ -0,0 +1,68 @@
import { test, expect } from '@playwright/test';
import { seedAuthenticatedSession } from '../helpers/session';
import { loginAsE2EAdmin } from '../helpers/auth';
import { installAdminApiMocks } from '../mocks/adminApi';
test.describe('shell / layout (mock)', () => {
test('после логина видны sidebar, nav dashboard и user menu', async ({ page }) => {
await installAdminApiMocks(page);
await loginAsE2EAdmin(page);
await expect(page.getByTestId('layout-shell')).toBeVisible();
await expect(page.getByTestId('layout-sidebar')).toBeVisible();
await expect(page.getByTestId('nav-dashboard')).toBeVisible();
await expect(page.getByTestId('nav-users')).toBeVisible();
await expect(page.getByTestId('nav-admins')).toBeVisible();
await page.getByTestId('menu-user').click();
await expect(page.getByTestId('menu-user-content')).toBeVisible();
await expect(page.getByTestId('menu-profile')).toBeVisible();
await expect(page.getByTestId('btn-logout')).toBeVisible();
});
test('command palette открывается и навигирует', async ({ page }) => {
await seedAuthenticatedSession(page);
await page.goto('/dashboard');
await expect(page.getByTestId('layout-shell')).toBeVisible();
await page.getByTestId('btn-open-palette').click();
await expect(page.getByTestId('command-palette')).toBeVisible();
await page.getByTestId('palette-input').fill('Пользователи');
await page.keyboard.press('Enter');
await expect(page).toHaveURL(/\/users/);
});
test('logout возвращает на login', async ({ page }) => {
await seedAuthenticatedSession(page);
await page.goto('/dashboard');
await page.getByTestId('menu-user').click();
await page.getByTestId('btn-logout').click();
await expect(page).toHaveURL(/\/login/);
await expect(page.getByTestId('page-login')).toBeVisible();
});
});
test.describe('shell / roles (mock)', () => {
test('moderator: нет nav users, admins запрещён', async ({ page }) => {
await seedAuthenticatedSession(page, { role: 'moderator', nickname: 'Mod' });
await page.goto('/dashboard');
await expect(page.getByTestId('nav-inbox-reports')).toBeVisible();
await expect(page.getByTestId('nav-users')).toHaveCount(0);
await expect(page.getByTestId('nav-admins')).toHaveCount(0);
await page.goto('/admins');
await expect(page.getByTestId('page-forbidden')).toBeVisible();
await page.getByTestId('btn-to-dashboard').click();
await expect(page).toHaveURL(/\/dashboard/);
});
test('support: tickets inbox есть, reports inbox нет', async ({ page }) => {
await seedAuthenticatedSession(page, { role: 'support', nickname: 'Support' });
await page.goto('/dashboard');
await expect(page.getByTestId('nav-inbox-tickets')).toBeVisible();
await expect(page.getByTestId('nav-inbox-reports')).toHaveCount(0);
await page.goto('/inbox/reports');
await expect(page.getByTestId('page-forbidden')).toBeVisible();
});
});