import { test, expect } from '@playwright/test' import { fetchMe, registerViaUi, uniqueUsername } from './helpers/auth' test.describe('store, game, educational challenge', () => { test('store purchase and duplicate guard', async ({ page }) => { const user = uniqueUsername('store') await registerViaUi(page, user, 'pass1234') const me0 = await fetchMe(page) const coins0 = me0.user.coins await page.goto('/store') await page.getByText('در حال بارگذاری').waitFor({ state: 'detached', timeout: 30_000 }).catch(() => {}) await page.getByRole('button', { name: 'تقویت XP' }).click() await page.getByRole('button', { name: 'خرید' }).click() await expect(page.getByText(/تقویت XP.*خریده شد/)).toBeVisible({ timeout: 15_000 }) const me1 = await fetchMe(page) expect(me1.user.coins).toBeLessThan(coins0) expect(me1.progress.ownedItems).toContain('boost-xp') await page.reload() const meRefresh = await fetchMe(page) expect(meRefresh.progress.ownedItems).toContain('boost-xp') await expect(page.locator('.product-card').filter({ hasText: 'تقویت XP' })).toContainText('مال توئه') const me2 = await fetchMe(page) expect(me2.user.coins).toBe(me1.user.coins) }) test('gold guess first completion only', async ({ page }) => { const user = uniqueUsername('game') await registerViaUi(page, user, 'pass1234') const me0 = await fetchMe(page) const coins0 = me0.user.coins const xp0 = me0.user.xp await page.goto('/games/gold-guess') await page.getByText('در حال بارگذاری پاداش').waitFor({ state: 'detached', timeout: 30_000 }).catch(() => {}) await page.getByRole('button', { name: 'افزایش' }).click() await expect(page.locator('.toast--success')).toBeVisible({ timeout: 15_000 }) const me1 = await fetchMe(page) expect(me1.user.coins).toBeGreaterThan(coins0) expect(me1.progress.claimedRewards).toContain('gold-guess') await page.reload() await page.getByRole('button', { name: 'افزایش' }).click({ timeout: 5000 }).catch(() => {}) const me2 = await fetchMe(page) expect(me2.user.coins).toBe(me1.user.coins) expect(me2.user.xp).toBeGreaterThanOrEqual(xp0) }) test('educational challenge once', async ({ page }) => { const user = uniqueUsername('challenge') await registerViaUi(page, user, 'pass1234') const me0 = await fetchMe(page) const coins0 = me0.user.coins await page.goto('/challenge') await page.getByRole('heading', { name: 'چالش آموزشی' }).waitFor() await page.getByText('در حال بارگذاری').waitFor({ state: 'detached', timeout: 30_000 }).catch(() => {}) await page.getByRole('button', { name: 'طلا' }).click() await page.getByRole('button', { name: 'دریافت پاداش' }).click() await expect(page.getByText('پاداش دریافت شد')).toBeVisible({ timeout: 15_000 }) const me1 = await fetchMe(page) expect(me1.user.coins).toBeGreaterThan(coins0) expect(me1.progress.completedChallenges).toContain('daily-challenge') await page.reload() await page.getByRole('heading', { name: 'چالش آموزشی' }).waitFor() const me2 = await fetchMe(page) expect(me2.user.coins).toBe(me1.user.coins) }) })