import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; import { describe, expect, it, vi } from 'vitest'; import { makeAuditData, makeResult } from '../test-utils'; // Mock Headlamp lib vi.mock('@kinvolk/headlamp-plugin/lib', () => ({ ApiProxy: { request: vi.fn() }, K8s: {}, })); vi.mock('@mui/material/styles', () => ({ useTheme: () => ({ palette: { success: { main: '#4caf50', contrastText: '#fff' }, warning: { main: '#ff9800', contrastText: '#000' }, error: { main: '#f44336', contrastText: '#fff' }, }, }), })); const mockPush = vi.fn(); vi.mock('react-router-dom', () => ({ useHistory: () => ({ push: mockPush }), })); // Set window.location.pathname for cluster extraction beforeEach(() => { Object.defineProperty(window, 'location', { value: { pathname: '/c/test-cluster/some-page' }, writable: true, }); mockPush.mockClear(); }); const mockUsePolarisDataContext = vi.fn(); vi.mock('../api/PolarisDataContext', () => ({ usePolarisDataContext: () => mockUsePolarisDataContext(), })); import AppBarScoreBadge from './AppBarScoreBadge'; describe('AppBarScoreBadge', () => { it('returns null when loading', () => { mockUsePolarisDataContext.mockReturnValue({ data: null, loading: true }); const { container } = render(); expect(container.innerHTML).toBe(''); }); it('returns null when no data', () => { mockUsePolarisDataContext.mockReturnValue({ data: null, loading: false }); const { container } = render(); expect(container.innerHTML).toBe(''); }); it('renders score with success color for high score', () => { const data = makeAuditData([ makeResult({ Results: { c1: { ID: 'c1', Message: '', Details: [], Success: true, Severity: 'warning', Category: 'X', }, }, }), ]); mockUsePolarisDataContext.mockReturnValue({ data, loading: false }); render(); const button = screen.getByRole('button'); expect(button).toHaveTextContent('Polaris: 100%'); expect(button.style.backgroundColor).toBe('rgb(76, 175, 80)'); }); it('renders score with error color for low score', () => { const data = makeAuditData([ makeResult({ Results: { c1: { ID: 'c1', Message: '', Details: [], Success: false, Severity: 'danger', Category: 'X', }, }, }), ]); mockUsePolarisDataContext.mockReturnValue({ data, loading: false }); render(); const button = screen.getByRole('button'); expect(button).toHaveTextContent('Polaris: 0%'); expect(button.style.backgroundColor).toBe('rgb(244, 67, 54)'); }); it('navigates to /c//polaris on click', async () => { const user = userEvent.setup(); const data = makeAuditData([ makeResult({ Results: { c1: { ID: 'c1', Message: '', Details: [], Success: true, Severity: 'warning', Category: 'X', }, }, }), ]); mockUsePolarisDataContext.mockReturnValue({ data, loading: false }); render(); await user.click(screen.getByRole('button')); expect(mockPush).toHaveBeenCalledWith('/c/test-cluster/polaris'); }); it('navigates to /polaris when no cluster in URL', async () => { Object.defineProperty(window, 'location', { value: { pathname: '/settings' }, writable: true, }); const user = userEvent.setup(); const data = makeAuditData([ makeResult({ Results: { c1: { ID: 'c1', Message: '', Details: [], Success: true, Severity: 'warning', Category: 'X', }, }, }), ]); mockUsePolarisDataContext.mockReturnValue({ data, loading: false }); render(); await user.click(screen.getByRole('button')); expect(mockPush).toHaveBeenCalledWith('/polaris'); }); it('has correct aria-label', () => { const data = makeAuditData([ makeResult({ Results: { c1: { ID: 'c1', Message: '', Details: [], Success: true, Severity: 'warning', Category: 'X', }, }, }), ]); mockUsePolarisDataContext.mockReturnValue({ data, loading: false }); render(); expect(screen.getByLabelText('Polaris: 100%')).toBeInTheDocument(); }); });