mirror of
https://github.com/iflytek/skillhub.git
synced 2026-09-06 08:15:57 +00:00
92 lines
3.5 KiB
TypeScript
92 lines
3.5 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test'
|
|
import { setEnglishLocale } from './helpers/auth-fixtures'
|
|
|
|
type ReviewStatus = 'PENDING' | 'APPROVED' | 'REJECTED'
|
|
|
|
interface ApiEnvelope<T> {
|
|
code: number
|
|
msg: string
|
|
data: T
|
|
}
|
|
|
|
interface ReviewPageData {
|
|
total: number
|
|
size: number
|
|
}
|
|
|
|
async function fetchReviewPageMeta(page: Page, status: ReviewStatus): Promise<ReviewPageData> {
|
|
const response = await page.request.get(`/api/web/reviews?status=${status}&page=0&size=20&sortDirection=DESC`)
|
|
const body = await response.json() as ApiEnvelope<ReviewPageData>
|
|
if (!response.ok() || body.code !== 0) {
|
|
throw new Error(`Failed to query reviews for ${status}: status=${response.status()} code=${body.code} msg=${body.msg}`)
|
|
}
|
|
return body.data
|
|
}
|
|
|
|
test.describe('Review Management Pagination (Real API)', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await setEnglishLocale(page)
|
|
await page.context().setExtraHTTPHeaders({
|
|
'X-Mock-User-Id': 'local-admin',
|
|
})
|
|
})
|
|
|
|
test('matches pagination rendering with real review totals', async ({ page }) => {
|
|
const statuses: ReviewStatus[] = ['PENDING', 'APPROVED', 'REJECTED']
|
|
const metaByStatus = new Map<ReviewStatus, ReviewPageData>()
|
|
|
|
for (const status of statuses) {
|
|
metaByStatus.set(status, await fetchReviewPageMeta(page, status))
|
|
}
|
|
|
|
await page.goto('/dashboard/reviews')
|
|
await expect(page.getByRole('heading', { name: 'Review Center' })).toBeVisible()
|
|
await expect(page.getByRole('tab', { name: 'Skill Reviews' })).toBeVisible()
|
|
|
|
const tabMeta: Record<ReviewStatus, { tabLabel: string; summaryPrefix: string }> = {
|
|
PENDING: { tabLabel: 'Pending', summaryPrefix: 'Total' },
|
|
APPROVED: { tabLabel: 'Approved', summaryPrefix: 'Total' },
|
|
REJECTED: { tabLabel: 'Rejected', summaryPrefix: 'Total' },
|
|
}
|
|
|
|
for (const status of statuses) {
|
|
await page.getByRole('tab', { name: tabMeta[status].tabLabel }).click()
|
|
|
|
const meta = metaByStatus.get(status)
|
|
if (!meta) {
|
|
throw new Error(`Missing metadata for ${status}`)
|
|
}
|
|
const totalPages = meta.size > 0 ? Math.ceil(meta.total / meta.size) : 0
|
|
|
|
if (meta.total === 0) {
|
|
await expect(page.getByText('No review tasks')).toBeVisible()
|
|
await expect(page.getByRole('button', { name: 'Previous' })).toHaveCount(0)
|
|
await expect(page.getByRole('button', { name: 'Next' })).toHaveCount(0)
|
|
continue
|
|
}
|
|
|
|
const previousButton = page.getByRole('button', { name: 'Previous' }).first()
|
|
const nextButton = page.getByRole('button', { name: 'Next' }).first()
|
|
await expect(previousButton).toBeVisible()
|
|
await expect(nextButton).toBeVisible()
|
|
await expect(previousButton).toBeDisabled()
|
|
|
|
if (totalPages > 1) {
|
|
await expect(page.getByText(new RegExp(`${tabMeta[status].summaryPrefix} ${meta.total} records, page 1`))).toBeVisible()
|
|
await expect(nextButton).toBeEnabled()
|
|
await nextButton.click()
|
|
await expect(page.getByText(new RegExp(`${tabMeta[status].summaryPrefix} ${meta.total} records, page 2`))).toBeVisible()
|
|
} else {
|
|
await expect(nextButton).toBeDisabled()
|
|
}
|
|
}
|
|
})
|
|
|
|
test('opens the profile review queue from the review type search param', async ({ page }) => {
|
|
await page.goto('/dashboard/reviews?type=profile')
|
|
|
|
await expect(page).toHaveURL(/\/dashboard\/reviews\?type=profile$/)
|
|
await expect(page.getByRole('heading', { name: 'Review Center' })).toBeVisible()
|
|
await expect(page.getByRole('heading', { name: 'Profile Review Queue' })).toBeVisible()
|
|
})
|
|
})
|