import { describe, it, expect, beforeEach, vi } from 'vitest'; import { screen, fireEvent, waitFor } from '@testing-library/react'; import { renderWithProviders } from '../test/utils'; vi.mock('../lib/api', () => ({ api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, ApiError: class extends Error {}, })); import { api } from '../lib/api'; import { useAuthStore } from '../stores/authStore'; import MyFinancialPage from './MyFinancialPage'; const get = api.get as ReturnType; const patch = api.patch as ReturnType; const assigned = { uuid: 'bank-assigned', bank_name: 'ملی', card_number: '6037', account_number: '111', shaba_number: null, is_active: true, created_at: 0, entity_type: 'clinic' as const, }; const unassigned = { ...assigned, uuid: 'bank-orphan', bank_name: 'ملت', entity_type: null }; beforeEach(() => { get.mockReset(); patch.mockReset(); useAuthStore.setState({ primaryRole: 'clinic', context: { type: 'clinic', db_uuid: 'c1', name: 'کلینیک مرکزی', role: 'clinic' }, } as any); get.mockImplementation((url: string) => Promise.resolve({ success: true, data: url.includes('bank-accounts') ? [assigned, unassigned] : [] }), ); patch.mockResolvedValue({ success: true, data: { ...unassigned, entity_type: 'clinic' } }); }); /** * کارت‌ها از فاز ۶ به محیط تعلق دارند نه به کاربر. کاربرِ چندمحیطی باید ببیند * کارت‌های جلوی چشمش مالِ کدام محیط‌اند، وگرنه با تعویض محیط فکر می‌کند گمشان کرده. */ describe('MyFinancialPage — محیط روش‌های پرداخت', () => { it('نام محیط فعال را در سرتیتر می‌آورد', async () => { renderWithProviders(); expect(await screen.findByText(/روش‌های پرداخت «کلینیک مرکزی»/)).toBeInTheDocument(); }); it('کارت محیط‌دار را با نام محیط و کارت بی‌محیط را با نشانهٔ «تعیین‌نشده» نشان می‌دهد', async () => { renderWithProviders(); expect(await screen.findByText('محیط تعیین‌نشده')).toBeInTheDocument(); // نام محیط هم در سرتیتر می‌آید هم در ستون محیطِ کارتِ محیط‌دار expect(screen.getAllByText(/کلینیک مرکزی/).length).toBeGreaterThan(1); }); it('کارت بی‌محیط به‌جای «ویرایش» دکمهٔ انتساب می‌گیرد و آن را به محیط فعال می‌چسباند', async () => { renderWithProviders(); const assign = await screen.findByRole('button', { name: /انتساب به کلینیک مرکزی/ }); fireEvent.click(assign); await waitFor(() => expect(patch).toHaveBeenCalledWith( '/api/v1/my/payment-methods/bank-accounts/bank-orphan/environment', {}, ), ); }); it('کارت محیط‌دار همچنان دکمهٔ ویرایش دارد', async () => { renderWithProviders(); expect(await screen.findAllByRole('button', { name: /ویرایش/ })).toHaveLength(1); }); });