import { expect } from '@playwright/test'; import { test } from './helpers/fixtures'; import { mock } from './helpers/mock'; const statsBody = { status: 200, data: { total_users: 142, users_per_level: [], event_join_checkin: [ { event_id: 'e1', name: '春季峰会', join_count: 80, checkin_count: 65 }, { event_id: 'e2', name: '秋季研讨', join_count: 40, checkin_count: 38 } ] } }; test('stats page renders total users', async ({ page, superAdminUser }) => { void superAdminUser; await mock.override('GET', '/stats/global', { status: 200, body: statsBody }); await page.goto('/app/admin/stats'); await page.waitForLoadState('networkidle'); await expect(page.getByText('142')).toBeVisible(); await expect(page.getByText('总用户数')).toBeVisible(); }); test('stats page renders event join/checkin table', async ({ page, superAdminUser }) => { void superAdminUser; await mock.override('GET', '/stats/global', { status: 200, body: statsBody }); await page.goto('/app/admin/stats'); await page.waitForLoadState('networkidle'); await expect(page.getByText('春季峰会')).toBeVisible(); await expect(page.getByText('80')).toBeVisible(); await expect(page.getByText('65')).toBeVisible(); await expect(page.getByText('秋季研讨')).toBeVisible(); }); test('stats page shows empty state when no events', async ({ page, superAdminUser }) => { void superAdminUser; await mock.override('GET', '/stats/global', { status: 200, body: { status: 200, data: { total_users: 0, users_per_level: [], event_join_checkin: [] } } }); await page.goto('/app/admin/stats'); await page.waitForLoadState('networkidle'); await expect(page.getByText('暂无活动数据')).toBeVisible(); }); test('Lv30 user is denied access to stats page', async ({ page, _autoResetMock }) => { void _autoResetMock; // Log in as Lv30 user (event organizer — below Lv40 gate) await page.context().addCookies([ { name: 'access_token', value: 'test-access', domain: 'localhost', path: '/app', httpOnly: true, sameSite: 'Lax' }, { name: 'refresh_token', value: 'test-refresh', domain: 'localhost', path: '/app', httpOnly: true, sameSite: 'Lax' } ]); await mock.override('GET', '/user/info', { status: 200, body: { status: 200, data: { user_id: '2', email: 'organizer@test.local', username: 'organizer', permission_level: 30, allow_public: false } } }); await page.goto('/app/admin/stats'); await page.waitForLoadState('networkidle'); await expect(page.getByText('权限不足')).toBeVisible(); });