Files
goodgo-platform/e2e/web/admin-moderation.spec.ts
Ho Ngoc Hai 8e82d346aa test(e2e): add 14 new web E2E test files for critical user flows
Cover auth (login, register, OAuth callbacks), search with filters,
listing detail, dashboard, analytics, create listing form, admin
dashboard/users/moderation/KYC, navigation routing, and responsive
design. Total 91 test cases using Playwright with API route mocking.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-08 13:14:17 +07:00

76 lines
2.6 KiB
TypeScript

import { test, expect } from '@playwright/test';
const mockModerationQueue = {
data: [
{
id: 'mod-1', listingId: 'l1', title: 'Căn hộ cần duyệt', propertyType: 'APARTMENT',
transactionType: 'SALE', price: 5000000000, sellerName: 'Nguyen Van A',
aiModerationScore: 85, submittedAt: '2026-03-01T00:00:00Z', status: 'PENDING',
},
{
id: 'mod-2', listingId: 'l2', title: 'Nhà phố cần duyệt', propertyType: 'HOUSE',
transactionType: 'RENT', price: 15000000, sellerName: 'Tran Thi B',
aiModerationScore: 42, submittedAt: '2026-03-02T00:00:00Z', status: 'PENDING',
},
],
total: 2, page: 1, limit: 20, totalPages: 1,
};
test.describe('Admin Moderation Page', () => {
test.beforeEach(async ({ page }) => {
await page.route('**/admin/moderation**', (route) => {
if (route.request().method() === 'GET') {
return route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify(mockModerationQueue),
});
}
return route.continue();
});
});
test('renders moderation queue with listings', async ({ page }) => {
await page.goto('/admin/moderation');
await expect(page.getByText('Căn hộ cần duyệt')).toBeVisible({ timeout: 10000 });
await expect(page.getByText('Nhà phố cần duyệt')).toBeVisible();
});
test('displays AI moderation scores', async ({ page }) => {
await page.goto('/admin/moderation');
await expect(page.getByText('Căn hộ cần duyệt')).toBeVisible({ timeout: 10000 });
await expect(page.getByText('85')).toBeVisible();
await expect(page.getByText('42')).toBeVisible();
});
test('shows seller names', async ({ page }) => {
await page.goto('/admin/moderation');
await expect(page.getByText('Nguyen Van A')).toBeVisible({ timeout: 10000 });
await expect(page.getByText('Tran Thi B')).toBeVisible();
});
test('has refresh button', async ({ page }) => {
await page.goto('/admin/moderation');
const refreshButton = page.getByRole('button').filter({ has: page.locator('svg') }).first();
await expect(refreshButton).toBeVisible({ timeout: 10000 });
});
test('handles empty moderation queue', async ({ page }) => {
await page.route('**/admin/moderation**', (route) =>
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ data: [], total: 0, page: 1, limit: 20, totalPages: 0 }),
}),
);
await page.goto('/admin/moderation');
await page.waitForTimeout(2000);
await expect(page.locator('body')).toBeVisible();
});
});