Actions.spec.tsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import React from 'react';
  2. import { render, WithRoute } from 'lib/testHelpers';
  3. import { clusterConnectConnectorPath } from 'lib/paths';
  4. import Actions from 'components/Connect/Details/Actions/Actions';
  5. import { ConnectorAction, ConnectorState } from 'generated-sources';
  6. import { screen, waitFor } from '@testing-library/react';
  7. import userEvent from '@testing-library/user-event';
  8. import {
  9. useConnector,
  10. useUpdateConnectorState,
  11. } from 'lib/hooks/api/kafkaConnect';
  12. import { connector } from 'lib/fixtures/kafkaConnect';
  13. import set from 'lodash/set';
  14. const mockHistoryPush = jest.fn();
  15. const deleteConnector = jest.fn();
  16. const cancelMock = jest.fn();
  17. jest.mock('react-router-dom', () => ({
  18. ...jest.requireActual('react-router-dom'),
  19. useNavigate: () => mockHistoryPush,
  20. }));
  21. jest.mock('lib/hooks/api/kafkaConnect', () => ({
  22. useConnector: jest.fn(),
  23. useDeleteConnector: jest.fn(),
  24. useUpdateConnectorState: jest.fn(),
  25. }));
  26. const expectActionButtonsExists = () => {
  27. expect(screen.getByText('Restart Connector')).toBeInTheDocument();
  28. expect(screen.getByText('Restart All Tasks')).toBeInTheDocument();
  29. expect(screen.getByText('Restart Failed Tasks')).toBeInTheDocument();
  30. expect(screen.getByText('Delete')).toBeInTheDocument();
  31. };
  32. const afterClickDropDownButton = async () => {
  33. const dropDownButton = screen.getAllByRole('button');
  34. expect(dropDownButton.length).toEqual(1);
  35. await userEvent.click(dropDownButton[0]);
  36. };
  37. describe('Actions', () => {
  38. afterEach(() => {
  39. mockHistoryPush.mockClear();
  40. deleteConnector.mockClear();
  41. cancelMock.mockClear();
  42. });
  43. describe('view', () => {
  44. const route = clusterConnectConnectorPath();
  45. const path = clusterConnectConnectorPath(
  46. 'myCluster',
  47. 'myConnect',
  48. 'myConnector'
  49. );
  50. const renderComponent = () =>
  51. render(
  52. <WithRoute path={route}>
  53. <Actions />
  54. </WithRoute>,
  55. { initialEntries: [path] }
  56. );
  57. it('renders buttons when paused', async () => {
  58. (useConnector as jest.Mock).mockImplementation(() => ({
  59. data: set({ ...connector }, 'status.state', ConnectorState.PAUSED),
  60. }));
  61. renderComponent();
  62. await afterClickDropDownButton();
  63. expect(screen.getAllByRole('menuitem').length).toEqual(5);
  64. expect(screen.getByText('Resume')).toBeInTheDocument();
  65. expect(screen.queryByText('Pause')).not.toBeInTheDocument();
  66. expectActionButtonsExists();
  67. });
  68. it('renders buttons when failed', async () => {
  69. (useConnector as jest.Mock).mockImplementation(() => ({
  70. data: set({ ...connector }, 'status.state', ConnectorState.FAILED),
  71. }));
  72. renderComponent();
  73. await afterClickDropDownButton();
  74. expect(screen.getAllByRole('menuitem').length).toEqual(4);
  75. expect(screen.queryByText('Resume')).not.toBeInTheDocument();
  76. expect(screen.queryByText('Pause')).not.toBeInTheDocument();
  77. expectActionButtonsExists();
  78. });
  79. it('renders buttons when unassigned', async () => {
  80. (useConnector as jest.Mock).mockImplementation(() => ({
  81. data: set({ ...connector }, 'status.state', ConnectorState.UNASSIGNED),
  82. }));
  83. renderComponent();
  84. await afterClickDropDownButton();
  85. expect(screen.getAllByRole('menuitem').length).toEqual(4);
  86. expect(screen.queryByText('Resume')).not.toBeInTheDocument();
  87. expect(screen.queryByText('Pause')).not.toBeInTheDocument();
  88. expectActionButtonsExists();
  89. });
  90. it('renders buttons when running connector action', async () => {
  91. (useConnector as jest.Mock).mockImplementation(() => ({
  92. data: set({ ...connector }, 'status.state', ConnectorState.RUNNING),
  93. }));
  94. renderComponent();
  95. await afterClickDropDownButton();
  96. expect(screen.getAllByRole('menuitem').length).toEqual(5);
  97. expect(screen.queryByText('Resume')).not.toBeInTheDocument();
  98. expect(screen.getByText('Pause')).toBeInTheDocument();
  99. expectActionButtonsExists();
  100. });
  101. describe('mutations', () => {
  102. beforeEach(() => {
  103. (useConnector as jest.Mock).mockImplementation(() => ({
  104. data: set({ ...connector }, 'status.state', ConnectorState.RUNNING),
  105. }));
  106. });
  107. it('opens confirmation modal when delete button clicked', async () => {
  108. renderComponent();
  109. await afterClickDropDownButton();
  110. await waitFor(async () =>
  111. userEvent.click(screen.getByRole('menuitem', { name: 'Delete' }))
  112. );
  113. expect(screen.getByRole('dialog')).toBeInTheDocument();
  114. });
  115. it('calls restartConnector when restart button clicked', async () => {
  116. const restartConnector = jest.fn();
  117. (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
  118. mutateAsync: restartConnector,
  119. }));
  120. renderComponent();
  121. await afterClickDropDownButton();
  122. await userEvent.click(
  123. screen.getByRole('menuitem', { name: 'Restart Connector' })
  124. );
  125. expect(restartConnector).toHaveBeenCalledWith(ConnectorAction.RESTART);
  126. });
  127. it('calls restartAllTasks', async () => {
  128. const restartAllTasks = jest.fn();
  129. (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
  130. mutateAsync: restartAllTasks,
  131. }));
  132. renderComponent();
  133. await afterClickDropDownButton();
  134. await userEvent.click(
  135. screen.getByRole('menuitem', { name: 'Restart All Tasks' })
  136. );
  137. expect(restartAllTasks).toHaveBeenCalledWith(
  138. ConnectorAction.RESTART_ALL_TASKS
  139. );
  140. });
  141. it('calls restartFailedTasks', async () => {
  142. const restartFailedTasks = jest.fn();
  143. (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
  144. mutateAsync: restartFailedTasks,
  145. }));
  146. renderComponent();
  147. await afterClickDropDownButton();
  148. await userEvent.click(
  149. screen.getByRole('menuitem', { name: 'Restart Failed Tasks' })
  150. );
  151. expect(restartFailedTasks).toHaveBeenCalledWith(
  152. ConnectorAction.RESTART_FAILED_TASKS
  153. );
  154. });
  155. it('calls pauseConnector when pause button clicked', async () => {
  156. const pauseConnector = jest.fn();
  157. (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
  158. mutateAsync: pauseConnector,
  159. }));
  160. renderComponent();
  161. await afterClickDropDownButton();
  162. await userEvent.click(screen.getByRole('menuitem', { name: 'Pause' }));
  163. expect(pauseConnector).toHaveBeenCalledWith(ConnectorAction.PAUSE);
  164. });
  165. it('calls resumeConnector when resume button clicked', async () => {
  166. const resumeConnector = jest.fn();
  167. (useConnector as jest.Mock).mockImplementation(() => ({
  168. data: set({ ...connector }, 'status.state', ConnectorState.PAUSED),
  169. }));
  170. (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
  171. mutateAsync: resumeConnector,
  172. }));
  173. renderComponent();
  174. await afterClickDropDownButton();
  175. await userEvent.click(screen.getByRole('menuitem', { name: 'Resume' }));
  176. expect(resumeConnector).toHaveBeenCalledWith(ConnectorAction.RESUME);
  177. });
  178. });
  179. });
  180. });