import { render, screen } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import React from 'react';
import { MapLegend } from './map-legend';
import { resolveScale } from '../map/map-scale';
describe('MapLegend', () => {
const items = [
{ colorToken: '--chart-1' as const, label: 'Até 50 atendimentos' },
{ colorToken: '--chart-2' as const, label: '51 a 200 atendimentos' },
{ colorToken: '--destructive' as const, label: 'Acima de 200 atendimentos' },
];
it('renders one entry per color-key item', () => {
render();
items.forEach(item => {
expect(screen.getByText(item.label)).toBeInTheDocument();
});
});
it('names the region with its title', () => {
render();
expect(screen.getByRole('group', { name: 'Atendimentos por município' })).toBeInTheDocument();
});
it('falls back to a generic accessible name when there is no title', () => {
render();
expect(screen.getByRole('group', { name: 'Map legend' })).toBeInTheDocument();
});
describe('size key', () => {
const scale = {
value: 0,
domain: [0, 900] as [number, number],
range: [5, 22] as [number, number],
};
it('labels each sample with its value and unit', () => {
render();
expect(screen.getByText('10 un.')).toBeInTheDocument();
expect(screen.getByText('100 un.')).toBeInTheDocument();
expect(screen.getByText('900 un.')).toBeInTheDocument();
});
it('sizes each sample with the same scale the markers use', () => {
const { container } = render();
const expected = resolveScale({ ...scale, value: 900 }) * 2;
const disc = container.querySelector('li span[aria-hidden="true"]');
expect(disc).toHaveStyle({ width: `${expected}px`, height: `${expected}px` });
});
it('omits the unit when none is given', () => {
render();
expect(screen.getByText('42')).toBeInTheDocument();
});
it('renders both keys together', () => {
render();
expect(screen.getByText('Até 50 atendimentos')).toBeInTheDocument();
expect(screen.getByText('900 un.')).toBeInTheDocument();
});
});
it('positions itself absolutely only in the overlay variant', () => {
const { container: inline } = render();
expect(inline.firstChild).not.toHaveClass('absolute');
const { container: overlay } = render(
);
expect(overlay.firstChild).toHaveClass('absolute');
});
it('renders nothing but the frame when given no keys', () => {
render();
expect(screen.getByRole('group', { name: 'Legenda' })).toBeEmptyDOMElement;
expect(screen.getByText('Legenda')).toBeInTheDocument();
});
});