import {mountWithTheme} from 'sentry-test/enzyme'; import {mountGlobalModal} from 'sentry-test/modal'; import {fetchPlugins} from 'sentry/actionCreators/plugins'; import ProjectReleaseTrackingContainer, { ProjectReleaseTracking, } from 'sentry/views/settings/project/projectReleaseTracking'; jest.mock('sentry/actionCreators/plugins', () => ({ fetchPlugins: jest.fn().mockResolvedValue([]), })); describe('ProjectReleaseTracking', function () { const org = TestStubs.Organization(); const project = TestStubs.Project(); const url = `/projects/${org.slug}/${project.slug}/releases/token/`; beforeEach(function () { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/projects/${org.slug}/${project.slug}/plugins/`, method: 'GET', body: TestStubs.Plugins(), }); MockApiClient.addMockResponse({ url, method: 'GET', body: { webhookUrl: 'webhook-url', token: 'token token token', }, }); }); it('renders with token', function () { const wrapper = mountWithTheme( ); expect(wrapper.find('TextCopyInput').prop('children')).toBe('token token token'); }); it('can regenerate token', async function () { const wrapper = mountWithTheme( ); const mock = MockApiClient.addMockResponse({ url, method: 'POST', body: { webhookUrl: 'webhook-url', token: 'token token token', }, }); // Click Regenerate Token wrapper.find('Field[label="Regenerate Token"] Button').simulate('click'); const modal = await mountGlobalModal(); expect(modal.find('Modal')).toHaveLength(1); expect(mock).not.toHaveBeenCalled(); modal.find('Button[priority="danger"]').simulate('click'); await tick(); expect(mock).toHaveBeenCalledWith( url, expect.objectContaining({ method: 'POST', data: { project: project.slug, }, }) ); }); it('fetches new plugins when project changes', function () { const wrapper = mountWithTheme( ); expect(fetchPlugins).toHaveBeenCalled(); fetchPlugins.mockClear(); // For example, this happens when we switch to a new project using settings breadcrumb wrapper.setProps({...wrapper.props(), project: {...project, slug: 'new-project'}}); wrapper.update(); expect(fetchPlugins).toHaveBeenCalledWith( expect.objectContaining({ projectId: 'new-project', }) ); fetchPlugins.mockClear(); // Does not call fetchPlugins if slug is the same wrapper.setProps({...wrapper.props(), project: {...project, slug: 'new-project'}}); wrapper.update(); expect(fetchPlugins).not.toHaveBeenCalled(); }); });