New.spec.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import React from 'react';
  2. import { render, WithRoute } from 'lib/testHelpers';
  3. import {
  4. clusterConnectConnectorPath,
  5. clusterConnectorNewPath,
  6. } from 'lib/paths';
  7. import New from 'components/Connect/New/New';
  8. import { connects, connector } from 'lib/fixtures/kafkaConnect';
  9. import { fireEvent, screen, act } from '@testing-library/react';
  10. import userEvent from '@testing-library/user-event';
  11. import { ControllerRenderProps } from 'react-hook-form';
  12. import { useConnects, useCreateConnector } from 'lib/hooks/api/kafkaConnect';
  13. jest.mock(
  14. 'components/common/Editor/Editor',
  15. () => (props: ControllerRenderProps) => {
  16. return <textarea {...props} placeholder="json" />;
  17. }
  18. );
  19. const mockHistoryPush = jest.fn();
  20. jest.mock('react-router-dom', () => ({
  21. ...jest.requireActual('react-router-dom'),
  22. useNavigate: () => mockHistoryPush,
  23. }));
  24. jest.mock('lib/hooks/api/kafkaConnect', () => ({
  25. useConnects: jest.fn(),
  26. useCreateConnector: jest.fn(),
  27. }));
  28. describe('New', () => {
  29. const clusterName = 'my-cluster';
  30. const simulateFormSubmit = async () => {
  31. await userEvent.type(
  32. screen.getByPlaceholderText('Connector Name'),
  33. 'my-connector'
  34. );
  35. await userEvent.type(
  36. screen.getByPlaceholderText('json'),
  37. '{"class":"MyClass"}'.replace(/[{[]/g, '$&$&')
  38. );
  39. expect(screen.getByPlaceholderText('json')).toHaveValue(
  40. '{"class":"MyClass"}'
  41. );
  42. await act(() => {
  43. fireEvent.submit(screen.getByRole('form'));
  44. });
  45. };
  46. const renderComponent = () =>
  47. render(
  48. <WithRoute path={clusterConnectorNewPath()}>
  49. <New />
  50. </WithRoute>,
  51. { initialEntries: [clusterConnectorNewPath(clusterName)] }
  52. );
  53. beforeEach(() => {
  54. (useConnects as jest.Mock).mockImplementation(() => ({
  55. data: connects,
  56. }));
  57. });
  58. it('calls createConnector on form submit and redirects to the list page on success', async () => {
  59. const createConnectorMock = jest.fn(() => {
  60. return Promise.resolve(connector);
  61. });
  62. (useCreateConnector as jest.Mock).mockImplementation(() => ({
  63. createResource: createConnectorMock,
  64. }));
  65. renderComponent();
  66. await simulateFormSubmit();
  67. expect(createConnectorMock).toHaveBeenCalledTimes(1);
  68. expect(mockHistoryPush).toHaveBeenCalledTimes(1);
  69. expect(mockHistoryPush).toHaveBeenCalledWith(
  70. clusterConnectConnectorPath(clusterName, connects[0].name, connector.name)
  71. );
  72. });
  73. it('does not redirect to connector details view on unsuccessful submit', async () => {
  74. const createConnectorMock = jest.fn(() => {
  75. return Promise.resolve();
  76. });
  77. (useCreateConnector as jest.Mock).mockImplementation(() => ({
  78. createResource: createConnectorMock,
  79. }));
  80. renderComponent();
  81. await simulateFormSubmit();
  82. expect(mockHistoryPush).not.toHaveBeenCalled();
  83. });
  84. });