transactonProfileIdProvider.spec.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary';
  2. import * as useProfileEventsModule from 'sentry/utils/profiling/hooks/useProfileEvents';
  3. import * as useApiModule from 'sentry/utils/useApi';
  4. import * as TransactionProfileIdProviderModule from './transactionProfileIdProvider';
  5. const useApiSpy = jest.spyOn(useApiModule, 'default');
  6. // this order matters; create the spy before dereferencing below
  7. const useTransactionProfileIdSpy = jest.spyOn(
  8. TransactionProfileIdProviderModule,
  9. 'useTransactionProfileId'
  10. );
  11. const {TransactionProfileIdProvider, useTransactionProfileId} =
  12. TransactionProfileIdProviderModule;
  13. const useProfileEventsSpy = jest.spyOn(useProfileEventsModule, 'useProfileEvents');
  14. function MockComponent() {
  15. const profileId = useTransactionProfileId();
  16. return <div data-test-id={profileId} />;
  17. }
  18. const MOCK_TRX_ID = '123';
  19. const MOCK_PROFILE_ID = '456';
  20. describe('TransactionProfileIdProvider', () => {
  21. afterEach(() => {
  22. jest.clearAllMocks();
  23. });
  24. it('provides default profileId state as null', () => {
  25. render(
  26. <TransactionProfileIdProvider transactionId={undefined} timestamp={undefined}>
  27. <MockComponent />
  28. </TransactionProfileIdProvider>
  29. );
  30. expect(useProfileEventsSpy).toHaveBeenCalledWith(
  31. expect.objectContaining({
  32. enabled: false,
  33. })
  34. );
  35. expect(useTransactionProfileIdSpy).toHaveReturnedWith(null);
  36. });
  37. it('does not query the events endpoint when transactionId is undefined', () => {
  38. const requestPromiseMock = jest.fn();
  39. // @ts-expect-error
  40. useApiSpy.mockReturnValueOnce({
  41. requestPromise: requestPromiseMock,
  42. });
  43. render(
  44. <TransactionProfileIdProvider transactionId={undefined} timestamp={undefined}>
  45. <MockComponent />
  46. </TransactionProfileIdProvider>
  47. );
  48. expect(useProfileEventsSpy).toHaveBeenCalledWith(
  49. expect.objectContaining({
  50. enabled: false,
  51. })
  52. );
  53. expect(requestPromiseMock).not.toHaveBeenCalled();
  54. expect(useTransactionProfileIdSpy).toHaveReturnedWith(null);
  55. });
  56. it('queries the events endpoint for a profile id when given a transactionId', async () => {
  57. MockApiClient.addMockResponse({
  58. method: 'GET',
  59. url: '/organizations/org-slug/events/',
  60. body: {
  61. data: [
  62. {
  63. 'profile.id': MOCK_PROFILE_ID,
  64. },
  65. ],
  66. },
  67. });
  68. render(
  69. <TransactionProfileIdProvider
  70. transactionId={MOCK_TRX_ID}
  71. timestamp="2022-12-19T16:00:00.000Z"
  72. >
  73. <MockComponent />
  74. </TransactionProfileIdProvider>
  75. );
  76. await waitFor(() => screen.findAllByTestId(MOCK_PROFILE_ID));
  77. expect(useProfileEventsSpy).toHaveBeenCalledWith(
  78. expect.objectContaining({
  79. query: 'id:' + MOCK_TRX_ID,
  80. datetime: {
  81. end: new Date('2022-12-20T04:00:00.000Z'),
  82. period: null,
  83. start: new Date('2022-12-19T04:00:00.000Z'),
  84. utc: true,
  85. },
  86. })
  87. );
  88. expect(useTransactionProfileIdSpy).toHaveReturnedWith(MOCK_PROFILE_ID);
  89. });
  90. });