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();
});
});