90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
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();
|
|
});
|