noDataMessage.spec.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {PageFilters} from 'sentry-fixture/pageFilters';
  2. import {Project} from 'sentry-fixture/project';
  3. import {ProjectSdkUpdates} from 'sentry-fixture/projectSdkUpdates';
  4. import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary';
  5. import {textWithMarkupMatcher} from 'sentry-test/utils';
  6. import ProjectsStore from 'sentry/stores/projectsStore';
  7. import importedUsePageFilters from 'sentry/utils/usePageFilters';
  8. jest.mock('sentry/utils/usePageFilters');
  9. const usePageFilters = jest.mocked(importedUsePageFilters);
  10. import {NoDataMessage} from 'sentry/views/performance/database/noDataMessage';
  11. describe('NoDataMessage', () => {
  12. beforeEach(() => {
  13. jest.clearAllMocks();
  14. MockApiClient.clearMockResponses();
  15. usePageFilters.mockClear();
  16. ProjectsStore.loadInitialData([Project({name: 'Awesome API', slug: 'awesome-api'})]);
  17. usePageFilters.mockImplementation(() => ({
  18. selection: PageFilters({projects: [2]}),
  19. isReady: true,
  20. shouldPersist: true,
  21. pinnedFilters: new Set(),
  22. desyncedFilters: new Set(),
  23. }));
  24. });
  25. it('does not show anything while data is loading', async function () {
  26. MockApiClient.addMockResponse({
  27. url: '/organizations/org-slug/sdk-updates/',
  28. body: [],
  29. });
  30. const eventsMock = MockApiClient.addMockResponse({
  31. url: '/organizations/org-slug/events/',
  32. body: {
  33. data: [],
  34. },
  35. });
  36. render(<NoDataMessage />);
  37. await waitFor(() => expect(eventsMock).toHaveBeenCalled());
  38. expect(
  39. screen.queryByText(textWithMarkupMatcher('No queries found.'))
  40. ).not.toBeInTheDocument();
  41. await tick();
  42. });
  43. it('does not show anything if there is recent data', async function () {
  44. MockApiClient.addMockResponse({
  45. url: '/organizations/org-slug/sdk-updates/',
  46. body: [],
  47. });
  48. const eventsMock = MockApiClient.addMockResponse({
  49. url: '/organizations/org-slug/events/',
  50. body: {
  51. data: [{'project.id': 2, 'count()': 1}],
  52. },
  53. });
  54. render(<NoDataMessage />);
  55. await waitFor(() => expect(eventsMock).toHaveBeenCalled());
  56. await tick(); // There is no visual indicator, this awaits the promise resolve
  57. expect(
  58. screen.queryByText(textWithMarkupMatcher('No queries found.'))
  59. ).not.toBeInTheDocument();
  60. });
  61. it('shows a no data message if there is no recent data', async function () {
  62. MockApiClient.addMockResponse({
  63. url: '/organizations/org-slug/sdk-updates/',
  64. body: [],
  65. });
  66. const eventsMock = MockApiClient.addMockResponse({
  67. url: '/organizations/org-slug/events/',
  68. body: {
  69. data: [],
  70. },
  71. });
  72. render(<NoDataMessage />);
  73. await waitFor(() => expect(eventsMock).toHaveBeenCalled());
  74. await tick(); // There is no visual indicator, this awaits the promise resolve
  75. expect(
  76. screen.queryByText(textWithMarkupMatcher('No queries found.'))
  77. ).toBeInTheDocument();
  78. expect(
  79. screen.queryByText(
  80. textWithMarkupMatcher('You may also be missing data due to outdated SDKs')
  81. )
  82. ).not.toBeInTheDocument();
  83. });
  84. it('shows a list of outdated SDKs if there is no data available and SDKs are outdated', async function () {
  85. const sdkMock = MockApiClient.addMockResponse({
  86. url: '/organizations/org-slug/sdk-updates/',
  87. body: [ProjectSdkUpdates({projectId: '2'})],
  88. });
  89. const eventsMock = MockApiClient.addMockResponse({
  90. url: '/organizations/org-slug/events/',
  91. body: {
  92. data: [],
  93. },
  94. });
  95. render(<NoDataMessage />);
  96. await waitFor(() => expect(eventsMock).toHaveBeenCalled());
  97. await waitFor(() => expect(sdkMock).toHaveBeenCalled());
  98. await tick(); // There is no visual indicator, this awaits the promise resolve
  99. expect(
  100. screen.queryByText(textWithMarkupMatcher('No queries found.'))
  101. ).toBeInTheDocument();
  102. expect(
  103. screen.getByText(
  104. textWithMarkupMatcher('You may also be missing data due to outdated SDKs')
  105. )
  106. ).toBeInTheDocument();
  107. expect(screen.getAllByRole('link')[1]).toHaveAttribute(
  108. 'href',
  109. '/organizations/org-slug/projects/awesome-api/'
  110. );
  111. });
  112. });