import {mountWithTheme} from 'sentry-test/enzyme'; 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(); }); afterEach(() => { RepositoryStore.teardown(); }); it('adds repositories prop', async () => { const Component = () => null; const Container = withRepositories(Component); const wrapper = mountWithTheme(); await tick(); // Run Store.loadRepositories await tick(); // Run Store.loadRepositoriesSuccess wrapper.update(); // Re-render component with Store data const mountedComponent = wrapper.find(Component); expect(mountedComponent.prop('repositories')).toEqual(mockData); expect(mountedComponent.prop('repositoriesLoading')).toEqual(false); expect(mountedComponent.prop('repositoriesError')).toEqual(undefined); }); it('prevents repeated calls', async () => { const Component = () => null; const Container = withRepositories(Component); jest.spyOn(api, 'requestPromise'); jest.spyOn(Container.prototype, 'fetchRepositories'); // Mount and run component mountWithTheme(); await tick(); await tick(); // Mount and run duplicates mountWithTheme(); await tick(); mountWithTheme(); await tick(); 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', async () => { const Component = () => null; const Container = withRepositories(Component); jest.spyOn(api, 'requestPromise'); jest.spyOn(Container.prototype, 'componentDidMount'); // Mount and run duplicates mountWithTheme(); mountWithTheme(); mountWithTheme(); await tick(); await tick(); expect(api.requestPromise).toHaveBeenCalledTimes(1); expect(Container.prototype.componentDidMount).toHaveBeenCalledTimes(3); }); });