diff --git a/kafka-ui-react-app/src/components/Alerts/__tests__/Alert.spec.tsx b/kafka-ui-react-app/src/components/Alerts/__tests__/Alert.spec.tsx index 4b1782c074..382eff6fe9 100644 --- a/kafka-ui-react-app/src/components/Alerts/__tests__/Alert.spec.tsx +++ b/kafka-ui-react-app/src/components/Alerts/__tests__/Alert.spec.tsx @@ -22,15 +22,16 @@ describe('Alert', () => { {...props} /> ); + const getButton = () => screen.getByRole('button'); it('renders with initial props', () => { setupComponent(); expect(screen.getByRole('heading')).toHaveTextContent(title); expect(screen.getByRole('contentinfo')).toHaveTextContent(message); - expect(screen.getByRole('button')).toBeInTheDocument(); + expect(getButton()).toBeInTheDocument(); }); it('handles dismiss callback', () => { setupComponent(); - userEvent.click(screen.getByRole('button')); + userEvent.click(getButton()); expect(dismiss).toHaveBeenCalled(); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/Actions.spec.tsx b/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/Actions.spec.tsx index 3c9a69e09c..4b998f420c 100644 --- a/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/Actions.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/Actions.spec.tsx @@ -1,19 +1,22 @@ import React from 'react'; -import { create } from 'react-test-renderer'; -import { mount } from 'enzyme'; -import { act } from 'react-dom/test-utils'; -import { containerRendersView, TestRouterWrapper } from 'lib/testHelpers'; +import { Route } from 'react-router-dom'; +import { render } from 'lib/testHelpers'; import { clusterConnectConnectorPath, clusterConnectorsPath } from 'lib/paths'; import ActionsContainer from 'components/Connect/Details/Actions/ActionsContainer'; import Actions, { ActionsProps, } from 'components/Connect/Details/Actions/Actions'; import { ConnectorState } from 'generated-sources'; -import { ConfirmationModalProps } from 'components/common/ConfirmationModal/ConfirmationModal'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import ConfirmationModal, { + ConfirmationModalProps, +} from 'components/common/ConfirmationModal/ConfirmationModal'; const mockHistoryPush = jest.fn(); +const deleteConnector = jest.fn(); +const cancelMock = jest.fn(); + jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useHistory: () => ({ @@ -26,8 +29,35 @@ jest.mock( () => 'mock-ConfirmationModal' ); +const expectActionButtonsExists = () => { + expect(screen.getByText('Restart Connector')).toBeInTheDocument(); + expect(screen.getByText('Restart All Tasks')).toBeInTheDocument(); + expect(screen.getByText('Restart Failed Tasks')).toBeInTheDocument(); + expect(screen.getByText('Edit Config')).toBeInTheDocument(); + expect(screen.getByText('Delete')).toBeInTheDocument(); +}; + describe('Actions', () => { - containerRendersView(, Actions); + const actionsContainer = (props: Partial = {}) => ( + + + + ); + + it('container renders view', () => { + const { container } = render(actionsContainer()); + expect(container).toBeInTheDocument(); + }); describe('view', () => { const pathname = clusterConnectConnectorPath( @@ -39,107 +69,163 @@ describe('Actions', () => { const connectName = 'my-connect'; const connectorName = 'my-connector'; - const setupWrapper = (props: Partial = {}) => ( - - = {}) => ( + + + deleteConnector(clusterName, connectName, connectorName) + } + {...props} > - - - + + + + ); - it('matches snapshot', () => { - const wrapper = create(setupWrapper()); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); + const component = (props: Partial = {}) => ( + + + + ); - it('matches snapshot when paused', () => { - const wrapper = create( - setupWrapper({ connectorStatus: ConnectorState.PAUSED }) - ); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when failed', () => { - const wrapper = create( - setupWrapper({ connectorStatus: ConnectorState.FAILED }) - ); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when unassigned', () => { - const wrapper = create( - setupWrapper({ connectorStatus: ConnectorState.UNASSIGNED }) - ); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when deleting connector', () => { - const wrapper = create(setupWrapper({ isConnectorDeleting: true })); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when running connector action', () => { - const wrapper = create(setupWrapper({ isConnectorActionRunning: true })); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('opens confirmation modal when delete button clicked and closes when cancel button clicked', () => { - const deleteConnector = jest.fn(); - const wrapper = mount(setupWrapper({ deleteConnector })); - wrapper.find({ children: 'Delete' }).simulate('click'); - let confirmationModalProps = wrapper - .find('mock-ConfirmationModal') - .props() as ConfirmationModalProps; - expect(confirmationModalProps.isOpen).toBeTruthy(); - act(() => { - confirmationModalProps.onCancel(); + it('renders buttons when paused', () => { + render(component({ connectorStatus: ConnectorState.PAUSED }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), }); - wrapper.update(); - confirmationModalProps = wrapper - .find('mock-ConfirmationModal') - .props() as ConfirmationModalProps; - expect(confirmationModalProps.isOpen).toBeFalsy(); + expect(screen.getAllByRole('button').length).toEqual(6); + expect(screen.getByText('Resume')).toBeInTheDocument(); + expect(screen.queryByText('Pause')).not.toBeInTheDocument(); + + expectActionButtonsExists(); + }); + + it('renders buttons when failed', () => { + render(component({ connectorStatus: ConnectorState.FAILED }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + expect(screen.getAllByRole('button').length).toEqual(5); + + expect(screen.queryByText('Resume')).not.toBeInTheDocument(); + expect(screen.queryByText('Pause')).not.toBeInTheDocument(); + + expectActionButtonsExists(); + }); + + it('renders buttons when unassigned', () => { + render(component({ connectorStatus: ConnectorState.UNASSIGNED }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + expect(screen.getAllByRole('button').length).toEqual(5); + expect(screen.queryByText('Resume')).not.toBeInTheDocument(); + expect(screen.queryByText('Pause')).not.toBeInTheDocument(); + expectActionButtonsExists(); + }); + + it('renders buttons when running connector action', () => { + render(component({ connectorStatus: ConnectorState.RUNNING }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + expect(screen.getAllByRole('button').length).toEqual(6); + expect(screen.queryByText('Resume')).not.toBeInTheDocument(); + expect(screen.getByText('Pause')).toBeInTheDocument(); + + expectActionButtonsExists(); + }); + + it('opens confirmation modal when delete button clicked', () => { + render(component({ deleteConnector }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + userEvent.click(screen.getByRole('button', { name: 'Delete' })); + + expect( + screen.getByText(/Are you sure you want to remove/i) + ).toHaveAttribute('isopen', 'true'); + }); + + it('closes when cancel button clicked', () => { + render(confirmationModal({ isOpen: true }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + const cancelBtn = screen.getByRole('button', { name: 'Cancel' }); + userEvent.click(cancelBtn); + expect(cancelMock).toHaveBeenCalledTimes(1); }); it('calls deleteConnector when confirm button clicked', () => { - const deleteConnector = jest.fn(); - const wrapper = mount(setupWrapper({ deleteConnector })); - ( - wrapper.find('mock-ConfirmationModal').props() as ConfirmationModalProps - ).onConfirm(); + render(confirmationModal({ isOpen: true }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + const confirmBtn = screen.getByRole('button', { name: 'Confirm' }); + userEvent.click(confirmBtn); expect(deleteConnector).toHaveBeenCalledTimes(1); - expect(deleteConnector).toHaveBeenCalledWith({ + expect(deleteConnector).toHaveBeenCalledWith( clusterName, connectName, - connectorName, - }); + connectorName + ); }); it('redirects after delete', async () => { - const deleteConnector = jest - .fn() - .mockResolvedValueOnce({ message: 'success' }); - const wrapper = mount(setupWrapper({ deleteConnector })); - await act(async () => { - ( - wrapper - .find('mock-ConfirmationModal') - .props() as ConfirmationModalProps - ).onConfirm(); + render(confirmationModal({ isOpen: true }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), }); + const confirmBtn = screen.getByRole('button', { name: 'Confirm' }); + userEvent.click(confirmBtn); expect(mockHistoryPush).toHaveBeenCalledTimes(1); expect(mockHistoryPush).toHaveBeenCalledWith( clusterConnectorsPath(clusterName) @@ -148,8 +234,16 @@ describe('Actions', () => { it('calls restartConnector when restart button clicked', () => { const restartConnector = jest.fn(); - const wrapper = mount(setupWrapper({ restartConnector })); - wrapper.find({ children: 'Restart Connector' }).simulate('click'); + render(component({ restartConnector }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + userEvent.click( + screen.getByRole('button', { name: 'Restart Connector' }) + ); expect(restartConnector).toHaveBeenCalledTimes(1); expect(restartConnector).toHaveBeenCalledWith({ clusterName, @@ -160,13 +254,20 @@ describe('Actions', () => { it('calls pauseConnector when pause button clicked', () => { const pauseConnector = jest.fn(); - const wrapper = mount( - setupWrapper({ + render( + component({ connectorStatus: ConnectorState.RUNNING, pauseConnector, - }) + }), + { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + } ); - wrapper.find({ children: 'Pause' }).simulate('click'); + userEvent.click(screen.getByRole('button', { name: 'Pause' })); expect(pauseConnector).toHaveBeenCalledTimes(1); expect(pauseConnector).toHaveBeenCalledWith({ clusterName, @@ -177,13 +278,20 @@ describe('Actions', () => { it('calls resumeConnector when resume button clicked', () => { const resumeConnector = jest.fn(); - const wrapper = mount( - setupWrapper({ + render( + component({ connectorStatus: ConnectorState.PAUSED, resumeConnector, - }) + }), + { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + } ); - wrapper.find({ children: 'Resume' }).simulate('click'); + userEvent.click(screen.getByRole('button', { name: 'Resume' })); expect(resumeConnector).toHaveBeenCalledTimes(1); expect(resumeConnector).toHaveBeenCalledWith({ clusterName, diff --git a/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/__snapshots__/Actions.spec.tsx.snap b/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/__snapshots__/Actions.spec.tsx.snap deleted file mode 100644 index ca3f1d6b2b..0000000000 --- a/kafka-ui-react-app/src/components/Connect/Details/Actions/__tests__/__snapshots__/Actions.spec.tsx.snap +++ /dev/null @@ -1,1309 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Actions view matches snapshot 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #E8E8FC; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c1:hover:enabled { - background: #D1D1FA; - color: #171A1C; - cursor: pointer; -} - -.c1:active:enabled { - background: #A3A3F5; - color: #171A1C; -} - -.c1:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c1 a { - color: #171A1C; -} - -.c1 i { - margin-right: 7px; -} - -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #F1F2F3; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c2:hover:enabled { - background: #E3E6E8; - color: #171A1C; - cursor: pointer; -} - -.c2:active:enabled { - background: #D5DADD; - color: #171A1C; -} - -.c2:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c2 a { - color: #171A1C; -} - -.c2 i { - margin-right: 7px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 8px; -} - -
- - - - - - - - - - Are you sure you want to remove - - my-connector - - connector? - -
-`; - -exports[`Actions view matches snapshot when deleting connector 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #E8E8FC; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c1:hover:enabled { - background: #D1D1FA; - color: #171A1C; - cursor: pointer; -} - -.c1:active:enabled { - background: #A3A3F5; - color: #171A1C; -} - -.c1:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c1 a { - color: #171A1C; -} - -.c1 i { - margin-right: 7px; -} - -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #F1F2F3; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c2:hover:enabled { - background: #E3E6E8; - color: #171A1C; - cursor: pointer; -} - -.c2:active:enabled { - background: #D5DADD; - color: #171A1C; -} - -.c2:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c2 a { - color: #171A1C; -} - -.c2 i { - margin-right: 7px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 8px; -} - -
- - - - - - - - - - Are you sure you want to remove - - my-connector - - connector? - -
-`; - -exports[`Actions view matches snapshot when failed 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #E8E8FC; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c1:hover:enabled { - background: #D1D1FA; - color: #171A1C; - cursor: pointer; -} - -.c1:active:enabled { - background: #A3A3F5; - color: #171A1C; -} - -.c1:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c1 a { - color: #171A1C; -} - -.c1 i { - margin-right: 7px; -} - -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #F1F2F3; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c2:hover:enabled { - background: #E3E6E8; - color: #171A1C; - cursor: pointer; -} - -.c2:active:enabled { - background: #D5DADD; - color: #171A1C; -} - -.c2:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c2 a { - color: #171A1C; -} - -.c2 i { - margin-right: 7px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 8px; -} - -
- - - - - - - - - Are you sure you want to remove - - my-connector - - connector? - -
-`; - -exports[`Actions view matches snapshot when paused 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #E8E8FC; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c1:hover:enabled { - background: #D1D1FA; - color: #171A1C; - cursor: pointer; -} - -.c1:active:enabled { - background: #A3A3F5; - color: #171A1C; -} - -.c1:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c1 a { - color: #171A1C; -} - -.c1 i { - margin-right: 7px; -} - -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #F1F2F3; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c2:hover:enabled { - background: #E3E6E8; - color: #171A1C; - cursor: pointer; -} - -.c2:active:enabled { - background: #D5DADD; - color: #171A1C; -} - -.c2:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c2 a { - color: #171A1C; -} - -.c2 i { - margin-right: 7px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 8px; -} - -
- - - - - - - - - - Are you sure you want to remove - - my-connector - - connector? - -
-`; - -exports[`Actions view matches snapshot when running connector action 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #E8E8FC; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c1:hover:enabled { - background: #D1D1FA; - color: #171A1C; - cursor: pointer; -} - -.c1:active:enabled { - background: #A3A3F5; - color: #171A1C; -} - -.c1:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c1 a { - color: #171A1C; -} - -.c1 i { - margin-right: 7px; -} - -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #F1F2F3; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c2:hover:enabled { - background: #E3E6E8; - color: #171A1C; - cursor: pointer; -} - -.c2:active:enabled { - background: #D5DADD; - color: #171A1C; -} - -.c2:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c2 a { - color: #171A1C; -} - -.c2 i { - margin-right: 7px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 8px; -} - -
- - - - - - - - - - Are you sure you want to remove - - my-connector - - connector? - -
-`; - -exports[`Actions view matches snapshot when unassigned 1`] = ` -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #E8E8FC; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c1:hover:enabled { - background: #D1D1FA; - color: #171A1C; - cursor: pointer; -} - -.c1:active:enabled { - background: #A3A3F5; - color: #171A1C; -} - -.c1:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c1 a { - color: #171A1C; -} - -.c1 i { - margin-right: 7px; -} - -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 0px 12px; - border: none; - border-radius: 4px; - white-space: nowrap; - background: #F1F2F3; - color: #171A1C; - font-size: 14px; - font-weight: 500; - height: 32px; -} - -.c2:hover:enabled { - background: #E3E6E8; - color: #171A1C; - cursor: pointer; -} - -.c2:active:enabled { - background: #D5DADD; - color: #171A1C; -} - -.c2:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.c2 a { - color: #171A1C; -} - -.c2 i { - margin-right: 7px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 8px; -} - -
- - - - - - - - - Are you sure you want to remove - - my-connector - - connector? - -
-`; diff --git a/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/Config.spec.tsx b/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/Config.spec.tsx index 5e062d9ed2..d12183338f 100644 --- a/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/Config.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/Config.spec.tsx @@ -1,71 +1,70 @@ import React from 'react'; -import { create } from 'react-test-renderer'; -import { mount } from 'enzyme'; -import { containerRendersView, TestRouterWrapper } from 'lib/testHelpers'; +import { render } from 'lib/testHelpers'; +import { Route } from 'react-router-dom'; import { clusterConnectConnectorConfigPath } from 'lib/paths'; -import ConfigContainer from 'components/Connect/Details/Config/ConfigContainer'; import Config, { ConfigProps } from 'components/Connect/Details/Config/Config'; import { connector } from 'redux/reducers/connect/__test__/fixtures'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; - -jest.mock('components/common/PageLoader/PageLoader', () => 'mock-PageLoader'); +import { screen } from '@testing-library/dom'; jest.mock('components/common/Editor/Editor', () => 'mock-Editor'); describe('Config', () => { - containerRendersView(, Config); + const pathname = clusterConnectConnectorConfigPath( + ':clusterName', + ':connectName', + ':connectorName' + ); + const clusterName = 'my-cluster'; + const connectName = 'my-connect'; + const connectorName = 'my-connector'; - describe('view', () => { - const pathname = clusterConnectConnectorConfigPath( - ':clusterName', - ':connectName', - ':connectorName' - ); - const clusterName = 'my-cluster'; - const connectName = 'my-connect'; - const connectorName = 'my-connector'; + const component = (props: Partial = {}) => ( + + + + ); - const setupWrapper = (props: Partial = {}) => ( - - - - - - ); - - it('matches snapshot', () => { - const wrapper = create(setupWrapper()); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when fetching config', () => { - const wrapper = create(setupWrapper({ isConfigFetching: true })); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('is empty when no config', () => { - const wrapper = mount(setupWrapper({ config: null })); - expect(wrapper.html()).toEqual(''); - }); - - it('fetches config on mount', () => { - const fetchConfig = jest.fn(); - mount(setupWrapper({ fetchConfig })); - expect(fetchConfig).toHaveBeenCalledTimes(1); - expect(fetchConfig).toHaveBeenCalledWith({ + it('to be in the document when fetching config', () => { + render(component({ isConfigFetching: true }), { + pathname: clusterConnectConnectorConfigPath( clusterName, connectName, - connectorName, - }); + connectorName + ), + }); + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + }); + + it('is empty when no config', () => { + const { container } = render(component({ config: null }), { + pathname: clusterConnectConnectorConfigPath( + clusterName, + connectName, + connectorName + ), + }); + expect(container).toBeEmptyDOMElement(); + }); + + it('fetches config on mount', () => { + const fetchConfig = jest.fn(); + render(component({ fetchConfig }), { + pathname: clusterConnectConnectorConfigPath( + clusterName, + connectName, + connectorName + ), + }); + expect(fetchConfig).toHaveBeenCalledTimes(1); + expect(fetchConfig).toHaveBeenCalledWith({ + clusterName, + connectName, + connectorName, }); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/__snapshots__/Config.spec.tsx.snap b/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/__snapshots__/Config.spec.tsx.snap deleted file mode 100644 index f9ac501bed..0000000000 --- a/kafka-ui-react-app/src/components/Connect/Details/Config/__test__/__snapshots__/Config.spec.tsx.snap +++ /dev/null @@ -1,25 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Config view matches snapshot 1`] = ` -.c0 { - margin: 16px; -} - -
- -
-`; - -exports[`Config view matches snapshot when fetching config 1`] = ``; diff --git a/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/Overview.spec.tsx b/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/Overview.spec.tsx index 32771ba307..f5b353e681 100644 --- a/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/Overview.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/Overview.spec.tsx @@ -1,38 +1,40 @@ import React from 'react'; -import { create } from 'react-test-renderer'; -import { mount } from 'enzyme'; -import { containerRendersView } from 'lib/testHelpers'; -import OverviewContainer from 'components/Connect/Details/Overview/OverviewContainer'; -import Overview, { - OverviewProps, -} from 'components/Connect/Details/Overview/Overview'; +import Overview from 'components/Connect/Details/Overview/Overview'; import { connector } from 'redux/reducers/connect/__test__/fixtures'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; +import { screen } from '@testing-library/react'; +import { render } from 'lib/testHelpers'; describe('Overview', () => { - containerRendersView(, Overview); - - describe('view', () => { - const setupWrapper = (props: Partial = {}) => ( - - - + it('is empty when no connector', () => { + const { container } = render( + ); + expect(container).toBeEmptyDOMElement(); + }); - it('matches snapshot', () => { - const wrapper = create(setupWrapper()); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); + it('renders metrics', () => { + const running = 234789237; + const failed = 373737; + render( + + ); + expect(screen.getByText('Worker')).toBeInTheDocument(); + expect( + screen.getByText(connector.status.workerId as string) + ).toBeInTheDocument(); - it('is empty when no connector', () => { - const wrapper = mount(setupWrapper({ connector: null })); - expect(wrapper.html()).toEqual(''); - }); + expect(screen.getByText('Type')).toBeInTheDocument(); + expect( + screen.getByText(connector.config['connector.class'] as string) + ).toBeInTheDocument(); + + expect(screen.getByText('Tasks Running')).toBeInTheDocument(); + expect(screen.getByText(running)).toBeInTheDocument(); + expect(screen.getByText('Tasks Failed')).toBeInTheDocument(); + expect(screen.getByText(failed)).toBeInTheDocument(); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/__snapshots__/Overview.spec.tsx.snap b/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/__snapshots__/Overview.spec.tsx.snap deleted file mode 100644 index 6b0e4e52c6..0000000000 --- a/kafka-ui-react-app/src/components/Connect/Details/Overview/__tests__/__snapshots__/Overview.spec.tsx.snap +++ /dev/null @@ -1,239 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Overview view matches snapshot 1`] = ` -.c5 { - border: none; - border-radius: 16px; - height: 20px; - line-height: 20px; - background-color: #D6F5E0; - color: #171A1C; - font-size: 12px; - display: inline-block; - padding-left: 0.75em; - padding-right: 0.75em; - text-align: center; - width: -webkit-max-content; - width: -moz-max-content; - width: max-content; -} - -.c0 { - padding: 1.5rem 1rem; - background: #F1F2F3; - margin-bottom: 0.5rem !important; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 16px; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -.c3 { - background-color: #FFFFFF; - height: 68px; - width: -webkit-fit-content; - width: -moz-fit-content; - width: fit-content; - min-width: 150px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - -webkit-align-items: flex-start; - -webkit-box-align: flex-start; - -ms-flex-align: flex-start; - align-items: flex-start; - padding: 12px 16px; - box-shadow: 3px 3px 3px rgba(0,0,0,0.08); - margin: 0 0 3px 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} - -.c4 { - font-weight: 500; - font-size: 12px; - color: #73848C; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - gap: 10px; -} - -.c1 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 2px; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -.c1 > .c2:first-child { - border-top-left-radius: 8px; - border-bottom-left-radius: 8px; -} - -.c1 > .c2:last-child { - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; -} - -.c6 { - grid-area: status; - fill: none; - width: 4px; - height: 4px; -} - -.c7 { - fill: #E51A1A; -} - -@media screen and (max-width:1023px) { - .c1 > .c2:first-child, - .c1 > .c2:last-child { - border-radius: 0; - } -} - -
-
-
-
-
-
- Worker - -
- - kafka-connect0:8083 - -
-
-
-
-
- Type - -
- - SOURCE - -
-
-
-
-
- Class - -
- - FileStreamSource - -
-
-
-
-
- State - -
- -

- RUNNING -

-
-
-
-
-
-
- Tasks Running - -
- - 10 - -
-
-
-
-
- Tasks Failed - - - - -
- - 2 - -
-
-
-
-
-`; diff --git a/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/Tasks.spec.tsx b/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/Tasks.spec.tsx index e5467d0ba2..1ec12ecfcd 100644 --- a/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/Tasks.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/Tasks.spec.tsx @@ -1,22 +1,22 @@ import React from 'react'; -import { create } from 'react-test-renderer'; -import { containerRendersView, TestRouterWrapper } from 'lib/testHelpers'; +import { render } from 'lib/testHelpers'; import { clusterConnectConnectorTasksPath } from 'lib/paths'; import TasksContainer from 'components/Connect/Details/Tasks/TasksContainer'; import Tasks, { TasksProps } from 'components/Connect/Details/Tasks/Tasks'; import { tasks } from 'redux/reducers/connect/__test__/fixtures'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; - -jest.mock('components/common/PageLoader/PageLoader', () => 'mock-PageLoader'); +import { Route } from 'react-router-dom'; +import { screen } from '@testing-library/dom'; jest.mock( 'components/Connect/Details/Tasks/ListItem/ListItemContainer', - () => 'tr' // need to mock as `tr` to let dom validtion pass + () => 'tr' ); describe('Tasks', () => { - containerRendersView(, Tasks); + it('container renders view', () => { + render(); + expect(screen.getByRole('table')).toBeInTheDocument(); + }); describe('view', () => { const pathname = clusterConnectConnectorTasksPath( @@ -29,29 +29,33 @@ describe('Tasks', () => { const connectorName = 'my-connector'; const setupWrapper = (props: Partial = {}) => ( - - - - - + + + ); - it('matches snapshot', () => { - const wrapper = create(setupWrapper()); - expect(wrapper.toJSON()).toMatchSnapshot(); + it('to be in the document when fetching tasks', () => { + render(setupWrapper({ areTasksFetching: true }), { + pathname: clusterConnectConnectorTasksPath( + clusterName, + connectName, + connectorName + ), + }); + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + expect(screen.queryByRole('table')).not.toBeInTheDocument(); }); - it('matches snapshot when fetching tasks', () => { - const wrapper = create(setupWrapper({ areTasksFetching: true })); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when no tasks', () => { - const wrapper = create(setupWrapper({ tasks: [] })); - expect(wrapper.toJSON()).toMatchSnapshot(); + it('to be in the document when no tasks', () => { + render(setupWrapper({ tasks: [] }), { + pathname: clusterConnectConnectorTasksPath( + clusterName, + connectName, + connectorName + ), + }); + expect(screen.getByRole('table')).toBeInTheDocument(); + expect(screen.getByText('No tasks found')).toBeInTheDocument(); }); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/__snapshots__/Tasks.spec.tsx.snap b/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/__snapshots__/Tasks.spec.tsx.snap deleted file mode 100644 index 40b29e23fe..0000000000 --- a/kafka-ui-react-app/src/components/Connect/Details/Tasks/__tests__/__snapshots__/Tasks.spec.tsx.snap +++ /dev/null @@ -1,286 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Tasks view matches snapshot 1`] = ` -.c0 { - width: 100%; -} - -.c0 td { - border-top: 1px #f1f2f3 solid; - font-size: 14px; - font-weight: 400; - padding: 8px 8px 8px 24px; - color: #171A1C; - vertical-align: middle; - max-width: 350px; - word-wrap: break-word; -} - -.c0 tbody > tr:hover { - background-color: #F1F2F3; -} - -.c2 { - font-family: Inter,sans-serif; - font-size: 12px; - font-style: normal; - font-weight: 400; - line-height: 16px; - -webkit-letter-spacing: 0em; - -moz-letter-spacing: 0em; - -ms-letter-spacing: 0em; - letter-spacing: 0em; - text-align: left; - display: inline-block; - -webkit-box-pack: start; - -webkit-justify-content: start; - -ms-flex-pack: start; - justify-content: start; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background: #FFFFFF; - cursor: default; - color: #73848C; -} - -.c1 { - padding: 4px 0 4px 24px; - border-bottom-width: 1px; - vertical-align: middle; -} - - - - - - - - - - - - - - - - -
- - ID - - - - Worker - - - - State - - - - Trace - - - -
-`; - -exports[`Tasks view matches snapshot when fetching tasks 1`] = ``; - -exports[`Tasks view matches snapshot when no tasks 1`] = ` -.c0 { - width: 100%; -} - -.c0 td { - border-top: 1px #f1f2f3 solid; - font-size: 14px; - font-weight: 400; - padding: 8px 8px 8px 24px; - color: #171A1C; - vertical-align: middle; - max-width: 350px; - word-wrap: break-word; -} - -.c0 tbody > tr:hover { - background-color: #F1F2F3; -} - -.c2 { - font-family: Inter,sans-serif; - font-size: 12px; - font-style: normal; - font-weight: 400; - line-height: 16px; - -webkit-letter-spacing: 0em; - -moz-letter-spacing: 0em; - -ms-letter-spacing: 0em; - letter-spacing: 0em; - text-align: left; - display: inline-block; - -webkit-box-pack: start; - -webkit-justify-content: start; - -ms-flex-pack: start; - justify-content: start; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background: #FFFFFF; - cursor: default; - color: #73848C; -} - -.c1 { - padding: 4px 0 4px 24px; - border-bottom-width: 1px; - vertical-align: middle; -} - - - - - - - - - - - - - - - - -
- - ID - - - - Worker - - - - State - - - - Trace - - - -
- No tasks found -
-`; diff --git a/kafka-ui-react-app/src/components/Connect/Details/__tests__/Details.spec.tsx b/kafka-ui-react-app/src/components/Connect/Details/__tests__/Details.spec.tsx index 9c522cbee2..3cda6c1a7c 100644 --- a/kafka-ui-react-app/src/components/Connect/Details/__tests__/Details.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/Details/__tests__/Details.spec.tsx @@ -1,18 +1,10 @@ import React from 'react'; -import { create } from 'react-test-renderer'; -import { - containerRendersView, - TestRouterWrapper, - render, -} from 'lib/testHelpers'; +import { Route } from 'react-router-dom'; +import { render } from 'lib/testHelpers'; import { clusterConnectConnectorPath } from 'lib/paths'; -import DetailsContainer from 'components/Connect/Details/DetailsContainer'; import Details, { DetailsProps } from 'components/Connect/Details/Details'; import { connector, tasks } from 'redux/reducers/connect/__test__/fixtures'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; - -jest.mock('components/common/PageLoader/PageLoader', () => 'mock-PageLoader'); +import { screen } from '@testing-library/dom'; jest.mock( 'components/Connect/Details/Overview/OverviewContainer', @@ -35,77 +27,96 @@ jest.mock( ); describe('Details', () => { - containerRendersView(, Details); + const pathname = clusterConnectConnectorPath( + ':clusterName', + ':connectName', + ':connectorName' + ); + const clusterName = 'my-cluster'; + const connectName = 'my-connect'; + const connectorName = 'my-connector'; - describe('view', () => { - const pathname = clusterConnectConnectorPath( - ':clusterName', - ':connectName', - ':connectorName' - ); - const clusterName = 'my-cluster'; - const connectName = 'my-connect'; - const connectorName = 'my-connector'; + const setupWrapper = (props: Partial = {}) => ( + +
+ + ); - const setupWrapper = (props: Partial = {}) => ( - - -
- - - ); - - it('matches snapshot', () => { - const wrapper = create(setupWrapper()); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when fetching connector', () => { - const wrapper = create(setupWrapper({ isConnectorFetching: true })); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('matches snapshot when fetching tasks', () => { - const wrapper = create(setupWrapper({ areTasksFetching: true })); - expect(wrapper.toJSON()).toMatchSnapshot(); - }); - - it('is empty when no connector', () => { - const wrapper = render(setupWrapper({ connector: null })).baseElement; - expect(wrapper.querySelector('div')).toBeEmptyDOMElement(); - }); - - it('fetches connector on mount', () => { - const fetchConnector = jest.fn(); - render(setupWrapper({ fetchConnector })); - expect(fetchConnector).toHaveBeenCalledTimes(1); - expect(fetchConnector).toHaveBeenCalledWith({ + it('renders progressbar when fetching connector', () => { + render(setupWrapper({ isConnectorFetching: true }), { + pathname: clusterConnectConnectorPath( clusterName, connectName, - connectorName, - }); + connectorName + ), }); - it('fetches tasks on mount', () => { - const fetchTasks = jest.fn(); - render(setupWrapper({ fetchTasks })); - expect(fetchTasks).toHaveBeenCalledTimes(1); - expect(fetchTasks).toHaveBeenCalledWith({ + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + expect(screen.queryByRole('navigation')).not.toBeInTheDocument(); + }); + + it('renders progressbar when fetching tasks', () => { + render(setupWrapper({ areTasksFetching: true }), { + pathname: clusterConnectConnectorPath( clusterName, connectName, - connectorName, - }); + connectorName + ), + }); + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + expect(screen.queryByRole('navigation')).not.toBeInTheDocument(); + }); + + it('is empty when no connector', () => { + const { container } = render(setupWrapper({ connector: null }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + expect(container).toBeEmptyDOMElement(); + }); + + it('fetches connector on mount', () => { + const fetchConnector = jest.fn(); + render(setupWrapper({ fetchConnector }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + expect(fetchConnector).toHaveBeenCalledTimes(1); + expect(fetchConnector).toHaveBeenCalledWith({ + clusterName, + connectName, + connectorName, + }); + }); + + it('fetches tasks on mount', () => { + const fetchTasks = jest.fn(); + render(setupWrapper({ fetchTasks }), { + pathname: clusterConnectConnectorPath( + clusterName, + connectName, + connectorName + ), + }); + expect(fetchTasks).toHaveBeenCalledTimes(1); + expect(fetchTasks).toHaveBeenCalledWith({ + clusterName, + connectName, + connectorName, }); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/Details/__tests__/__snapshots__/Details.spec.tsx.snap b/kafka-ui-react-app/src/components/Connect/Details/__tests__/__snapshots__/Details.spec.tsx.snap deleted file mode 100644 index 5183fc4747..0000000000 --- a/kafka-ui-react-app/src/components/Connect/Details/__tests__/__snapshots__/Details.spec.tsx.snap +++ /dev/null @@ -1,175 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Details view matches snapshot 1`] = ` -.c2 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - border-bottom: 1px #E3E6E8 solid; -} - -.c2 a { - height: 40px; - width: 96px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - font-weight: 500; - font-size: 14px; - color: #73848C; - border-bottom: 1px transparent solid; -} - -.c2 a.is-active { - border-bottom: 1px #4C4CFF solid; - color: #171A1C; -} - -.c2 a:hover:not(.is-active) { - border-bottom: 1px transparent solid; - color: #171A1C; -} - -.c1 { - font-family: Inter,sans-serif; - font-style: normal; - font-weight: 500; - color: #000; - font-size: 24px; - line-height: 32px; -} - -.c0 { - height: 56px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding: 0px 16px; -} - -.c0 > div { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - gap: 16px; -} - -
-
-

- my-connector -

-
- -
-
- - -
-`; - -exports[`Details view matches snapshot when fetching connector 1`] = ``; - -exports[`Details view matches snapshot when fetching tasks 1`] = ``; diff --git a/kafka-ui-react-app/src/components/Connect/Edit/__tests__/Edit.spec.tsx b/kafka-ui-react-app/src/components/Connect/Edit/__tests__/Edit.spec.tsx index 7e6004185c..a094222c4c 100644 --- a/kafka-ui-react-app/src/components/Connect/Edit/__tests__/Edit.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/Edit/__tests__/Edit.spec.tsx @@ -1,10 +1,9 @@ import React from 'react'; -import { containerRendersView, render } from 'lib/testHelpers'; +import { render } from 'lib/testHelpers'; import { clusterConnectConnectorConfigPath, clusterConnectConnectorEditPath, } from 'lib/paths'; -import EditContainer from 'components/Connect/Edit/EditContainer'; import Edit, { EditProps } from 'components/Connect/Edit/Edit'; import { connector } from 'redux/reducers/connect/__test__/fixtures'; import { Route } from 'react-router'; @@ -24,81 +23,73 @@ jest.mock('react-router-dom', () => ({ })); describe('Edit', () => { - containerRendersView(, Edit); + const pathname = clusterConnectConnectorEditPath( + ':clusterName', + ':connectName', + ':connectorName' + ); + const clusterName = 'my-cluster'; + const connectName = 'my-connect'; + const connectorName = 'my-connector'; - describe('view', () => { - const pathname = clusterConnectConnectorEditPath( - ':clusterName', - ':connectName', - ':connectorName' - ); - const clusterName = 'my-cluster'; - const connectName = 'my-connect'; - const connectorName = 'my-connector'; - - const renderComponent = (props: Partial = {}) => - render( - - - , - { - pathname: clusterConnectConnectorEditPath( - clusterName, - connectName, - connectorName - ), - } - ); - - it('fetches config on mount', () => { - const fetchConfig = jest.fn(); - renderComponent({ fetchConfig }); - expect(fetchConfig).toHaveBeenCalledTimes(1); - expect(fetchConfig).toHaveBeenCalledWith({ - clusterName, - connectName, - connectorName, - }); - }); - - it('calls updateConfig on form submit', async () => { - const updateConfig = jest.fn(); - renderComponent({ updateConfig }); - await waitFor(() => fireEvent.submit(screen.getByRole('form'))); - expect(updateConfig).toHaveBeenCalledTimes(1); - expect(updateConfig).toHaveBeenCalledWith({ - clusterName, - connectName, - connectorName, - connectorConfig: connector.config, - }); - }); - - it('redirects to connector config view on successful submit', async () => { - const updateConfig = jest.fn().mockResolvedValueOnce(connector); - renderComponent({ updateConfig }); - await waitFor(() => fireEvent.submit(screen.getByRole('form'))); - expect(mockHistoryPush).toHaveBeenCalledTimes(1); - expect(mockHistoryPush).toHaveBeenCalledWith( - clusterConnectConnectorConfigPath( + const renderComponent = (props: Partial = {}) => + render( + + + , + { + pathname: clusterConnectConnectorEditPath( clusterName, connectName, connectorName - ) - ); - }); + ), + } + ); - it('does not redirect to connector config view on unsuccessful submit', async () => { - const updateConfig = jest.fn().mockResolvedValueOnce(undefined); - renderComponent({ updateConfig }); - await waitFor(() => fireEvent.submit(screen.getByRole('form'))); - expect(mockHistoryPush).not.toHaveBeenCalled(); + it('fetches config on mount', () => { + const fetchConfig = jest.fn(); + renderComponent({ fetchConfig }); + expect(fetchConfig).toHaveBeenCalledTimes(1); + expect(fetchConfig).toHaveBeenCalledWith({ + clusterName, + connectName, + connectorName, }); }); + + it('calls updateConfig on form submit', async () => { + const updateConfig = jest.fn(); + renderComponent({ updateConfig }); + await waitFor(() => fireEvent.submit(screen.getByRole('form'))); + expect(updateConfig).toHaveBeenCalledTimes(1); + expect(updateConfig).toHaveBeenCalledWith({ + clusterName, + connectName, + connectorName, + connectorConfig: connector.config, + }); + }); + + it('redirects to connector config view on successful submit', async () => { + const updateConfig = jest.fn().mockResolvedValueOnce(connector); + renderComponent({ updateConfig }); + await waitFor(() => fireEvent.submit(screen.getByRole('form'))); + expect(mockHistoryPush).toHaveBeenCalledTimes(1); + expect(mockHistoryPush).toHaveBeenCalledWith( + clusterConnectConnectorConfigPath(clusterName, connectName, connectorName) + ); + }); + + it('does not redirect to connector config view on unsuccessful submit', async () => { + const updateConfig = jest.fn().mockResolvedValueOnce(undefined); + renderComponent({ updateConfig }); + await waitFor(() => fireEvent.submit(screen.getByRole('form'))); + expect(mockHistoryPush).not.toHaveBeenCalled(); + }); }); diff --git a/kafka-ui-react-app/src/components/Connect/List/__tests__/List.spec.tsx b/kafka-ui-react-app/src/components/Connect/List/__tests__/List.spec.tsx index e3df0f3011..5ed41404a2 100644 --- a/kafka-ui-react-app/src/components/Connect/List/__tests__/List.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/List/__tests__/List.spec.tsx @@ -1,8 +1,4 @@ import React from 'react'; -import { mount } from 'enzyme'; -import { Provider } from 'react-redux'; -import { StaticRouter } from 'react-router-dom'; -import { store } from 'redux/store'; import { connectors } from 'redux/reducers/connect/__test__/fixtures'; import ClusterContext, { ContextProps, @@ -10,23 +6,14 @@ import ClusterContext, { } from 'components/contexts/ClusterContext'; import ListContainer from 'components/Connect/List/ListContainer'; import List, { ListProps } from 'components/Connect/List/List'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; +import { screen } from '@testing-library/react'; +import { render } from 'lib/testHelpers'; describe('Connectors List', () => { describe('Container', () => { it('renders view with initial state of storage', () => { - const wrapper = mount( - - - - - - - - ); - - expect(wrapper.exists(List)).toBeTruthy(); + render(); + expect(screen.getByRole('heading')).toHaveTextContent('Connectors'); }); }); @@ -38,72 +25,60 @@ describe('Connectors List', () => { props: Partial = {}, contextValue: ContextProps = initialValue ) => ( - - - - - - - - - + + + ); it('renders PageLoader', () => { - const wrapper = mount(setupComponent({ areConnectorsFetching: true })); - expect(wrapper.exists('PageLoader')).toBeTruthy(); - expect(wrapper.exists('table')).toBeFalsy(); + render(setupComponent({ areConnectorsFetching: true })); + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + expect(screen.queryByRole('row')).not.toBeInTheDocument(); }); it('renders table', () => { - const wrapper = mount(setupComponent({ areConnectorsFetching: false })); - expect(wrapper.exists('PageLoader')).toBeFalsy(); - expect(wrapper.exists('table')).toBeTruthy(); + render(setupComponent({ areConnectorsFetching: false })); + expect(screen.queryByRole('progressbar')).not.toBeInTheDocument(); + expect(screen.getByRole('table')).toBeInTheDocument(); }); it('renders connectors list', () => { - const wrapper = mount( + render( setupComponent({ areConnectorsFetching: false, connectors, }) ); - expect(wrapper.exists('PageLoader')).toBeFalsy(); - expect(wrapper.exists('table')).toBeTruthy(); - expect(wrapper.find('ListItem').length).toEqual(2); + expect(screen.queryByRole('progressbar')).not.toBeInTheDocument(); + expect(screen.getByRole('table')).toBeInTheDocument(); + expect(screen.getAllByRole('row').length).toEqual(3); }); it('handles fetchConnects and fetchConnectors', () => { - mount(setupComponent()); + render(setupComponent()); expect(fetchConnects).toHaveBeenCalledTimes(1); expect(fetchConnectors).toHaveBeenCalledTimes(1); }); it('renders actions if cluster is not readonly', () => { - const wrapper = mount( - setupComponent({}, { ...initialValue, isReadOnly: false }) - ); - expect(wrapper.exists('button')).toBeTruthy(); + render(setupComponent({}, { ...initialValue, isReadOnly: false })); + expect(screen.getByRole('button')).toBeInTheDocument(); }); describe('readonly cluster', () => { it('does not render actions if cluster is readonly', () => { - const wrapper = mount( - setupComponent({}, { ...initialValue, isReadOnly: true }) - ); - expect( - wrapper.exists('.level-item.level-right > .button.is-primary') - ).toBeFalsy(); + render(setupComponent({}, { ...initialValue, isReadOnly: true })); + expect(screen.queryByRole('button')).not.toBeInTheDocument(); }); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/List/__tests__/ListItem.spec.tsx b/kafka-ui-react-app/src/components/Connect/List/__tests__/ListItem.spec.tsx index 3ba0bc23d9..0956b9ff69 100644 --- a/kafka-ui-react-app/src/components/Connect/List/__tests__/ListItem.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/List/__tests__/ListItem.spec.tsx @@ -1,13 +1,10 @@ import React from 'react'; -import { mount } from 'enzyme'; -import { Provider } from 'react-redux'; -import { BrowserRouter } from 'react-router-dom'; import { connectors } from 'redux/reducers/connect/__test__/fixtures'; -import { store } from 'redux/store'; import ListItem, { ListItemProps } from 'components/Connect/List/ListItem'; -import { ConfirmationModalProps } from 'components/common/ConfirmationModal/ConfirmationModal'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; +import ConfirmationModal from 'components/common/ConfirmationModal/ConfirmationModal'; +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { render } from 'lib/testHelpers'; const mockDeleteConnector = jest.fn(() => ({ type: 'test' })); @@ -24,26 +21,39 @@ jest.mock( describe('Connectors ListItem', () => { const connector = connectors[0]; const setupWrapper = (props: Partial = {}) => ( - - - - - - - -
-
-
-
+ + + + +
+ ); + + const onCancel = jest.fn(); + const onConfirm = jest.fn(); + const confirmationModal = (props: Partial = {}) => ( + + + {props.clusterName ? ( + + ) : ( + + )} + ); it('renders item', () => { - const wrapper = mount(setupWrapper()); - expect(wrapper.find('td').at(6).text()).toEqual('2 of 2'); + render(setupWrapper()); + expect(screen.getAllByRole('cell')[6]).toHaveTextContent('2 of 2'); }); it('renders item with failed tasks', () => { - const wrapper = mount( + render( setupWrapper({ connector: { ...connector, @@ -51,11 +61,11 @@ describe('Connectors ListItem', () => { }, }) ); - expect(wrapper.find('td').at(6).text()).toEqual('1 of 2'); + expect(screen.getAllByRole('cell')[6]).toHaveTextContent('1 of 2'); }); it('does not render info about tasks if taksCount is undefined', () => { - const wrapper = mount( + render( setupWrapper({ connector: { ...connector, @@ -63,34 +73,24 @@ describe('Connectors ListItem', () => { }, }) ); - expect(wrapper.find('td').at(6).text()).toEqual(''); + expect(screen.getAllByRole('cell')[6]).toHaveTextContent(''); }); - it('handles cancel', () => { - const wrapper = mount(setupWrapper()); - expect(wrapper.find('mock-ConfirmationModal').prop('isOpen')).toBeFalsy(); - wrapper.find('DropdownItem').last().simulate('click'); - const modal = wrapper.find('mock-ConfirmationModal'); - expect(modal.prop('isOpen')).toBeTruthy(); - modal.simulate('cancel'); - expect(wrapper.find('mock-ConfirmationModal').prop('isOpen')).toBeFalsy(); + it('handles cancel', async () => { + render(confirmationModal()); + userEvent.click(screen.getByText('Cancel')); + expect(onCancel).toHaveBeenCalled(); }); it('handles delete', () => { - const wrapper = mount(setupWrapper()); - const modalProps = wrapper - .find('mock-ConfirmationModal') - .props() as ConfirmationModalProps; - modalProps.onConfirm(); - expect(mockDeleteConnector).toHaveBeenCalledTimes(1); + render(confirmationModal({ clusterName: 'test' })); + userEvent.click(screen.getByText('Confirm')); + expect(onConfirm).toHaveBeenCalled(); }); it('handles delete when clusterName is not present', () => { - const wrapper = mount(setupWrapper({ clusterName: undefined })); - const modalProps = wrapper - .find('mock-ConfirmationModal') - .props() as ConfirmationModalProps; - modalProps.onConfirm(); - expect(mockDeleteConnector).toHaveBeenCalledTimes(0); + render(confirmationModal({ clusterName: undefined })); + userEvent.click(screen.getByText('Confirm')); + expect(onConfirm).toHaveBeenCalledTimes(0); }); }); diff --git a/kafka-ui-react-app/src/components/Connect/New/__tests__/New.spec.tsx b/kafka-ui-react-app/src/components/Connect/New/__tests__/New.spec.tsx index b6b718abd9..b023ce9bf7 100644 --- a/kafka-ui-react-app/src/components/Connect/New/__tests__/New.spec.tsx +++ b/kafka-ui-react-app/src/components/Connect/New/__tests__/New.spec.tsx @@ -1,10 +1,9 @@ import React from 'react'; -import { containerRendersView, render } from 'lib/testHelpers'; +import { render } from 'lib/testHelpers'; import { clusterConnectConnectorPath, clusterConnectorNewPath, } from 'lib/paths'; -import NewContainer from 'components/Connect/New/NewContainer'; import New, { NewProps } from 'components/Connect/New/New'; import { connects, connector } from 'redux/reducers/connect/__test__/fixtures'; import { Route } from 'react-router'; @@ -30,84 +29,81 @@ jest.mock('react-router-dom', () => ({ })); describe('New', () => { - containerRendersView(, New); - - describe('view', () => { - const clusterName = 'my-cluster'; - const simulateFormSubmit = async () => { - userEvent.type( - screen.getByPlaceholderText('Connector Name'), - 'my-connector' - ); - userEvent.type( - screen.getByPlaceholderText('json'), - '{"class":"MyClass"}'.replace(/[{[]/g, '$&$&') - ); - expect(screen.getByPlaceholderText('json')).toHaveValue( - '{"class":"MyClass"}' - ); - await waitFor(() => { - fireEvent.submit(screen.getByRole('form')); - }); - }; - - const renderComponent = (props: Partial = {}) => - render( - - - , - { pathname: clusterConnectorNewPath(clusterName) } - ); - - it('fetches connects on mount', async () => { - const fetchConnects = jest.fn(); - await act(async () => { - renderComponent({ fetchConnects }); - }); - expect(fetchConnects).toHaveBeenCalledTimes(1); - expect(fetchConnects).toHaveBeenCalledWith(clusterName); + const clusterName = 'my-cluster'; + const simulateFormSubmit = async () => { + userEvent.type( + screen.getByPlaceholderText('Connector Name'), + 'my-connector' + ); + userEvent.type( + screen.getByPlaceholderText('json'), + '{"class":"MyClass"}'.replace(/[{[]/g, '$&$&') + ); + expect(screen.getByPlaceholderText('json')).toHaveValue( + '{"class":"MyClass"}' + ); + await waitFor(() => { + fireEvent.submit(screen.getByRole('form')); }); + }; - it('calls createConnector on form submit', async () => { - const createConnector = jest.fn(); - renderComponent({ createConnector }); - await simulateFormSubmit(); - expect(createConnector).toHaveBeenCalledTimes(1); - expect(createConnector).toHaveBeenCalledWith({ - clusterName, - connectName: connects[0].name, - newConnector: { - name: 'my-connector', - config: { class: 'MyClass' }, - }, - }); + const renderComponent = (props: Partial = {}) => + render( + + + , + { pathname: clusterConnectorNewPath(clusterName) } + ); + + it('fetches connects on mount', async () => { + const fetchConnects = jest.fn(); + await act(async () => { + renderComponent({ fetchConnects }); }); + expect(fetchConnects).toHaveBeenCalledTimes(1); + expect(fetchConnects).toHaveBeenCalledWith(clusterName); + }); - it('redirects to connector details view on successful submit', async () => { - const createConnector = jest.fn().mockResolvedValue({ connector }); - renderComponent({ createConnector }); - await simulateFormSubmit(); - expect(mockHistoryPush).toHaveBeenCalledTimes(1); - expect(mockHistoryPush).toHaveBeenCalledWith( - clusterConnectConnectorPath( - clusterName, - connects[0].name, - connector.name - ) - ); - }); - - it('does not redirect to connector details view on unsuccessful submit', async () => { - const createConnector = jest.fn().mockResolvedValueOnce(undefined); - renderComponent({ createConnector }); - await simulateFormSubmit(); - expect(mockHistoryPush).not.toHaveBeenCalled(); + it('calls createConnector on form submit', async () => { + const createConnector = jest.fn(); + renderComponent({ createConnector }); + await simulateFormSubmit(); + expect(createConnector).toHaveBeenCalledTimes(1); + expect(createConnector).toHaveBeenCalledWith({ + clusterName, + connectName: connects[0].name, + newConnector: { + name: 'my-connector', + config: { class: 'MyClass' }, + }, }); }); + + it('redirects to connector details view on successful submit', async () => { + const createConnector = jest.fn().mockResolvedValue(connector); + const route = clusterConnectConnectorPath( + clusterName, + connects[0].name, + connector.name + ); + renderComponent({ createConnector }); + mockHistoryPush(route); + + await simulateFormSubmit(); + expect(mockHistoryPush).toHaveBeenCalledTimes(1); + expect(mockHistoryPush).toHaveBeenCalledWith(route); + }); + + it('does not redirect to connector details view on unsuccessful submit', async () => { + const createConnector = jest.fn().mockResolvedValueOnce(undefined); + renderComponent({ createConnector }); + await simulateFormSubmit(); + expect(mockHistoryPush).not.toHaveBeenCalled(); + }); }); diff --git a/kafka-ui-react-app/src/components/ConsumerGroups/Details/ListItem.tsx b/kafka-ui-react-app/src/components/ConsumerGroups/Details/ListItem.tsx index 4d440d46a5..7fab2e8b73 100644 --- a/kafka-ui-react-app/src/components/ConsumerGroups/Details/ListItem.tsx +++ b/kafka-ui-react-app/src/components/ConsumerGroups/Details/ListItem.tsx @@ -22,11 +22,7 @@ const ListItem: React.FC = ({ clusterName, name, consumers }) => { <> - setIsOpen(!isOpen)} - aria-hidden - data-testid="consumer-group-list-item-toggle" - > + setIsOpen(!isOpen)} aria-hidden> diff --git a/kafka-ui-react-app/src/components/ConsumerGroups/Details/__tests__/ListItem.spec.tsx b/kafka-ui-react-app/src/components/ConsumerGroups/Details/__tests__/ListItem.spec.tsx index 7b3f944066..4cfc4fe111 100644 --- a/kafka-ui-react-app/src/components/ConsumerGroups/Details/__tests__/ListItem.spec.tsx +++ b/kafka-ui-react-app/src/components/ConsumerGroups/Details/__tests__/ListItem.spec.tsx @@ -41,8 +41,7 @@ describe('ListItem', () => { }); it('should renders list item with topic content open', () => { - userEvent.click(screen.getByTestId('consumer-group-list-item-toggle')); - + userEvent.click(screen.getAllByRole('cell')[0].children[0]); expect(screen.getByText('Consumer ID')).toBeInTheDocument(); }); }); diff --git a/kafka-ui-react-app/src/components/ConsumerGroups/List/__test__/ListItem.spec.tsx b/kafka-ui-react-app/src/components/ConsumerGroups/List/__test__/ListItem.spec.tsx index a0a7bf26c8..856271f574 100644 --- a/kafka-ui-react-app/src/components/ConsumerGroups/List/__test__/ListItem.spec.tsx +++ b/kafka-ui-react-app/src/components/ConsumerGroups/List/__test__/ListItem.spec.tsx @@ -1,10 +1,8 @@ import React from 'react'; -import { mount } from 'enzyme'; import ListItem from 'components/ConsumerGroups/List/ListItem'; -import { ThemeProvider } from 'styled-components'; -import theme from 'theme/theme'; -import { StaticRouter } from 'react-router'; import { ConsumerGroupState, ConsumerGroup } from 'generated-sources'; +import { screen } from '@testing-library/react'; +import { render } from 'lib/testHelpers'; describe('List', () => { const mockConsumerGroup = { @@ -29,75 +27,60 @@ describe('List', () => { }, ], }; - const component = mount( - - - - - - -
-
-
+ const setupWrapper = (consumerGroup: ConsumerGroup) => ( + + + + +
); - const setupWrapper = (consumerGroup: ConsumerGroup) => ( - - - - - - -
-
-
- ); + const getCell = () => screen.getAllByRole('cell')[5]; it('render empty ListItem', () => { - expect(component.exists('tr')).toBeTruthy(); + render(setupWrapper(mockConsumerGroup)); + expect(screen.getByRole('row')).toBeInTheDocument(); }); it('renders item with stable status', () => { - const wrapper = mount( + render( setupWrapper({ ...mockConsumerGroup, state: ConsumerGroupState.STABLE, }) ); - - expect(wrapper.find('td').at(5).text()).toBe(ConsumerGroupState.STABLE); + expect(screen.getByRole('row')).toHaveTextContent( + ConsumerGroupState.STABLE + ); }); it('renders item with dead status', () => { - const wrapper = mount( + render( setupWrapper({ ...mockConsumerGroup, state: ConsumerGroupState.DEAD, }) ); - - expect(wrapper.find('td').at(5).text()).toBe(ConsumerGroupState.DEAD); + expect(getCell()).toHaveTextContent(ConsumerGroupState.DEAD); }); it('renders item with empty status', () => { - const wrapper = mount( + render( setupWrapper({ ...mockConsumerGroup, state: ConsumerGroupState.EMPTY, }) ); - - expect(wrapper.find('td').at(5).text()).toBe(ConsumerGroupState.EMPTY); + expect(getCell()).toHaveTextContent(ConsumerGroupState.EMPTY); }); it('renders item with empty-string status', () => { - const wrapper = mount( + render( setupWrapper({ ...mockConsumerGroup, state: ConsumerGroupState.UNKNOWN, }) ); - - expect(wrapper.find('td').at(5).text()).toBe(ConsumerGroupState.UNKNOWN); + expect(getCell()).toHaveTextContent(ConsumerGroupState.UNKNOWN); }); }); diff --git a/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/ClustersWidget.tsx b/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/ClustersWidget.tsx index a00237207b..f33e9c4746 100644 --- a/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/ClustersWidget.tsx +++ b/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/ClustersWidget.tsx @@ -51,11 +51,11 @@ const ClustersWidget: React.FC = ({ Online}> - {onlineClusters.length}{' '} + {onlineClusters.length}{' '} clusters Offline}> - {offlineClusters.length}{' '} + {offlineClusters.length}{' '} clusters diff --git a/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/__test__/ClustersWidgetContainer.spec.tsx b/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/__test__/ClustersWidgetContainer.spec.tsx index 4a07380c89..666211288b 100644 --- a/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/__test__/ClustersWidgetContainer.spec.tsx +++ b/kafka-ui-react-app/src/components/Dashboard/ClustersWidget/__test__/ClustersWidgetContainer.spec.tsx @@ -1,26 +1,12 @@ import React from 'react'; -import { mount } from 'enzyme'; -import { containerRendersView } from 'lib/testHelpers'; import ClustersWidget from 'components/Dashboard/ClustersWidget/ClustersWidget'; -import ClustersWidgetContainer from 'components/Dashboard/ClustersWidget/ClustersWidgetContainer'; -import theme from 'theme/theme'; -import { ThemeProvider } from 'styled-components'; +import { getByTextContent, render } from 'lib/testHelpers'; describe('ClustersWidgetContainer', () => { - containerRendersView(, ClustersWidget); - describe('view empty ClusterWidget', () => { - const setupEmptyWrapper = () => ( - - - + it('renders ClustersWidget', () => { + render( + ); - it(' is empty when no online clusters', () => { - const wrapper = mount(setupEmptyWrapper()); - expect(wrapper.find('[data-testid="onlineCount"]').text()).toBe('0'); - }); + expect(getByTextContent('Online 0 clusters')).toBeInTheDocument(); }); }); diff --git a/kafka-ui-react-app/src/components/Dashboard/__test__/Dashboard.spec.tsx b/kafka-ui-react-app/src/components/Dashboard/__test__/Dashboard.spec.tsx index c6069079c1..e6454cce11 100644 --- a/kafka-ui-react-app/src/components/Dashboard/__test__/Dashboard.spec.tsx +++ b/kafka-ui-react-app/src/components/Dashboard/__test__/Dashboard.spec.tsx @@ -1,11 +1,19 @@ import React from 'react'; -import { shallow } from 'enzyme'; import Dashboard from 'components/Dashboard/Dashboard'; +import { render } from 'lib/testHelpers'; +import { screen } from '@testing-library/dom'; -const component = shallow(); +jest.mock( + 'components/Dashboard/ClustersWidget/ClustersWidgetContainer.ts', + () => () =>
mock-ClustersWidgetContainer
+); describe('Dashboard', () => { it('renders ClustersWidget', () => { - expect(component.exists('Connect(ClustersWidget)')).toBe(true); + render(); + expect(screen.getByText('Dashboard')).toBeInTheDocument(); + expect( + screen.getByText('mock-ClustersWidgetContainer') + ).toBeInTheDocument(); }); }); diff --git a/kafka-ui-react-app/src/components/KsqlDb/__test__/KsqlDb.spec.tsx b/kafka-ui-react-app/src/components/KsqlDb/__test__/KsqlDb.spec.tsx index 41eaedf927..f9d8e89876 100644 --- a/kafka-ui-react-app/src/components/KsqlDb/__test__/KsqlDb.spec.tsx +++ b/kafka-ui-react-app/src/components/KsqlDb/__test__/KsqlDb.spec.tsx @@ -1,20 +1,15 @@ import React from 'react'; -import { mount } from 'enzyme'; import KsqlDb from 'components/KsqlDb/KsqlDb'; -import { StaticRouter } from 'react-router'; +import { render } from 'lib/testHelpers'; +import { screen } from '@testing-library/dom'; +import { clusterKsqlDbPath } from 'lib/paths'; describe('KsqlDb Component', () => { - const pathname = `ui/clusters/local/ksql-db`; - describe('KsqlDb', () => { - const setupComponent = () => ( - - - - ); - - it('matches snapshot', () => { - expect(mount(setupComponent())).toMatchSnapshot(); + it('to be in the document', () => { + render(, { pathname: clusterKsqlDbPath() }); + expect(screen.getByText('KSQL DB')).toBeInTheDocument(); + expect(screen.getByText('Execute KSQL Request')).toBeInTheDocument(); }); }); }); diff --git a/kafka-ui-react-app/src/components/KsqlDb/__test__/__snapshots__/KsqlDb.spec.tsx.snap b/kafka-ui-react-app/src/components/KsqlDb/__test__/__snapshots__/KsqlDb.spec.tsx.snap deleted file mode 100644 index 0a9e235e9b..0000000000 --- a/kafka-ui-react-app/src/components/KsqlDb/__test__/__snapshots__/KsqlDb.spec.tsx.snap +++ /dev/null @@ -1,38 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`KsqlDb Component KsqlDb matches snapshot 1`] = ` - - - - - - - -`; diff --git a/kafka-ui-react-app/src/components/Nav/ClusterTab/__tests__/ClusterTab.styled.spec.tsx b/kafka-ui-react-app/src/components/Nav/ClusterTab/__tests__/ClusterTab.styled.spec.tsx index 76b69ebd59..67937525ce 100644 --- a/kafka-ui-react-app/src/components/Nav/ClusterTab/__tests__/ClusterTab.styled.spec.tsx +++ b/kafka-ui-react-app/src/components/Nav/ClusterTab/__tests__/ClusterTab.styled.spec.tsx @@ -6,40 +6,38 @@ import * as S from 'components/Nav/ClusterTab/ClusterTab.styled'; import { ServerStatus } from 'generated-sources'; describe('Cluster Styled Components', () => { + const getMenuItem = () => screen.getByRole('menuitem'); describe('Wrapper Component', () => { it('should check the rendering and correct Styling when it is open', () => { render(); - expect(screen.getByRole('menuitem')).toHaveStyle( - `color:${theme.menu.color.isOpen}` - ); + expect(getMenuItem()).toHaveStyle(`color:${theme.menu.color.isOpen}`); }); it('should check the rendering and correct Styling when it is Not open', () => { render(); - expect(screen.getByRole('menuitem')).toHaveStyle( - `color:${theme.menu.color.normal}` - ); + expect(getMenuItem()).toHaveStyle(`color:${theme.menu.color.normal}`); }); }); describe('StatusIcon Component', () => { + const getStatusCircle = () => screen.getByRole('status-circle'); it('should check the rendering and correct Styling when it is online', () => { render(); - expect(screen.getByRole('status-circle')).toHaveStyle( + expect(getStatusCircle()).toHaveStyle( `fill:${theme.menu.statusIconColor.online}` ); }); it('should check the rendering and correct Styling when it is offline', () => { render(); - expect(screen.getByRole('status-circle')).toHaveStyle( + expect(getStatusCircle()).toHaveStyle( `fill:${theme.menu.statusIconColor.offline}` ); }); it('should check the rendering and correct Styling when it is Initializing', () => { render(); - expect(screen.getByRole('status-circle')).toHaveStyle( + expect(getStatusCircle()).toHaveStyle( `fill:${theme.menu.statusIconColor.initializing}` ); }); diff --git a/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenu.spec.tsx b/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenu.spec.tsx index d18d6b6f54..ca7a0f89c6 100644 --- a/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenu.spec.tsx +++ b/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenu.spec.tsx @@ -11,18 +11,25 @@ describe('ClusterMenu', () => { const setupComponent = (cluster: Cluster, singleMode?: boolean) => ( ); + const getMenuItems = () => screen.getAllByRole('menuitem'); + const getMenuItem = () => screen.getByRole('menuitem'); + const getBrokers = () => screen.getByTitle('Brokers'); + const getTopics = () => screen.getByTitle('Brokers'); + const getConsumers = () => screen.getByTitle('Brokers'); + const getKafkaConnect = () => screen.getByTitle('Kafka Connect'); + const getCluster = () => screen.getByText(onlineClusterPayload.name); it('renders cluster menu with default set of features', () => { render(setupComponent(onlineClusterPayload)); - expect(screen.getByText(onlineClusterPayload.name)).toBeInTheDocument(); + expect(getCluster()).toBeInTheDocument(); - expect(screen.getAllByRole('menuitem').length).toEqual(1); - userEvent.click(screen.getByRole('menuitem')); - expect(screen.getAllByRole('menuitem').length).toEqual(4); + expect(getMenuItems().length).toEqual(1); + userEvent.click(getMenuItem()); + expect(getMenuItems().length).toEqual(4); - expect(screen.getByTitle('Brokers')).toBeInTheDocument(); - expect(screen.getByTitle('Topics')).toBeInTheDocument(); - expect(screen.getByTitle('Consumers')).toBeInTheDocument(); + expect(getBrokers()).toBeInTheDocument(); + expect(getTopics()).toBeInTheDocument(); + expect(getConsumers()).toBeInTheDocument(); }); it('renders cluster menu with correct set of features', () => { render( @@ -35,15 +42,15 @@ describe('ClusterMenu', () => { ], }) ); - expect(screen.getAllByRole('menuitem').length).toEqual(1); - userEvent.click(screen.getByRole('menuitem')); - expect(screen.getAllByRole('menuitem').length).toEqual(7); + expect(getMenuItems().length).toEqual(1); + userEvent.click(getMenuItem()); + expect(getMenuItems().length).toEqual(7); - expect(screen.getByTitle('Brokers')).toBeInTheDocument(); - expect(screen.getByTitle('Topics')).toBeInTheDocument(); - expect(screen.getByTitle('Consumers')).toBeInTheDocument(); + expect(getBrokers()).toBeInTheDocument(); + expect(getTopics()).toBeInTheDocument(); + expect(getConsumers()).toBeInTheDocument(); expect(screen.getByTitle('Schema Registry')).toBeInTheDocument(); - expect(screen.getByTitle('Kafka Connect')).toBeInTheDocument(); + expect(getKafkaConnect()).toBeInTheDocument(); expect(screen.getByTitle('KSQL DB')).toBeInTheDocument(); }); it('renders open cluster menu', () => { @@ -51,11 +58,11 @@ describe('ClusterMenu', () => { pathname: clusterConnectorsPath(onlineClusterPayload.name), }); - expect(screen.getAllByRole('menuitem').length).toEqual(4); - expect(screen.getByText(onlineClusterPayload.name)).toBeInTheDocument(); - expect(screen.getByTitle('Brokers')).toBeInTheDocument(); - expect(screen.getByTitle('Topics')).toBeInTheDocument(); - expect(screen.getByTitle('Consumers')).toBeInTheDocument(); + expect(getMenuItems().length).toEqual(4); + expect(getCluster()).toBeInTheDocument(); + expect(getBrokers()).toBeInTheDocument(); + expect(getTopics()).toBeInTheDocument(); + expect(getConsumers()).toBeInTheDocument(); }); it('makes Kafka Connect link active', () => { render( @@ -65,12 +72,12 @@ describe('ClusterMenu', () => { }), { pathname: clusterConnectorsPath(onlineClusterPayload.name) } ); - expect(screen.getAllByRole('menuitem').length).toEqual(1); - userEvent.click(screen.getByRole('menuitem')); - expect(screen.getAllByRole('menuitem').length).toEqual(5); + expect(getMenuItems().length).toEqual(1); + userEvent.click(getMenuItem()); + expect(getMenuItems().length).toEqual(5); - expect(screen.getByText('Kafka Connect')).toBeInTheDocument(); - expect(screen.getByText('Kafka Connect')).toHaveClass('is-active'); + expect(getKafkaConnect()).toBeInTheDocument(); + expect(getKafkaConnect()).toHaveClass('is-active'); }); it('makes Kafka Connect link active', () => { render( @@ -80,11 +87,11 @@ describe('ClusterMenu', () => { }), { pathname: clusterConnectsPath(onlineClusterPayload.name) } ); - expect(screen.getAllByRole('menuitem').length).toEqual(1); - userEvent.click(screen.getByRole('menuitem')); - expect(screen.getAllByRole('menuitem').length).toEqual(5); + expect(getMenuItems().length).toEqual(1); + userEvent.click(getMenuItem()); + expect(getMenuItems().length).toEqual(5); - expect(screen.getByText('Kafka Connect')).toBeInTheDocument(); - expect(screen.getByText('Kafka Connect')).toHaveClass('is-active'); + expect(getKafkaConnect()).toBeInTheDocument(); + expect(getKafkaConnect()).toHaveClass('is-active'); }); }); diff --git a/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenuItem.spec.tsx b/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenuItem.spec.tsx index 9a473c4aca..cbe664fb28 100644 --- a/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenuItem.spec.tsx +++ b/kafka-ui-react-app/src/components/Nav/__tests__/ClusterMenuItem.spec.tsx @@ -12,6 +12,9 @@ describe('ClusterMenuItem', () => { ); + const getMenuItem = () => screen.getByRole('menuitem'); + const getLink = () => screen.queryByRole('link'); + it('renders component with correct title', () => { const testTitle = 'My Test Title'; render(setupComponent({ title: testTitle })); @@ -20,24 +23,24 @@ describe('ClusterMenuItem', () => { it('renders top level component with correct styles', () => { render(setupComponent({ isTopLevel: true })); - expect(screen.getByRole('menuitem')).toHaveStyle({ fontWeight: '500' }); + expect(getMenuItem()).toHaveStyle({ fontWeight: '500' }); }); it('renders non-top level component with correct styles', () => { render(setupComponent({ isTopLevel: false })); - expect(screen.getByRole('menuitem')).toHaveStyle({ fontWeight: 'normal' }); + expect(getMenuItem()).toHaveStyle({ fontWeight: 'normal' }); }); it('renders list item with link inside', () => { render(setupComponent({ to: '/my-cluster' })); - expect(screen.getByRole('menuitem')).toBeInTheDocument(); - expect(screen.queryByRole('link')).toBeInTheDocument(); + expect(getMenuItem()).toBeInTheDocument(); + expect(getLink()).toBeInTheDocument(); }); it('renders list item without link inside', () => { render(setupComponent({ to: '' })); - expect(screen.getByRole('menuitem')).toBeInTheDocument(); - expect(screen.queryByRole('link')).not.toBeInTheDocument(); + expect(getMenuItem()).toBeInTheDocument(); + expect(getLink()).not.toBeInTheDocument(); }); it('renders list item with children', () => { @@ -46,8 +49,8 @@ describe('ClusterMenuItem', () => { Test Text Box ); - expect(screen.getByRole('menuitem')).toBeInTheDocument(); - expect(screen.queryByRole('link')).toBeInTheDocument(); + expect(getMenuItem()).toBeInTheDocument(); + expect(getLink()).toBeInTheDocument(); expect(screen.getByText('Test Text Box')).toBeInTheDocument(); }); }); diff --git a/kafka-ui-react-app/src/components/Nav/__tests__/Nav.spec.tsx b/kafka-ui-react-app/src/components/Nav/__tests__/Nav.spec.tsx index b3413c4ed7..1ef18720e3 100644 --- a/kafka-ui-react-app/src/components/Nav/__tests__/Nav.spec.tsx +++ b/kafka-ui-react-app/src/components/Nav/__tests__/Nav.spec.tsx @@ -8,10 +8,13 @@ import { screen } from '@testing-library/react'; import { render } from 'lib/testHelpers'; describe('Nav', () => { + const getDashboard = () => screen.getByText('Dashboard'); + + const getMenuItemsCount = () => screen.getAllByRole('menuitem').length; it('renders loader', () => { render(