Files
goodgo-platform/apps/web/components/valuation/__tests__/valuation-results.spec.tsx
Ho Ngoc Hai ccfc176e40 fix: valuation page Vietnamese diacritics, correct API routes, update tests
- Add proper Vietnamese diacritics to all valuation components
  (form, results, history) and their test assertions
- Fix valuation API client to use /analytics/valuation endpoint
- Return empty history gracefully (no server endpoint yet)

Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
2026-04-13 12:03:47 +07:00

111 lines
3.8 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import type { ValuationResult } from '@/lib/valuation-api';
import { ValuationResults } from '../valuation-results';
const mockResult: ValuationResult = {
id: 'val-1',
estimatedPriceVND: 5_000_000_000,
confidence: 0.87,
pricePerM2: 62_500_000,
priceRangeLow: 4_500_000_000,
priceRangeHigh: 5_500_000_000,
comparables: [
{
id: 'comp-1',
title: 'Căn hộ tương tự A',
address: '456 Nguyễn Hữu Thọ',
district: 'Quận 7',
priceVND: '4800000000',
areaM2: 78,
pricePerM2: 61_500_000,
similarity: 0.92,
},
{
id: 'comp-2',
title: 'Căn hộ tương tự B',
address: '789 Phạm Viết Chánh',
district: 'Bình Thạnh',
priceVND: '5200000000',
areaM2: 82,
pricePerM2: 63_400_000,
similarity: 0.85,
},
],
priceDrivers: [
{ feature: 'Vị trí trung tâm', impact: 15.5, direction: 'positive' },
{ feature: 'Tầng thấp', impact: -5.2, direction: 'negative' },
],
modelVersion: 'v1.0',
createdAt: '2026-01-15T10:00:00Z',
};
describe('ValuationResults', () => {
it('renders estimated price', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('5.00 tỷ VNĐ')).toBeInTheDocument();
});
it('renders confidence percentage', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('87%')).toBeInTheDocument();
});
it('renders price per m2', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('62.5 tr/m²')).toBeInTheDocument();
});
it('renders price range', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText(/4\.50 tỷ.*5\.50 tỷ/)).toBeInTheDocument();
});
it('renders price drivers section', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('Yếu tố ảnh hưởng giá')).toBeInTheDocument();
expect(screen.getByText('Vị trí trung tâm')).toBeInTheDocument();
expect(screen.getByText('Tầng thấp')).toBeInTheDocument();
});
it('shows positive driver with + sign', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('+15.5%')).toBeInTheDocument();
});
it('shows negative driver with - sign', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('-5.2%')).toBeInTheDocument();
});
it('renders comparables section', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('Bất động sản tương tự')).toBeInTheDocument();
expect(screen.getByText('Căn hộ tương tự A')).toBeInTheDocument();
expect(screen.getByText('Căn hộ tương tự B')).toBeInTheDocument();
});
it('shows comparable count', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText(/2 bất động sản/)).toBeInTheDocument();
});
it('shows similarity percentage for comparables', () => {
render(<ValuationResults result={mockResult} />);
expect(screen.getByText('92% tương tự')).toBeInTheDocument();
expect(screen.getByText('85% tương tự')).toBeInTheDocument();
});
it('hides drivers section when empty', () => {
const noDrivers = { ...mockResult, priceDrivers: [] };
render(<ValuationResults result={noDrivers} />);
expect(screen.queryByText('Yếu tố ảnh hưởng giá')).not.toBeInTheDocument();
});
it('hides comparables section when empty', () => {
const noComps = { ...mockResult, comparables: [] };
render(<ValuationResults result={noComps} />);
expect(screen.queryByText('Bất động sản tương tự')).not.toBeInTheDocument();
});
});