import { test, expect } from '@playwright/test' import { tomansForGoldPurchase, tomansForGoldSale } from '../src/utils/goldTrade' import { fetchMe, registerViaUi, uniqueUsername } from './helpers/auth' test.describe('wallet rounding UI vs server', () => { test('micro trade and standard buy/sell match server policy', async ({ page }) => { const user = uniqueUsername('market') await registerViaUi(page, user, 'pass1234') const me0 = await fetchMe(page) const cash0 = me0.wallet.cash const gold0 = me0.wallet.goldGrams await page.goto('/market') await page.locator('button.trade-btn--buy').first().click() const buyModal = page.getByRole('dialog') await buyModal.locator('.trade-form__input').fill('0.000003') await expect(page.getByText('برآورد هزینه (خرید به بالا)')).toBeVisible() await buyModal.getByRole('button', { name: 'تأیید خرید' }).click() await expect(page.getByText('خرید با موفقیت انجام شد!').last()).toBeVisible({ timeout: 15_000 }) await expect(buyModal).toBeHidden({ timeout: 10_000 }) let me = await fetchMe(page) expect(me.wallet.goldGrams).toBeCloseTo(gold0 + 0.000_003, 6) expect(me.wallet.cash).toBe(cash0 - tomansForGoldPurchase(0.000_003)) for (let i = 0; i < 3; i++) { await page.locator('button.trade-btn--sell').first().click() const sellModal = page.getByRole('dialog') await sellModal.locator('.trade-form__input').fill('0.000001') await sellModal.getByRole('button', { name: 'تأیید فروش' }).click() await expect(page.getByText('فروش با موفقیت انجام شد!').last()).toBeVisible({ timeout: 15_000, }) await expect(sellModal).toBeHidden({ timeout: 10_000 }) } me = await fetchMe(page) expect(me.wallet.goldGrams).toBeCloseTo(gold0, 6) expect(me.wallet.cash).toBeLessThanOrEqual(cash0) await page.locator('button.trade-btn--buy').first().click() const buyModal2 = page.getByRole('dialog') await buyModal2.locator('.trade-form__input').fill('0.05') await expect(buyModal2.getByText('برآورد هزینه (خرید به بالا)')).toBeVisible() await buyModal2.getByRole('button', { name: 'تأیید خرید' }).click() await expect(page.getByText('خرید با موفقیت انجام شد!').last()).toBeVisible({ timeout: 15_000 }) me = await fetchMe(page) expect(me.wallet.goldGrams).toBeGreaterThan(gold0 + 0.04) }) test('invalid grams shows server error without changing balance', async ({ page }) => { const user = uniqueUsername('marketbad') await registerViaUi(page, user, 'pass1234') const before = await fetchMe(page) const snap = JSON.stringify(before.wallet) await page.goto('/market') await page.locator('button.trade-btn--buy').first().click() await page.locator('.trade-form__input').fill('0.0000004') await page.getByRole('button', { name: 'تأیید خرید' }).click() await expect(page.getByText(/نامعتبر|کمتر از یک تومان|دقت/)).toBeVisible({ timeout: 15_000 }) const after = await fetchMe(page) expect(JSON.stringify(after.wallet)).toBe(snap) }) })