deprecatedAsyncComponent.spec.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {render, screen} from 'sentry-test/reactTestingLibrary';
  2. import DeprecatedAsyncComponent from 'sentry/components/deprecatedAsyncComponent';
  3. describe('DeprecatedAsyncComponent', function () {
  4. class TestAsyncComponent extends DeprecatedAsyncComponent {
  5. shouldRenderBadRequests = true;
  6. getEndpoints(): ReturnType<DeprecatedAsyncComponent['getEndpoints']> {
  7. return [['data', '/some/path/to/something/']];
  8. }
  9. renderBody() {
  10. return <div>{this.state.data.message}</div>;
  11. }
  12. }
  13. it('renders on successful request', function () {
  14. MockApiClient.clearMockResponses();
  15. MockApiClient.addMockResponse({
  16. url: '/some/path/to/something/',
  17. method: 'GET',
  18. body: {
  19. message: 'hi',
  20. },
  21. });
  22. render(<TestAsyncComponent />);
  23. expect(screen.getByText('hi')).toBeInTheDocument();
  24. });
  25. it('renders error message', function () {
  26. MockApiClient.clearMockResponses();
  27. MockApiClient.addMockResponse({
  28. url: '/some/path/to/something/',
  29. method: 'GET',
  30. body: {
  31. detail: 'oops there was a problem',
  32. },
  33. statusCode: 400,
  34. });
  35. render(<TestAsyncComponent />);
  36. expect(screen.getByText('oops there was a problem')).toBeInTheDocument();
  37. });
  38. it('renders only unique error message', function () {
  39. MockApiClient.clearMockResponses();
  40. MockApiClient.addMockResponse({
  41. url: '/first/path/',
  42. method: 'GET',
  43. body: {
  44. detail: 'oops there was a problem',
  45. },
  46. statusCode: 400,
  47. });
  48. MockApiClient.addMockResponse({
  49. url: '/second/path/',
  50. method: 'GET',
  51. body: {
  52. detail: 'oops there was a problem',
  53. },
  54. statusCode: 400,
  55. });
  56. MockApiClient.addMockResponse({
  57. url: '/third/path/',
  58. method: 'GET',
  59. body: {
  60. detail: 'oops there was a different problem',
  61. },
  62. statusCode: 400,
  63. });
  64. class UniqueErrorsAsyncComponent extends DeprecatedAsyncComponent {
  65. shouldRenderBadRequests = true;
  66. getEndpoints(): ReturnType<DeprecatedAsyncComponent['getEndpoints']> {
  67. return [
  68. ['first', '/first/path/'],
  69. ['second', '/second/path/'],
  70. ['third', '/third/path/'],
  71. ];
  72. }
  73. renderBody() {
  74. return <div>{this.state.data.message}</div>;
  75. }
  76. }
  77. render(<UniqueErrorsAsyncComponent />);
  78. expect(
  79. screen.getByText('oops there was a problem oops there was a different problem')
  80. ).toBeInTheDocument();
  81. });
  82. describe('multi-route component', () => {
  83. class MultiRouteComponent extends TestAsyncComponent {
  84. getEndpoints(): ReturnType<DeprecatedAsyncComponent['getEndpoints']> {
  85. return [
  86. ['data', '/some/path/to/something/'],
  87. ['project', '/another/path/here'],
  88. ];
  89. }
  90. renderLoading() {
  91. return (
  92. <div data-test-id="remaining-requests">{this.state.remainingRequests}</div>
  93. );
  94. }
  95. }
  96. it('calls onLoadAllEndpointsSuccess when all endpoints have been loaded', () => {
  97. jest.useFakeTimers();
  98. jest
  99. .spyOn(MockApiClient.prototype, 'request')
  100. .mockImplementation((url, options) => {
  101. const timeout = url.includes('something') ? 100 : 50;
  102. setTimeout(() => options?.success?.({message: 'good'}), timeout);
  103. });
  104. const mockOnAllEndpointsSuccess = jest.spyOn(
  105. MultiRouteComponent.prototype,
  106. 'onLoadAllEndpointsSuccess'
  107. );
  108. render(<MultiRouteComponent />);
  109. expect(screen.getByTestId('remaining-requests')).toHaveTextContent('2');
  110. jest.advanceTimersByTime(40);
  111. expect(screen.getByTestId('remaining-requests')).toHaveTextContent('2');
  112. jest.advanceTimersByTime(40);
  113. expect(screen.getByTestId('remaining-requests')).toHaveTextContent('1');
  114. expect(mockOnAllEndpointsSuccess).not.toHaveBeenCalled();
  115. jest.advanceTimersByTime(40);
  116. expect(screen.queryByTestId('remaining-requests')).not.toBeInTheDocument();
  117. expect(mockOnAllEndpointsSuccess).toHaveBeenCalled();
  118. jest.restoreAllMocks();
  119. });
  120. });
  121. });