import { describe, it, expect, vi } from 'vitest'; import { screen, fireEvent } from '@testing-library/react'; import { renderWithProviders } from '../test/utils'; vi.mock('../lib/api', () => ({ api: { get: vi.fn().mockResolvedValue({ success: true, data: [] }), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, ApiError: class extends Error {}, })); import WalletTransactionModal from './WalletTransactionModal'; // موجودی نمونه: ۳۰۰٬۰۰۰ ریال = ۳۰٬۰۰۰ تومان const BALANCE_RIALS = 300_000; function open(onSubmit = vi.fn()) { renderWithProviders( , ); return onSubmit; } describe('WalletTransactionModal (شارژ/برداشت کیف پول)', () => { it('renders both mode tabs, the balance banner and the quick amounts', () => { open(); expect(screen.getByRole('button', { name: 'شارژ کیف پول' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'برداشت از کیف پول' })).toBeInTheDocument(); expect(screen.getByText('موجودی کیف پول')).toBeInTheDocument(); // چهار چیپ مبلغ سریع، هر کدام «... تومان» expect(screen.getAllByRole('button', { name: /تومان/ }).length).toBe(4); }); it('submits a charge with the amount converted from toman to rials and the default cash method', () => { const onSubmit = open(); fireEvent.change(screen.getByPlaceholderText('مبلغ دلخواه (تومان)'), { target: { value: '100000' } }); fireEvent.click(screen.getByRole('button', { name: 'ثبت تراکنش' })); expect(onSubmit).toHaveBeenCalledWith({ mode: 'charge', amount_rials: 1_000_000, payment_method: 'cash' }); }); it('submits a withdraw (debit) when the برداشت tab is active and amount is within balance', () => { const onSubmit = open(); fireEvent.click(screen.getByRole('button', { name: 'برداشت از کیف پول' })); fireEvent.change(screen.getByPlaceholderText('مبلغ دلخواه (تومان)'), { target: { value: '20000' } }); fireEvent.click(screen.getByRole('button', { name: 'ثبت تراکنش' })); expect(onSubmit).toHaveBeenCalledWith({ mode: 'withdraw', amount_rials: 200_000, payment_method: 'cash' }); }); it('blocks a withdraw above the balance and shows the insufficient-funds hint', () => { const onSubmit = open(); fireEvent.click(screen.getByRole('button', { name: 'برداشت از کیف پول' })); // ۴۰٬۰۰۰ تومان = ۴۰۰٬۰۰۰ ریال > موجودی ۳۰۰٬۰۰۰ ریال fireEvent.change(screen.getByPlaceholderText('مبلغ دلخواه (تومان)'), { target: { value: '40000' } }); expect(screen.getByText('موجودی کیف پول کافی نیست')).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'ثبت تراکنش' })).toBeDisabled(); fireEvent.click(screen.getByRole('button', { name: 'ثبت تراکنش' })); expect(onSubmit).not.toHaveBeenCalled(); }); it('keeps submit disabled when no amount is entered', () => { open(); expect(screen.getByRole('button', { name: 'ثبت تراکنش' })).toBeDisabled(); }); });