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