Play levels 7-13 in the app and pin E2E to the local thirteen-stage backend commit. Co-authored-by: Cursor <cursoragent@cursor.com>
121 lines
6.3 KiB
TypeScript
121 lines
6.3 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import { fetchMe, registerViaUi, uniqueUsername } from './helpers/auth'
|
|
|
|
const perfectLessons: Record<number, Array<Record<string, unknown>>> = {
|
|
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()
|
|
})
|