import {render, waitFor} from 'sentry-test/reactTestingLibrary'; import RepositoryStore from 'sentry/stores/repositoryStore'; import withRepositories from 'sentry/utils/withRepositories'; describe('withRepositories HoC', function () { const organization = TestStubs.Organization(); const orgSlug = organization.slug; const repoUrl = `/organizations/${orgSlug}/repos/`; const api = new MockApiClient(); const mockData = [{id: '1'}]; beforeEach(() => { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: repoUrl, body: mockData, }); jest.restoreAllMocks(); RepositoryStore.init?.(); }); it('adds repositories prop', async function () { const Component = jest.fn(() => null); const Container = withRepositories(Component); render(); await waitFor(() => expect(Component).toHaveBeenCalledWith( expect.objectContaining({ repositories: mockData, repositoriesLoading: false, repositoriesError: undefined, }), {} ) ); }); it('prevents repeated calls', function () { const Component = () => null; const Container = withRepositories(Component); jest.spyOn(api, 'requestPromise'); jest.spyOn(Container.prototype, 'fetchRepositories'); // Mount and run component render(); // Mount and run duplicates render(); render(); expect(api.requestPromise).toHaveBeenCalledTimes(1); expect(Container.prototype.fetchRepositories).toHaveBeenCalledTimes(3); }); /** * Same as 'prevents repeated calls', but with the async fetch/checks * happening on same tick. * * Additionally, this test checks that withRepositories.fetchRepositories does * not check for (store.orgSlug !== orgSlug) as the short-circuit does not * change the value for orgSlug */ it('prevents simultaneous calls', function () { const Component = () => null; const Container = withRepositories(Component); jest.spyOn(api, 'requestPromise'); jest.spyOn(Container.prototype, 'componentDidMount'); // Mount and run duplicates render(); render(); render(); expect(api.requestPromise).toHaveBeenCalledTimes(1); expect(Container.prototype.componentDidMount).toHaveBeenCalledTimes(3); }); });