Files
gold_land_user/e2e/main-journey.spec.ts
T
safavimohadeseh78andCursor e3f0457dc9
Frontend CI / unit (test, type-check, build) (push) Successful in 1m11s
Frontend CI / browser E2E (frontend + pinned backend) (push) Failing after 2m48s
feat: complete server-backed six-lesson app and trial tooling
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 14:40:37 +03:30

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()
})
})