import { render, screen } from '@testing-library/react'; import { describe, expect, it, vi } from 'vitest'; import type { HeatmapPoint } from '../district-heatmap'; vi.mock('mapbox-gl', () => { class MockMap { addControl = vi.fn(); fitBounds = vi.fn(); setStyle = vi.fn(); remove = vi.fn(); on = vi.fn(); } class MockNavigationControl {} class MockMarker { setLngLat() { return this; } setPopup() { return this; } addTo() { return this; } remove() {} } class MockPopup { setHTML() { return this; } setLngLat() { return this; } addTo() { return this; } remove() {} } class MockLngLatBounds { extend() { return this; } isEmpty() { return false; } } return { default: { accessToken: '', Map: MockMap, NavigationControl: MockNavigationControl, Marker: MockMarker, Popup: MockPopup, LngLatBounds: MockLngLatBounds, }, }; }); vi.mock('mapbox-gl/dist/mapbox-gl.css', () => ({})); vi.mock('@/lib/mapbox-style', () => ({ useMapboxStyle: () => 'mapbox://styles/mapbox/light-v11', MAPBOX_STYLE_DARK: 'mapbox://styles/mapbox/dark-v11', })); import { DistrictHeatmap } from '../district-heatmap'; const sampleData: HeatmapPoint[] = [ { district: 'Quan 1', avgPriceM2: 80_000_000, totalListings: 120, medianPrice: '7500000000' }, { district: 'Quan 7', avgPriceM2: 45_000_000, totalListings: 85, medianPrice: '4500000000' }, ]; describe('DistrictHeatmap', () => { it('renders the map container', () => { render(); // Legend is always visible expect(screen.getByText('Giá trung bình/m²')).toBeInTheDocument(); }); it('shows token missing fallback when NEXT_PUBLIC_MAPBOX_TOKEN is absent', () => { delete (process.env as Record)['NEXT_PUBLIC_MAPBOX_TOKEN']; render(); expect(screen.getByText(/NEXT_PUBLIC_MAPBOX_TOKEN/)).toBeInTheDocument(); }); it('renders legend labels', () => { render(); expect(screen.getByText('Thấp')).toBeInTheDocument(); expect(screen.getByText('Cao')).toBeInTheDocument(); }); it('accepts optional className', () => { const { container } = render( , ); expect(container.firstChild).toHaveClass('h-[600px]'); }); });