import {render, waitFor} from 'sentry-test/reactTestingLibrary'; import ReleaseStore from 'sentry/stores/releaseStore'; import withRelease from 'sentry/utils/withRelease'; describe('withRelease HoC', function () { const organization = TestStubs.Organization(); const orgSlug = organization.slug; const projectSlug = 'myProject'; const releaseVersion = 'myRelease'; const releaseUrl = `/projects/${orgSlug}/${projectSlug}/releases/${encodeURIComponent( releaseVersion )}/`; const deployUrl = `/organizations/${orgSlug}/releases/${encodeURIComponent( releaseVersion )}/deploys/`; const api = new MockApiClient(); const mockData = {id: '1'}; beforeEach(() => { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: releaseUrl, body: mockData, }); MockApiClient.addMockResponse({ url: deployUrl, body: [mockData], }); jest.restoreAllMocks(); ReleaseStore.reset(); }); it('adds release/deploys prop', async function () { const Component = jest.fn(() => null); const Container = withRelease(Component); render( ); await waitFor(() => expect(Component).toHaveBeenCalledWith( expect.objectContaining({ release: mockData, releaseLoading: false, releaseError: undefined, deploys: [mockData], deploysLoading: false, deploysError: undefined, }), {} ) ); }); it('prevents repeated calls', function () { const Component = jest.fn(() => null); const Container = withRelease(Component); jest.spyOn(api, 'requestPromise'); jest.spyOn(Container.prototype, 'fetchRelease'); jest.spyOn(Container.prototype, 'fetchDeploys'); // Mount and run component render( ); // Mount and run duplicates render( ); render( ); expect(api.requestPromise).toHaveBeenCalledTimes(2); // 1 for fetchRelease, 1 for fetchDeploys expect(Container.prototype.fetchRelease).toHaveBeenCalledTimes(3); expect(Container.prototype.fetchDeploys).toHaveBeenCalledTimes(3); }); });