Files
moyosapp_beta.0.0.3.3_beta1/e2e/admin-dashboard-flow.spec.ts

54 lines
2.0 KiB
TypeScript

/**
* E2E Test: Admin Dashboard Flow
* Priority: CRITICAL - Admin functionality
*
* Tests the complete admin journey:
* 1. Admin login
* 2. View dashboard statistics
* 3. Manage guests
* 4. Export data
* 5. View analytics
*/
import { test, expect, type Page } from '@playwright/test';
import { loginAsAdmin } from './helpers/auth';
test.describe('Admin Dashboard Flow', () => {
test.beforeEach(async ({ page }: { page: Page }) => {
await page.goto('/admin');
});
test('complete admin dashboard journey', async ({ page }: { page: Page }) => {
await loginAsAdmin(page);
// Overview stats cards should render.
await expect(page.getByText(/\b\d+\s+guests\b/i)).toBeVisible({ timeout: 15_000 });
// Guests tab
await page.getByRole('tab', { name: /^guests$/i }).click();
await expect(page.getByText(/guest management/i)).toBeVisible({ timeout: 15_000 });
await expect(page.getByRole('button', { name: /add guest/i })).toBeVisible({ timeout: 15_000 });
// Photos tab
await page.getByRole('tab', { name: /^photos$/i }).click();
await expect(page.getByRole('heading', { name: /^photos$/i })).toBeVisible({ timeout: 15_000 });
// Music tab
await page.getByRole('tab', { name: /^music$/i }).click();
await expect(page.getByRole('heading', { name: /^music$/i })).toBeVisible({ timeout: 15_000 });
});
test('handles invalid admin credentials', async ({ page }: { page: Page }) => {
await page.getByLabel(/email or username/i).fill('invalid@example.com');
await page.getByLabel(/^password$/i).fill('wrong-password');
await page.getByRole('button', { name: /^login$/i }).click();
await expect(page.getByRole('alert')).toBeVisible({ timeout: 10_000 });
});
test('requires authentication for admin routes', async ({ page }: { page: Page }) => {
await page.goto('/admin?tab=guests');
// Unauthed users see the login card.
await expect(page.getByText(/admin access/i)).toBeVisible({ timeout: 10_000 });
});
});