import { render, screen } from '@testing-library/react';
import { ChartLegend } from './ChartLegend';
import React from 'react';
import { ChartLegendWrapper } from './ChartLegendWrapper';
import userEvent from '@testing-library/user-event';
const colorSet = {
CPU: 'red',
Memory: 'blue',
Disk: 'green',
};
describe('ChartLegend', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('should render all legend items', () => {
render(
,
);
expect(screen.getByText('CPU')).toBeInTheDocument();
expect(screen.getByText('Memory')).toBeInTheDocument();
expect(screen.getByText('Disk')).toBeInTheDocument();
});
it('should have all items selected by default', () => {
render(
,
);
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
});
it('should not respond to clicks when disabled', () => {
render(
,
);
userEvent.click(screen.getByText('CPU'));
// If disabled, should not select any items
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
userEvent.click(screen.getByText('Memory'), { metaKey: true });
// If disabled, should not select any items
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
});
describe('Normal Click Behavior', () => {
it('should select only clicked item when all are selected', () => {
render(
,
);
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
// Click on CPU should select only CPU
userEvent.click(screen.getByLabelText('CPU selected'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
});
it('should select all items when clicking on the only selected item', () => {
render(
,
);
// First click to select only CPU
userEvent.click(screen.getByLabelText('CPU selected'));
// Second click should select all
userEvent.click(screen.getByLabelText('CPU selected'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
});
it('should select only clicked item when clicking unselected item', () => {
render(
,
);
// Select only CPU first
userEvent.click(screen.getByLabelText('CPU selected'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
// Click on unselected Memory should select only Memory
userEvent.click(screen.getByText('Memory'));
expect(screen.getByLabelText('CPU not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
});
});
describe('Cmd+Click Behavior', () => {
it('should add unselected item to selection when cmd+clicking', () => {
render(
,
);
// Select only CPU first
userEvent.click(screen.getByText('CPU'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
// Cmd+click Memory should add it to selection
userEvent.click(screen.getByText('Memory'), { metaKey: true });
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
});
it('should remove selected item from selection when cmd+clicking with multiple selected', () => {
render(
,
);
// Start with all selected, select only CPU, then add Memory
userEvent.click(screen.getByText('CPU'));
userEvent.click(screen.getByText('Memory'), { metaKey: true });
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
// Cmd+click CPU should remove it
userEvent.click(screen.getByText('CPU'), { metaKey: true });
expect(screen.getByLabelText('CPU not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
});
it('should select all when cmd+clicking the only selected item', () => {
render(
,
);
// Select only CPU
userEvent.click(screen.getByText('CPU'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
// Cmd+click the only selected item should select all
userEvent.click(screen.getByText('CPU'), { metaKey: true });
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
});
it('should work with ctrl+click on Windows/Linux', () => {
render(
,
);
// Select only CPU first
userEvent.click(screen.getByText('CPU'));
// Ctrl+click Memory should add it to selection
userEvent.click(screen.getByText('Memory'), { ctrlKey: true });
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
});
it('should handle mixed normal and cmd+clicks correctly', () => {
render(
,
);
// Normal click to select CPU only
userEvent.click(screen.getByText('CPU'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
// Cmd+click to add Memory
userEvent.click(screen.getByText('Memory'), { metaKey: true });
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
// Normal click on Disk should select only Disk
userEvent.click(screen.getByText('Disk'));
expect(screen.getByLabelText('CPU not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk selected')).toBeInTheDocument();
});
it('should select one item when clicking on selected item and other items are selected', () => {
render(
,
);
userEvent.click(screen.getByText('CPU'));
userEvent.click(screen.getByText('Memory'), { metaKey: true });
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
userEvent.click(screen.getByText('CPU'));
expect(screen.getByLabelText('CPU selected')).toBeInTheDocument();
expect(screen.getByLabelText('Memory not selected')).toBeInTheDocument();
expect(screen.getByLabelText('Disk not selected')).toBeInTheDocument();
});
});
});