SendMessage.spec.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React from 'react';
  2. import SendMessage from 'components/Topics/Topic/SendMessage/SendMessage';
  3. import { act, screen } from '@testing-library/react';
  4. import userEvent from '@testing-library/user-event';
  5. import { render, WithRoute } from 'lib/testHelpers';
  6. import { clusterTopicPath } from 'lib/paths';
  7. import validateMessage from 'components/Topics/Topic/SendMessage/validateMessage';
  8. import { externalTopicPayload, topicMessageSchema } from 'lib/fixtures/topics';
  9. import {
  10. useSendMessage,
  11. useTopicDetails,
  12. useTopicMessageSchema,
  13. } from 'lib/hooks/api/topics';
  14. import Mock = jest.Mock;
  15. jest.mock('json-schema-faker', () => ({
  16. generate: () => ({
  17. f1: -93251214,
  18. schema: 'enim sit in fugiat dolor',
  19. f2: 'deserunt culpa sunt',
  20. }),
  21. option: jest.fn(),
  22. }));
  23. jest.mock('components/Topics/Topic/SendMessage/validateMessage', () =>
  24. jest.fn()
  25. );
  26. jest.mock('lib/errorHandling', () => ({
  27. ...jest.requireActual('lib/errorHandling'),
  28. showServerError: jest.fn(),
  29. }));
  30. jest.mock('lib/hooks/api/topics', () => ({
  31. useTopicDetails: jest.fn(),
  32. useTopicMessageSchema: jest.fn(),
  33. useSendMessage: jest.fn(),
  34. }));
  35. const clusterName = 'testCluster';
  36. const topicName = externalTopicPayload.name;
  37. const mockOnSubmit = jest.fn();
  38. const renderComponent = async () => {
  39. const path = clusterTopicPath(clusterName, topicName);
  40. await act(() => {
  41. render(
  42. <WithRoute path={clusterTopicPath()}>
  43. <SendMessage onSubmit={mockOnSubmit} />
  44. </WithRoute>,
  45. { initialEntries: [path] }
  46. );
  47. });
  48. };
  49. const renderAndSubmitData = async (error: string[] = []) => {
  50. await renderComponent();
  51. await act(() => {
  52. userEvent.click(screen.getByRole('listbox'));
  53. });
  54. await act(() => {
  55. userEvent.click(screen.getAllByRole('option')[1]);
  56. });
  57. await act(() => {
  58. (validateMessage as Mock).mockImplementation(() => error);
  59. userEvent.click(screen.getByText('Produce Message'));
  60. });
  61. };
  62. describe('SendMessage', () => {
  63. beforeEach(() => {
  64. (useTopicDetails as jest.Mock).mockImplementation(() => ({
  65. data: externalTopicPayload,
  66. }));
  67. });
  68. describe('when schema is fetched', () => {
  69. beforeEach(() => {
  70. (useTopicMessageSchema as jest.Mock).mockImplementation(() => ({
  71. data: topicMessageSchema,
  72. }));
  73. });
  74. it('calls sendTopicMessage on submit', async () => {
  75. const sendTopicMessageMock = jest.fn();
  76. (useSendMessage as jest.Mock).mockImplementation(() => ({
  77. mutateAsync: sendTopicMessageMock,
  78. }));
  79. await renderAndSubmitData();
  80. expect(sendTopicMessageMock).toHaveBeenCalledTimes(1);
  81. expect(mockOnSubmit).toHaveBeenCalledTimes(1);
  82. });
  83. it('should check and view validation error message when is not valid', async () => {
  84. const sendTopicMessageMock = jest.fn();
  85. (useSendMessage as jest.Mock).mockImplementation(() => ({
  86. mutateAsync: sendTopicMessageMock,
  87. }));
  88. await renderAndSubmitData(['error']);
  89. expect(sendTopicMessageMock).not.toHaveBeenCalled();
  90. expect(mockOnSubmit).not.toHaveBeenCalled();
  91. });
  92. });
  93. describe('when schema is empty', () => {
  94. beforeEach(() => {
  95. (useTopicMessageSchema as jest.Mock).mockImplementation(() => ({
  96. data: undefined,
  97. }));
  98. });
  99. it('renders if schema is not defined', async () => {
  100. await renderComponent();
  101. expect(screen.getAllByRole('textbox')[0].nodeValue).toBeNull();
  102. });
  103. });
  104. });