import {Fragment} from 'react'; import {mountWithTheme} from 'sentry-test/enzyme'; import {initializeOrg} from 'sentry-test/initializeOrg'; import GlobalModal from 'sentry/components/globalModal'; import ProjectLatestReleases from 'sentry/views/projectDetail/projectLatestReleases'; describe('ProjectDetail > ProjectLatestReleases', function () { let endpointMock, endpointOlderReleasesMock; const {organization, project, router} = initializeOrg(); beforeEach(function () { endpointMock = MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/releases/`, body: [ TestStubs.Release({version: '1.0.0'}), TestStubs.Release({version: '1.0.1'}), ], }); endpointOlderReleasesMock = MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/releases/stats/`, body: [TestStubs.Release({version: '1.0.0'})], }); }); afterEach(function () { MockApiClient.clearMockResponses(); }); it('renders a list', function () { const wrapper = mountWithTheme( ); expect(endpointMock).toHaveBeenCalledTimes(1); expect(endpointMock).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ query: {per_page: 5}, }) ); expect(endpointOlderReleasesMock).toHaveBeenCalledTimes(0); expect(wrapper.find('SectionHeading').text()).toBe('Latest Releases'); expect(wrapper.find('Version').length).toBe(2); expect(wrapper.find('DateTime').at(0).text()).toBe('Mar 23, 2020 1:02 AM'); expect(wrapper.find('Version').at(1).text()).toBe('1.0.1'); }); it('shows the empty state', async function () { MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/releases/`, body: [], }); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(endpointOlderReleasesMock).toHaveBeenCalledTimes(1); expect(wrapper.find('Version').length).toBe(0); expect(wrapper.text()).toContain('No releases found'); }); it('shows configure releases buttons', async function () { MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/releases/`, body: [], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/releases/stats/`, body: [], }); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('Version').length).toBe(0); const docsButton = wrapper.find('Button').at(0); const tourButton = wrapper.find('Button').at(1); expect(docsButton.text()).toBe('Start Setup'); expect(docsButton.prop('href')).toBe('https://docs.sentry.io/product/releases/'); expect(tourButton.text()).toBe('Get Tour'); expect(wrapper.find('GlobalModal').props().visible).toEqual(false); tourButton.simulate('click'); await tick(); wrapper.update(); expect(wrapper.find('GlobalModal').props().visible).toEqual(true); }); it('calls API with the right params', function () { mountWithTheme( ); expect(endpointMock).toHaveBeenCalledTimes(1); expect(endpointMock).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ query: {per_page: 5, statsPeriod: '7d', environment: 'staging'}, }) ); }); it('does not call API if project is not stabilized yet', function () { mountWithTheme( ); expect(endpointMock).toHaveBeenCalledTimes(0); }); });