New.spec.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import React from 'react';
  2. import New from 'components/Topics/New/New';
  3. import { Route, Routes } from 'react-router-dom';
  4. import { act, screen, waitFor } from '@testing-library/react';
  5. import {
  6. clusterTopicCopyPath,
  7. clusterTopicNewPath,
  8. clusterTopicPath,
  9. } from 'lib/paths';
  10. import userEvent from '@testing-library/user-event';
  11. import { render } from 'lib/testHelpers';
  12. import { useCreateTopic } from 'lib/hooks/api/topics';
  13. const clusterName = 'local';
  14. const topicName = 'test-topic';
  15. const mockNavigate = jest.fn();
  16. jest.mock('react-router-dom', () => ({
  17. ...jest.requireActual('react-router-dom'),
  18. useNavigate: () => mockNavigate,
  19. }));
  20. jest.mock('lib/hooks/api/topics', () => ({
  21. useCreateTopic: jest.fn(),
  22. }));
  23. const renderComponent = (path: string) => {
  24. render(
  25. <Routes>
  26. <Route path={clusterTopicNewPath()} element={<New />} />
  27. <Route path={clusterTopicCopyPath()} element={<New />} />
  28. <Route path={clusterTopicPath()} element="New topic path" />
  29. </Routes>,
  30. { initialEntries: [path] }
  31. );
  32. };
  33. const createTopicMock = jest.fn();
  34. describe('New', () => {
  35. beforeEach(() => {
  36. (useCreateTopic as jest.Mock).mockImplementation(() => ({
  37. mutateAsync: createTopicMock,
  38. }));
  39. });
  40. afterEach(() => {
  41. mockNavigate.mockClear();
  42. });
  43. it('checks header for create new', async () => {
  44. await act(() => renderComponent(clusterTopicNewPath(clusterName)));
  45. expect(screen.getByRole('heading', { name: 'Create' })).toBeInTheDocument();
  46. });
  47. it('checks header for copy', async () => {
  48. await act(() =>
  49. renderComponent(`${clusterTopicCopyPath(clusterName)}?name=test`)
  50. );
  51. expect(screen.getByRole('heading', { name: 'Copy' })).toBeInTheDocument();
  52. });
  53. it('validates form', async () => {
  54. await act(() => renderComponent(clusterTopicNewPath(clusterName)));
  55. await waitFor(() => {
  56. userEvent.type(screen.getByPlaceholderText('Topic Name'), topicName);
  57. });
  58. await waitFor(() => {
  59. userEvent.clear(screen.getByPlaceholderText('Topic Name'));
  60. });
  61. await waitFor(() => {
  62. expect(screen.getByText('name is a required field')).toBeInTheDocument();
  63. });
  64. expect(createTopicMock).not.toHaveBeenCalled();
  65. expect(mockNavigate).not.toHaveBeenCalled();
  66. });
  67. it('validates form invalid name', async () => {
  68. await act(() => renderComponent(clusterTopicNewPath(clusterName)));
  69. await waitFor(() => {
  70. userEvent.type(screen.getByPlaceholderText('Topic Name'), 'Invalid,Name');
  71. });
  72. await waitFor(() => {
  73. expect(
  74. screen.getByText('Only alphanumeric, _, -, and . allowed')
  75. ).toBeInTheDocument();
  76. });
  77. });
  78. it('submits valid form', async () => {
  79. await act(() => renderComponent(clusterTopicNewPath(clusterName)));
  80. await act(() => {
  81. userEvent.type(screen.getByPlaceholderText('Topic Name'), topicName);
  82. });
  83. await act(() => {
  84. userEvent.click(screen.getByText('Create topic'));
  85. });
  86. await waitFor(() => expect(createTopicMock).toHaveBeenCalledTimes(1));
  87. await waitFor(() =>
  88. expect(mockNavigate).toHaveBeenLastCalledWith(`../${topicName}`)
  89. );
  90. });
  91. });