import { test, expect } from '@playwright/test' import { fetchMe, registerViaUi, uniqueUsername } from './helpers/auth' const perfectLessons: Record>> = { 1: [ { questionId: 'money-q1', answerId: 'option-a' }, { questionId: 'money-q2', answerId: 'true' }, { questionId: 'money-q3', answerId: 'option-a' }, { questionId: 'money-q4', answerId: 'true' }, { questionId: 'money-q5', answerId: 'option-b' }, ], 2: [ { questionId: 'saving-q1', answerId: 'option-b' }, { questionId: 'saving-q2', answerId: 'true' }, { questionId: 'saving-q3', answerId: 'option-a' }, { questionId: 'saving-q4', answerId: 'true' }, { questionId: 'saving-q5', answerId: 'option-a' }, ], 3: [ { questionId: 'needs-q1', answerId: 'option-a' }, { questionId: 'needs-q2', answerId: 'true' }, { questionId: 'needs-q3', orderedItemIds: ['water', 'food', 'medicine', 'shoes', 'toy', 'crown'] }, { questionId: 'needs-q4', answerId: 'option-a' }, { questionId: 'needs-q5', answerId: 'true' }, ], 4: [ { questionId: 'gold-q1', answerId: 'option-a' }, { questionId: 'gold-q2', answerId: 'true' }, { questionId: 'gold-q3', answerId: 'option-a' }, { questionId: 'gold-q4', answerId: 'false' }, { questionId: 'gold-q5', answerId: 'option-b' }, ], 5: [ { questionId: 'market-q1', answerId: 'option-a' }, { questionId: 'market-q2', answerId: 'false' }, { questionId: 'market-q3', answerId: 'option-a' }, { questionId: 'market-q4', answerId: 'true' }, { questionId: 'market-q5', answerId: 'option-b' }, ], 6: [ { questionId: 'inflation-q1', answerId: 'option-b' }, { questionId: 'inflation-q2', answerId: 'true' }, { questionId: 'inflation-q3', answerId: 'option-a' }, { questionId: 'inflation-q4', answerId: 'false' }, { questionId: 'inflation-q5', answerId: 'option-b' }, ], } async function authHeader(page: import('@playwright/test').Page) { const token = await page.evaluate(() => localStorage.getItem('gold-land-auth-token')) if (!token) throw new Error('missing token') return { authorization: `Bearer ${token}` } } test('budget mission from the map, then replay without extra reward', async ({ page }) => { const user = uniqueUsername('budget') await registerViaUi(page, user, 'pass1234', 'بودجه') const headers = await authHeader(page) for (let levelId = 1; levelId <= 6; levelId += 1) { const start = await page.request.post(`/api/gold-land/levels/${levelId}/start`, { headers }) expect(start.ok()).toBeTruthy() const done = await page.request.post(`/api/gold-land/levels/${levelId}/complete`, { headers, data: { answers: perfectLessons[levelId] }, }) expect(done.ok()).toBeTruthy() } await page.goto('/map') await page.getByRole('button', { name: 'مرحله 7: بودجه‌بندی' }).click() await page.getByRole('button', { name: 'شروع بازی' }).click() await page.getByRole('button', { name: 'ساخت بودجه' }).click() await page.getByRole('button', { name: 'بررسی برنامه' }).click() await expect(page.getByRole('button', { name: 'تأیید برنامه' })).toBeDisabled() await expect(page.getByText('رفت‌وآمد حداقل ۲۰ سکه')).toBeVisible() await page.getByRole('button', { name: 'اصلاح برنامه' }).click() for (let i = 0; i < 4; i += 1) await page.getByRole('button', { name: 'افزایش رفت‌وآمد' }).click() for (let i = 0; i < 5; i += 1) await page.getByRole('button', { name: 'افزایش آب و غذا' }).click() for (let i = 0; i < 4; i += 1) await page.getByRole('button', { name: 'افزایش پس‌انداز برای هدف' }).click() await page.getByRole('button', { name: 'بررسی برنامه' }).click() await page.getByRole('button', { name: 'تأیید برنامه' }).click() await expect(page.getByText('هزینه رفت‌وآمد ۱۰ سکه بیشتر شد')).toBeVisible() await page.getByRole('button', { name: 'بازتنظیم بودجه' }).click() await expect(page.getByRole('button', { name: 'ثبت نتیجه' })).toBeDisabled() await expect(page.getByText('حداقل ۳۰ سکه')).toBeVisible() for (let i = 0; i < 2; i += 1) await page.getByRole('button', { name: 'افزایش رفت‌وآمد' }).click() await expect(page.getByRole('button', { name: 'ثبت نتیجه' })).toBeEnabled() const before = await fetchMe(page) await page.getByRole('button', { name: 'ثبت نتیجه' }).click() await expect(page.getByText('پاداش:')).toBeVisible() await page.getByRole('button', { name: 'بازگشت به نقشه' }).click() await page.waitForURL(/\/map/) await page.reload() const after = await fetchMe(page) expect(after.progress.mapLevels.find((level) => level.id === 7)?.stars).toBe(3) expect(after.user.coins).toBe(before.user.coins + 18 + 9) await page.getByRole('button', { name: 'مرحله 7: بودجه‌بندی' }).click() await page.getByRole('button', { name: 'مرور مجدد' }).click() await page.getByRole('button', { name: 'ساخت بودجه' }).click() for (let i = 0; i < 4; i += 1) await page.getByRole('button', { name: 'افزایش رفت‌وآمد' }).click() for (let i = 0; i < 5; i += 1) await page.getByRole('button', { name: 'افزایش آب و غذا' }).click() for (let i = 0; i < 4; i += 1) await page.getByRole('button', { name: 'افزایش پس‌انداز برای هدف' }).click() await page.getByRole('button', { name: 'بررسی برنامه' }).click() await page.getByRole('button', { name: 'تأیید برنامه' }).click() await page.getByRole('button', { name: 'بازتنظیم بودجه' }).click() for (let i = 0; i < 2; i += 1) await page.getByRole('button', { name: 'افزایش رفت‌وآمد' }).click() const replayBefore = await fetchMe(page) await page.getByRole('button', { name: 'ثبت نتیجه' }).click() await expect(page.getByText('پاداش تازه‌ای اضافه نشد')).toBeVisible() const replayAfter = await fetchMe(page) expect(replayAfter.user.coins).toBe(replayBefore.user.coins) expect(replayAfter.user.xp).toBe(replayBefore.user.xp) await page.goto('/map') await expect(page.getByRole('button', { name: 'مرحله 9: سبد سرمایه‌گذاری' })).toBeDisabled() })