import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary';
import * as useProfileEventsModule from 'sentry/utils/profiling/hooks/useProfileEvents';
import * as useApiModule from 'sentry/utils/useApi';
import * as TransactionProfileIdProviderModule from './transactionProfileIdProvider';
const useApiSpy = jest.spyOn(useApiModule, 'default');
// this order matters; create the spy before dereferencing below
const useTransactionProfileIdSpy = jest.spyOn(
TransactionProfileIdProviderModule,
'useTransactionProfileId'
);
const {TransactionProfileIdProvider, useTransactionProfileId} =
TransactionProfileIdProviderModule;
const useProfileEventsSpy = jest.spyOn(useProfileEventsModule, 'useProfileEvents');
function MockComponent() {
const profileId = useTransactionProfileId();
return
;
}
const MOCK_TRX_ID = '123';
const MOCK_PROFILE_ID = '456';
describe('TransactionProfileIdProvider', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('provides default profileId state as null', () => {
render(
);
expect(useProfileEventsSpy).toHaveBeenCalledWith(
expect.objectContaining({
enabled: false,
})
);
expect(useTransactionProfileIdSpy).toHaveReturnedWith(null);
});
it('does not query the events endpoint when transactionId is undefined', () => {
const requestPromiseMock = jest.fn();
// @ts-expect-error
useApiSpy.mockReturnValueOnce({
requestPromise: requestPromiseMock,
});
render(
);
expect(useProfileEventsSpy).toHaveBeenCalledWith(
expect.objectContaining({
enabled: false,
})
);
expect(requestPromiseMock).not.toHaveBeenCalled();
expect(useTransactionProfileIdSpy).toHaveReturnedWith(null);
});
it('queries the events endpoint for a profile id when given a transactionId', async () => {
MockApiClient.addMockResponse({
method: 'GET',
url: '/organizations/org-slug/events/',
body: {
data: [
{
'profile.id': MOCK_PROFILE_ID,
},
],
},
});
render(
);
await waitFor(() => screen.findAllByTestId(MOCK_PROFILE_ID));
expect(useProfileEventsSpy).toHaveBeenCalledWith(
expect.objectContaining({
query: 'id:' + MOCK_TRX_ID,
datetime: {
end: new Date('2022-12-20T04:00:00.000Z'),
period: null,
start: new Date('2022-12-19T04:00:00.000Z'),
utc: true,
},
})
);
expect(useTransactionProfileIdSpy).toHaveReturnedWith(MOCK_PROFILE_ID);
});
});