77 lines
3.3 KiB
TypeScript
77 lines
3.3 KiB
TypeScript
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)
|
|
})
|
|
})
|