Details.spec.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import React from 'react';
  2. import { screen } from '@testing-library/react';
  3. import userEvent from '@testing-library/user-event';
  4. import ClusterContext from 'components/contexts/ClusterContext';
  5. import Details from 'components/Topics/Topic/Details/Details';
  6. import { internalTopicPayload } from 'redux/reducers/topics/__test__/fixtures';
  7. import { render } from 'lib/testHelpers';
  8. import {
  9. clusterTopicEditPath,
  10. clusterTopicPath,
  11. clusterTopicsPath,
  12. } from 'lib/paths';
  13. import { Router } from 'react-router-dom';
  14. import { createMemoryHistory } from 'history';
  15. describe('Details', () => {
  16. const mockDelete = jest.fn();
  17. const mockClusterName = 'local';
  18. const mockClearTopicMessages = jest.fn();
  19. const mockInternalTopicPayload = internalTopicPayload.internal;
  20. const mockRecreateTopic = jest.fn();
  21. const defaultPathname = clusterTopicPath(
  22. mockClusterName,
  23. internalTopicPayload.name
  24. );
  25. const mockHistory = createMemoryHistory({
  26. initialEntries: [defaultPathname],
  27. });
  28. jest.spyOn(mockHistory, 'push');
  29. const setupComponent = (
  30. pathname = defaultPathname,
  31. history = mockHistory,
  32. props = {}
  33. ) =>
  34. render(
  35. <ClusterContext.Provider
  36. value={{
  37. isReadOnly: false,
  38. hasKafkaConnectConfigured: true,
  39. hasSchemaRegistryConfigured: true,
  40. isTopicDeletionAllowed: true,
  41. }}
  42. >
  43. <Router history={history}>
  44. <Details
  45. clusterName={mockClusterName}
  46. topicName={internalTopicPayload.name}
  47. name={internalTopicPayload.name}
  48. isInternal={false}
  49. deleteTopic={mockDelete}
  50. recreateTopic={mockRecreateTopic}
  51. clearTopicMessages={mockClearTopicMessages}
  52. isDeleted={false}
  53. isDeletePolicy
  54. {...props}
  55. />
  56. </Router>
  57. </ClusterContext.Provider>,
  58. { pathname }
  59. );
  60. describe('when it has readonly flag', () => {
  61. it('does not render the Action button a Topic', () => {
  62. render(
  63. <ClusterContext.Provider
  64. value={{
  65. isReadOnly: true,
  66. hasKafkaConnectConfigured: true,
  67. hasSchemaRegistryConfigured: true,
  68. isTopicDeletionAllowed: true,
  69. }}
  70. >
  71. <Details
  72. clusterName={mockClusterName}
  73. topicName={internalTopicPayload.name}
  74. name={internalTopicPayload.name}
  75. isInternal={mockInternalTopicPayload}
  76. deleteTopic={mockDelete}
  77. recreateTopic={mockRecreateTopic}
  78. clearTopicMessages={mockClearTopicMessages}
  79. isDeleted={false}
  80. isDeletePolicy
  81. />
  82. </ClusterContext.Provider>
  83. );
  84. expect(screen.queryByText('Produce Message')).not.toBeInTheDocument();
  85. });
  86. });
  87. describe('when remove topic modal is open', () => {
  88. beforeEach(() => {
  89. setupComponent();
  90. const openModalButton = screen.getAllByText('Remove topic')[0];
  91. userEvent.click(openModalButton);
  92. });
  93. it('calls deleteTopic on confirm', () => {
  94. const submitButton = screen.getAllByText('Submit')[0];
  95. userEvent.click(submitButton);
  96. expect(mockDelete).toHaveBeenCalledWith({
  97. clusterName: mockClusterName,
  98. topicName: internalTopicPayload.name,
  99. });
  100. });
  101. it('closes the modal when cancel button is clicked', () => {
  102. const cancelButton = screen.getAllByText('Cancel')[0];
  103. userEvent.click(cancelButton);
  104. expect(cancelButton).not.toBeInTheDocument();
  105. });
  106. });
  107. describe('when clear messages modal is open', () => {
  108. beforeEach(() => {
  109. setupComponent();
  110. const confirmButton = screen.getAllByText('Clear messages')[0];
  111. userEvent.click(confirmButton);
  112. });
  113. it('it calls clearTopicMessages on confirm', () => {
  114. const submitButton = screen.getAllByText('Submit')[0];
  115. userEvent.click(submitButton);
  116. expect(mockClearTopicMessages).toHaveBeenCalledWith({
  117. clusterName: mockClusterName,
  118. topicName: internalTopicPayload.name,
  119. });
  120. });
  121. it('closes the modal when cancel button is clicked', () => {
  122. const cancelButton = screen.getAllByText('Cancel')[0];
  123. userEvent.click(cancelButton);
  124. expect(cancelButton).not.toBeInTheDocument();
  125. });
  126. });
  127. describe('when edit settings is clicked', () => {
  128. it('redirects to the edit page', () => {
  129. setupComponent();
  130. const button = screen.getAllByText('Edit settings')[0];
  131. userEvent.click(button);
  132. const redirectRoute = clusterTopicEditPath(
  133. mockClusterName,
  134. internalTopicPayload.name
  135. );
  136. expect(mockHistory.push).toHaveBeenCalledWith(redirectRoute);
  137. });
  138. });
  139. it('redirects to the correct route if topic is deleted', () => {
  140. setupComponent(defaultPathname, mockHistory, { isDeleted: true });
  141. const redirectRoute = clusterTopicsPath(mockClusterName);
  142. expect(mockHistory.push).toHaveBeenCalledWith(redirectRoute);
  143. });
  144. it('shows a confirmation popup on deleting topic messages', () => {
  145. setupComponent();
  146. const { getByText } = screen;
  147. const clearMessagesButton = getByText(/Clear messages/i);
  148. userEvent.click(clearMessagesButton);
  149. expect(
  150. getByText(/Are you sure want to clear topic messages?/i)
  151. ).toBeInTheDocument();
  152. });
  153. it('shows a confirmation popup on recreating topic', () => {
  154. setupComponent();
  155. const recreateTopicButton = screen.getByText(/Recreate topic/i);
  156. userEvent.click(recreateTopicButton);
  157. expect(
  158. screen.getByText(/Are you sure want to recreate topic?/i)
  159. ).toBeInTheDocument();
  160. });
  161. it('calling recreation function after click on Submit button', () => {
  162. setupComponent();
  163. const recreateTopicButton = screen.getByText(/Recreate topic/i);
  164. userEvent.click(recreateTopicButton);
  165. const confirmBtn = screen.getByRole('button', { name: /submit/i });
  166. userEvent.click(confirmBtn);
  167. expect(mockRecreateTopic).toBeCalledTimes(1);
  168. });
  169. it('close popup confirmation window after click on Cancel button', () => {
  170. setupComponent();
  171. const recreateTopicButton = screen.getByText(/Recreate topic/i);
  172. userEvent.click(recreateTopicButton);
  173. const cancelBtn = screen.getByRole('button', { name: /cancel/i });
  174. userEvent.click(cancelBtn);
  175. expect(
  176. screen.queryByText(/Are you sure want to recreate topic?/i)
  177. ).not.toBeInTheDocument();
  178. });
  179. });