import React from 'react'; import { screen } from '@testing-library/react'; import { render, WithRoute } from 'lib/testHelpers'; import Overview from 'components/Topics/Topic/Overview/Overview'; import { theme } from 'theme/theme'; import { CleanUpPolicy, Topic } from 'generated-sources'; import ClusterContext from 'components/contexts/ClusterContext'; import userEvent from '@testing-library/user-event'; import { clusterTopicPath } from 'lib/paths'; import { Replica } from 'components/Topics/Topic/Overview/Overview.styled'; import { useTopicDetails } from 'lib/hooks/api/topics'; import { useAppDispatch } from 'lib/hooks/redux'; import { externalTopicPayload, internalTopicPayload, } from 'lib/fixtures/topics'; const clusterName = 'local'; const topicName = 'topic'; const defaultContextValues = { isReadOnly: false, hasKafkaConnectConfigured: true, hasSchemaRegistryConfigured: true, isTopicDeletionAllowed: true, }; jest.mock('lib/hooks/api/topics', () => ({ useTopicDetails: jest.fn(), })); const unwrapMock = jest.fn(); jest.mock('lib/hooks/redux', () => ({ ...jest.requireActual('lib/hooks/redux'), useAppDispatch: jest.fn(), })); describe('Overview', () => { const renderComponent = ( topic: Topic = externalTopicPayload, context = defaultContextValues ) => { (useTopicDetails as jest.Mock).mockImplementation(() => ({ data: topic, })); const path = clusterTopicPath(clusterName, topicName); return render( , { initialEntries: [path] } ); }; beforeEach(() => { (useAppDispatch as jest.Mock).mockImplementation(() => () => ({ unwrap: unwrapMock, })); }); it('at least one replica was rendered', () => { renderComponent(); expect(screen.getByLabelText('replica-info')).toBeInTheDocument(); }); it('renders replica cell with props', () => { render(); const element = screen.getByLabelText('replica-info'); expect(element).toBeInTheDocument(); expect(element).toHaveStyleRule( 'color', theme.topicMetaData.liderReplica.color ); }); describe('when replicas out of sync', () => { it('should be the appropriate color', () => { render(); const element = screen.getByLabelText('replica-info'); expect(element).toBeInTheDocument(); expect(element).toHaveStyleRule( 'color', theme.topicMetaData.outOfSync.color ); expect(element).toHaveStyleRule('font-weight', '500'); }); }); describe('when it has internal flag', () => { it('renders the Action button for Topic', () => { renderComponent({ ...externalTopicPayload, cleanUpPolicy: CleanUpPolicy.DELETE, }); expect(screen.getAllByLabelText('Dropdown Toggle').length).toEqual(1); }); it('does not render Partitions', () => { renderComponent({ ...externalTopicPayload, partitions: [] }); expect(screen.getByText('No Partitions found')).toBeInTheDocument(); }); }); describe('should render circular alert', () => { it('should be in document', () => { renderComponent(); const circles = screen.getAllByRole('circle'); expect(circles.length).toEqual(2); }); it('should be the appropriate color', () => { renderComponent({ ...externalTopicPayload, underReplicatedPartitions: 0, inSyncReplicas: 1, replicas: 2, }); const circles = screen.getAllByRole('circle'); expect(circles[0]).toHaveStyle( `fill: ${theme.circularAlert.color.success}` ); expect(circles[1]).toHaveStyle( `fill: ${theme.circularAlert.color.error}` ); }); }); describe('when Clear Messages is clicked', () => { it('should when Clear Messages is clicked', async () => { renderComponent({ ...externalTopicPayload, cleanUpPolicy: CleanUpPolicy.DELETE, }); const clearMessagesButton = screen.getByText('Clear Messages'); await userEvent.click(clearMessagesButton); expect(unwrapMock).toHaveBeenCalledTimes(1); }); }); describe('when the table partition dropdown appearance', () => { it('should check if the dropdown is disabled when it is readOnly', () => { renderComponent( { ...externalTopicPayload, }, { ...defaultContextValues, isReadOnly: true } ); expect(screen.getByLabelText('Dropdown Toggle')).toBeDisabled(); }); it('should check if the dropdown is disabled when it is internal', () => { renderComponent({ ...internalTopicPayload, }); expect(screen.getByLabelText('Dropdown Toggle')).toBeDisabled(); }); it('should check if the dropdown is disabled when cleanUpPolicy is not DELETE', () => { renderComponent({ ...externalTopicPayload, cleanUpPolicy: CleanUpPolicy.COMPACT, }); expect(screen.getByLabelText('Dropdown Toggle')).toBeDisabled(); }); }); });