import { forwardRef } from 'react'; import { render, screen } from '@testing-library/react'; import { describe, expect, it, vi } from 'vitest'; import { MapView } from '../components/MapView'; import type { Contact } from '../types'; vi.mock('react-leaflet', () => ({ MapContainer: ({ children }: { children: React.ReactNode }) =>
{children}
, TileLayer: () => null, CircleMarker: forwardRef< HTMLDivElement, { children: React.ReactNode; pathOptions?: { fillColor?: string } } >(({ children, pathOptions }, ref) => (
{children}
)), Popup: ({ children }: { children: React.ReactNode }) =>
{children}
, useMap: () => ({ setView: vi.fn(), fitBounds: vi.fn(), }), })); describe('MapView', () => { it('renders a never-heard fallback for a focused contact without last_seen', () => { const contact: Contact = { public_key: 'aa'.repeat(32), name: 'Mystery Node', type: 1, flags: 0, direct_path: null, direct_path_len: -1, direct_path_hash_mode: -1, route_override_path: null, route_override_len: null, route_override_hash_mode: null, last_advert: null, lat: 40, lon: -74, last_seen: null, on_radio: false, favorite: false, last_contacted: null, last_read_at: null, first_seen: null, }; render(); expect( screen.getByText(/showing 1 contact heard in the last 7 days plus the focused contact/i) ).toBeInTheDocument(); expect(screen.getByText('Last heard: Never heard by this server')).toBeInTheDocument(); }); it('keeps the 7-day cutoff stable for the lifetime of the mounted map', () => { vi.useFakeTimers(); try { vi.setSystemTime(new Date('2026-03-15T12:00:00Z')); const contact: Contact = { public_key: 'bb'.repeat(32), name: 'Almost Stale', type: 1, flags: 0, direct_path: null, direct_path_len: -1, direct_path_hash_mode: -1, route_override_path: null, route_override_len: null, route_override_hash_mode: null, last_advert: null, lat: 41, lon: -73, last_seen: Math.floor(Date.now() / 1000) - 7 * 24 * 60 * 60 + 60, on_radio: false, favorite: false, last_contacted: null, last_read_at: null, first_seen: null, }; const { rerender } = render(); expect(screen.getByText(/showing 1 contact heard in the last 7 days/i)).toBeInTheDocument(); vi.advanceTimersByTime(2 * 60 * 1000); rerender(); expect(screen.getByText(/showing 1 contact heard in the last 7 days/i)).toBeInTheDocument(); } finally { vi.useRealTimers(); } }); });