import React from 'react';
import { render, screen } from '@testing-library/react';
import { StatusIndicator } from '../../../src/renderer/components/ui/StatusIndicator';
type StatusType = 'online' | 'offline' | 'connecting' | 'error' | 'warning';
describe('StatusIndicator', () => {
it('renders with default status', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toBeInTheDocument();
expect(indicator).toHaveClass('bg-hedera-smoke-400');
});
it('renders online status', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('bg-accent');
});
it('renders offline status', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('bg-hedera-smoke-400');
});
it('renders connecting status with animation', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('bg-primary', 'animate-pulse');
});
it('renders error status', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('bg-danger');
});
it('renders warning status', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('bg-yellow-500');
});
it('supports different sizes', () => {
const { rerender } = render();
let indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('w-2', 'h-2');
rerender();
indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('w-3', 'h-3');
rerender();
indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveClass('w-4', 'h-4');
});
it('displays label when provided', () => {
render();
expect(screen.getByText('Connected')).toBeInTheDocument();
});
it('positions label correctly', () => {
const { rerender } = render(
);
let container = screen.getByTestId('status-container');
expect(container).toHaveClass('flex-row');
rerender(
);
container = screen.getByTestId('status-container');
expect(container).toHaveClass('flex-row-reverse');
rerender(
);
container = screen.getByTestId('status-container');
expect(container).toHaveClass('flex-col-reverse');
rerender(
);
container = screen.getByTestId('status-container');
expect(container).toHaveClass('flex-col');
});
it('has proper ARIA attributes', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveAttribute('role', 'status');
expect(indicator).toHaveAttribute('aria-live', 'polite');
expect(indicator).toHaveAttribute('aria-label', 'Status: online');
});
it('supports custom aria-label', () => {
render(
);
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveAttribute('aria-label', 'Server connection status');
});
it('supports custom className', () => {
render();
const container = screen.getByTestId('status-container');
expect(container).toHaveClass('custom-class');
});
it('renders with tooltip when provided', () => {
render();
const indicator = screen.getByTestId('status-indicator');
expect(indicator).toHaveAttribute('title', 'Server is operational');
});
it('applies correct styles for each status', () => {
const statuses = [
{ status: 'online', class: 'bg-accent' },
{ status: 'offline', class: 'bg-hedera-smoke-400' },
{ status: 'connecting', classes: ['bg-primary', 'animate-pulse'] },
{ status: 'error', class: 'bg-danger' },
{ status: 'warning', class: 'bg-yellow-500' },
];
statuses.forEach(({ status, class: className, classes }) => {
const { unmount } = render();
const indicator = screen.getByTestId('status-indicator');
if (classes) {
classes.forEach((cls) => expect(indicator).toHaveClass(cls));
} else {
expect(indicator).toHaveClass(className);
}
unmount();
});
});
});