53 lines
3.4 KiB
JavaScript
53 lines
3.4 KiB
JavaScript
import { expect, test } from '@playwright/test'
|
|
|
|
test('대시보드 숫자·섹션 순서와 한 줄 접속자 페이지 목록을 표시한다', async ({ page }) => {
|
|
const login = await page.request.post('/admin/api/auth/login', {
|
|
data: { email: 'playwright-admin@example.com', password: 'playwright-admin-password' }
|
|
})
|
|
expect(login.ok()).toBeTruthy()
|
|
await page.goto('/admin/posts')
|
|
await page.waitForLoadState('networkidle')
|
|
await page.route('**/admin/api/posts', (route) => route.fulfill({ json: Array.from({ length: 1234 }, (_, index) => ({ id: String(index), status: 'published' })) }))
|
|
await page.route('**/admin/api/analytics/summary?*', (route) => route.fulfill({ json: {
|
|
todayVisitors: 1234, totalVisitors: 10413, trends: [], collectedSince: '2026-06-01'
|
|
} }))
|
|
await page.route('**/admin/api/analytics/range-detail?*', (route) => route.fulfill({ json: {
|
|
summary: { pageViews: 12345, visitors: 3456, avgEngagedSeconds: 90, scroll50Reach: 2345 },
|
|
sources: [], devices: [], topPosts: [], topPages: []
|
|
} }))
|
|
const session = {
|
|
activeKey: 'test-visitor', isLoggedIn: false, ipAddress: '198.51.100.1', durationSeconds: 1800, pageCount: 6,
|
|
pages: [
|
|
{ key: 'old', path: '/post/old', postTitle: '이전 페이지', lastSeenAt: '2026-10-21T01:00:00Z' },
|
|
{ key: 'new', path: '/post/new', postTitle: '가장 최근 페이지', lastSeenAt: '2026-10-21T06:00:00Z' },
|
|
{ key: 'dup', path: '/post/new', postTitle: '가장 최근 페이지', lastSeenAt: '2026-10-21T05:00:00Z' },
|
|
...[2, 3, 4].map((index) => ({ key: String(index), path: `/post/page-${index}`, postTitle: `열린 페이지 ${index}`, lastSeenAt: `2026-10-21T0${index}:00:00Z` }))
|
|
]
|
|
}
|
|
await page.route('**/admin/api/analytics/realtime?*', (route) => route.fulfill({ json: { summary: { onlineNow: 1234 }, sessions: [session] } }))
|
|
await page.getByRole('link', { name: '대시보드', exact: true }).click()
|
|
await expect(page.locator('.admin-dashboard__summary')).toContainText('10,413')
|
|
await expect(page.locator('.admin-dashboard__summary')).toContainText('1,234')
|
|
await expect(page.locator('.admin-dashboard__traffic-total')).toContainText('12,345')
|
|
const sections = await page.locator('.admin-dashboard__body > section').evaluateAll((elements) => elements.map((element) => element.className))
|
|
expect(sections.map((value) => value.match(/admin-dashboard__(summary|adsense|charts|selected-detail|recent-comments|live)\b/)[1])).toEqual(['summary', 'adsense', 'charts', 'selected-detail', 'recent-comments', 'live'])
|
|
const visitor = page.locator('.admin-dashboard__live-item')
|
|
await expect(visitor).toContainText('가장 최근 페이지')
|
|
await expect(visitor).toContainText('외 4개')
|
|
expect((await visitor.boundingBox()).height).toBeLessThan(45)
|
|
const trigger = visitor.getByRole('button', { name: '열린 페이지 목록', exact: true })
|
|
await trigger.hover()
|
|
const popover = page.locator('.admin-realtime-pages__popover')
|
|
await expect(popover).toBeVisible()
|
|
await expect(popover.locator('a')).toHaveCount(5)
|
|
await expect(popover.locator('a').first()).toHaveAttribute('href', '/post/new')
|
|
await popover.hover()
|
|
await expect(popover).toBeVisible()
|
|
await page.keyboard.press('Escape')
|
|
await expect(popover).toHaveCount(0)
|
|
await trigger.press('Enter')
|
|
await expect(popover).toBeVisible()
|
|
await popover.getByRole('button', { name: '열린 페이지 목록 닫기' }).click()
|
|
await expect(popover).toHaveCount(0)
|
|
})
|