83 lines
3.0 KiB
TypeScript
83 lines
3.0 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import {
|
|
fetchMe,
|
|
loginViaUi,
|
|
logoutViaProfile,
|
|
registerViaUi,
|
|
uniqueUsername,
|
|
} from './helpers/auth'
|
|
import { completeLevel1Lesson, playCurrentLessonSteps } from './helpers/lesson'
|
|
|
|
test.describe('main user journey', () => {
|
|
test('register → lesson 1 → map → refresh → logout → login', async ({ page }) => {
|
|
const user = uniqueUsername('journey')
|
|
const password = 'pass1234'
|
|
|
|
await registerViaUi(page, user, password, 'کاربر E2E')
|
|
|
|
const meBefore = await fetchMe(page)
|
|
const xp0 = meBefore.user.xp
|
|
const coins0 = meBefore.user.coins
|
|
|
|
await completeLevel1Lesson(page)
|
|
|
|
await expect(page.getByText('مرحله 2 باز شد')).toBeVisible()
|
|
const rewardXp = page.locator('.stat-row--reward').filter({ hasText: 'XP' })
|
|
if (await rewardXp.count()) {
|
|
await expect(rewardXp).toBeVisible()
|
|
}
|
|
|
|
const meAfterLesson = await fetchMe(page)
|
|
expect(meAfterLesson.progress.mapLevels.find((l) => l.id === 1)?.stars).toBeGreaterThan(0)
|
|
expect(meAfterLesson.progress.mapLevels.find((l) => l.id === 2)?.status).not.toBe('locked')
|
|
expect(meAfterLesson.user.xp).toBeGreaterThan(xp0)
|
|
expect(meAfterLesson.user.coins).toBeGreaterThan(coins0)
|
|
|
|
await page.getByRole('button', { name: 'بازگشت به نقشه' }).click()
|
|
await page.waitForURL(/\/map/)
|
|
|
|
await page.reload()
|
|
await page.waitForURL(/\/map/)
|
|
const meAfterRefresh = await fetchMe(page)
|
|
expect(meAfterRefresh.progress.mapLevels.find((l) => l.id === 1)?.stars).toBe(
|
|
meAfterLesson.progress.mapLevels.find((l) => l.id === 1)?.stars,
|
|
)
|
|
|
|
await logoutViaProfile(page)
|
|
await loginViaUi(page, user, password)
|
|
const meRelogin = await fetchMe(page)
|
|
expect(meRelogin.progress.mapLevels.find((l) => l.id === 1)?.stars).toBeGreaterThan(0)
|
|
})
|
|
|
|
test('lesson replay without improvement grants no extra reward in UI', async ({ page }) => {
|
|
const user = uniqueUsername('replay')
|
|
await registerViaUi(page, user, 'pass1234')
|
|
await completeLevel1Lesson(page)
|
|
|
|
const me1 = await fetchMe(page)
|
|
const xp1 = me1.user.xp
|
|
const coins1 = me1.user.coins
|
|
|
|
await page.getByRole('button', { name: 'مرور دوباره' }).click()
|
|
await page.getByText('در حال بارگذاری').waitFor({ state: 'detached', timeout: 30_000 })
|
|
await playCurrentLessonSteps(page)
|
|
|
|
const me2 = await fetchMe(page)
|
|
expect(me2.user.xp).toBe(xp1)
|
|
expect(me2.user.coins).toBe(coins1)
|
|
})
|
|
|
|
test('locked and coming_soon levels behave correctly', async ({ page }) => {
|
|
const user = uniqueUsername('maplock')
|
|
await registerViaUi(page, user, 'pass1234')
|
|
await page.goto('/map')
|
|
await page.getByRole('heading', { name: 'سرزمین طلا' }).waitFor()
|
|
|
|
const level2 = page.getByRole('button', { name: /مرحله 2:/ })
|
|
await expect(level2).toBeDisabled()
|
|
|
|
await page.goto('/gold-land/levels/7')
|
|
await expect(page.getByText('هنوز قفل است')).toBeVisible()
|
|
})
|
|
})
|