import {mountWithTheme} from 'sentry-test/enzyme';
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 () => {
const Component = () => null;
const Container = withRelease(Component);
const wrapper = mountWithTheme(
);
await tick(); // Run Store.loadEtc
await tick(); // Run Store.loadEtcSuccess
wrapper.update();
const mountedComponent = wrapper.find(Component);
expect(mountedComponent.prop('release')).toEqual(mockData);
expect(mountedComponent.prop('releaseLoading')).toEqual(false);
expect(mountedComponent.prop('releaseError')).toEqual(undefined);
expect(mountedComponent.prop('deploys')).toEqual([mockData]);
expect(mountedComponent.prop('deploysLoading')).toEqual(false);
expect(mountedComponent.prop('deploysError')).toEqual(undefined);
});
it('prevents repeated calls', async () => {
const Component = () => null;
const Container = withRelease(Component);
jest.spyOn(api, 'requestPromise');
jest.spyOn(Container.prototype, 'fetchRelease');
jest.spyOn(Container.prototype, 'fetchDeploys');
// Mount and run component
mountWithTheme(
);
await tick();
await tick();
// Mount and run duplicates
mountWithTheme(
);
await tick();
mountWithTheme(
);
await tick();
expect(api.requestPromise).toHaveBeenCalledTimes(2); // 1 for fetchRelease, 1 for fetchDeploys
expect(Container.prototype.fetchRelease).toHaveBeenCalledTimes(3);
expect(Container.prototype.fetchDeploys).toHaveBeenCalledTimes(3);
});
});