import { render, screen } from '@testing-library/react'; import { describe, expect, it, vi } from 'vitest'; vi.mock('next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }), })); vi.mock('@/lib/chuyen-nhuong-api', () => ({ CATEGORY_LABELS: { FURNITURE: 'Nội thất', APPLIANCE: 'Thiết bị', OFFICE_EQUIPMENT: 'Văn phòng', KITCHEN: 'Bếp', PREMISES: 'Mặt bằng', FULL_UNIT: 'Trọn gói' }, CATEGORY_ICONS: { FURNITURE: () => , APPLIANCE: () => , OFFICE_EQUIPMENT: () => , KITCHEN: () => , PREMISES: () => , FULL_UNIT: () => , }, CONDITION_LABELS: { NEW: 'Mới', LIKE_NEW: 'Như mới', GOOD: 'Tốt', FAIR: 'Trung bình', WORN: 'Cũ' }, transferApi: { estimate: vi.fn(), create: vi.fn() }, })); vi.mock('@/lib/transfer-wizard-store', () => { const state = { currentStep: 0, category: null as string | null, items: [] as unknown[], title: '', description: '', address: '', district: '', city: '', askingPriceVND: 0, pricingSource: 'MANUAL', isNegotiable: false, aiEstimate: null, isEstimating: false, setCategory: vi.fn(), setStep: vi.fn(), addItem: vi.fn(), removeItem: vi.fn(), setAiEstimate: vi.fn(), setIsEstimating: vi.fn(), setListingDetails: vi.fn(), reset: vi.fn(), }; return { useTransferWizardStore: () => state, }; }); import { TransferWizardClient } from '../transfer-wizard-client'; describe('TransferWizardClient', () => { it('renders wizard title', () => { render(); expect(screen.getByText('Đăng tin chuyển nhượng')).toBeInTheDocument(); }); it('renders step indicators (4 steps)', () => { render(); expect(screen.getByText('1')).toBeInTheDocument(); expect(screen.getByText('2')).toBeInTheDocument(); expect(screen.getByText('3')).toBeInTheDocument(); expect(screen.getByText('4')).toBeInTheDocument(); }); it('renders current step label "Danh mục" for step 0', () => { render(); expect(screen.getByText('Danh mục')).toBeInTheDocument(); }); it('renders category selection buttons', () => { render(); expect(screen.getByText('Nội thất')).toBeInTheDocument(); expect(screen.getByText('Thiết bị')).toBeInTheDocument(); }); it('renders navigation buttons', () => { render(); expect(screen.getByText(/Quay lại/)).toBeInTheDocument(); expect(screen.getByText(/Tiếp theo/)).toBeInTheDocument(); }); it('disables back button on first step', () => { render(); const backBtn = screen.getByText(/Quay lại/).closest('button'); expect(backBtn).toBeDisabled(); }); });