import {mountWithTheme} from 'sentry-test/enzyme';
import {ExportQueryType} from 'sentry/components/dataExport';
import DataDownload, {DownloadStatus} from 'sentry/views/dataExport/dataDownload';
describe('DataDownload', function () {
beforeEach(MockApiClient.clearMockResponses);
const dateExpired = new Date();
const organization = TestStubs.Organization();
const mockRouteParams = {
orgId: organization.slug,
dataExportId: 721,
};
const getDataExportDetails = (body, statusCode = 200) =>
MockApiClient.addMockResponse({
url: `/organizations/${mockRouteParams.orgId}/data-export/${mockRouteParams.dataExportId}/`,
body,
statusCode,
});
it('should send a request to the data export endpoint', function () {
const getValid = getDataExportDetails(DownloadStatus.Valid);
mountWithTheme();
expect(getValid).toHaveBeenCalled();
});
it("should render the 'Error' view when appropriate", function () {
const errors = {
download: {
status: 403,
statusText: 'Forbidden',
responseJSON: {
detail: 'You are not allowed',
},
},
};
getDataExportDetails({errors}, 403);
const wrapper = mountWithTheme();
expect(wrapper.state('errors')).toBeDefined();
expect(wrapper.state('errors').download.status).toBe(403);
});
it("should render the 'Early' view when appropriate", function () {
const status = DownloadStatus.Early;
getDataExportDetails({status});
const wrapper = mountWithTheme();
expect(wrapper.state('download')).toEqual({status});
expect(wrapper.state('download').dateExpired).toBeUndefined();
expect(wrapper.find('Header').text()).toBe('What are you doing here?');
});
it("should render the 'Expired' view when appropriate", function () {
const status = DownloadStatus.Expired;
const response = {status, query: {type: ExportQueryType.IssuesByTag}};
getDataExportDetails(response);
const wrapper = mountWithTheme();
expect(wrapper.state('download')).toEqual(response);
expect(wrapper.state('download').dateExpired).toBeUndefined();
expect(wrapper.find('Header').text()).toBe('This is awkward.');
const buttonWrapper = wrapper.find('a[aria-label="Start a New Download"]');
expect(buttonWrapper.prop('href')).toBe(
`/organizations/${mockRouteParams.orgId}/issues/`
);
});
it("should render the 'Valid' view when appropriate", function () {
const status = DownloadStatus.Valid;
getDataExportDetails({dateExpired, status});
const wrapper = mountWithTheme();
expect(wrapper.state('download')).toEqual({dateExpired, status});
expect(wrapper.find('Header').text()).toBe('All done.');
const buttonWrapper = wrapper.find('a[aria-label="Download CSV"]');
expect(buttonWrapper.text()).toBe('Download CSV');
expect(buttonWrapper.prop('href')).toBe(
`/api/0/organizations/${mockRouteParams.orgId}/data-export/${mockRouteParams.dataExportId}/?download=true`
);
expect(wrapper.find('DateTime').prop('date')).toEqual(new Date(dateExpired));
});
it('should render the Open in Discover button when needed', function () {
const status = DownloadStatus.Valid;
getDataExportDetails({
dateExpired,
status,
query: {
type: ExportQueryType.Discover,
info: {},
},
});
const wrapper = mountWithTheme();
const buttonWrapper = wrapper.find('button[aria-label="Open in Discover"]');
expect(buttonWrapper.exists()).toBeTruthy();
});
it('should not render the Open in Discover button when not needed', function () {
const status = DownloadStatus.Valid;
getDataExportDetails({
dateExpired,
status,
query: {
type: ExportQueryType.IssuesByTag,
info: {},
},
});
const wrapper = mountWithTheme();
const buttonWrapper = wrapper.find('button[aria-label="Open in Discover"]');
expect(buttonWrapper.exists()).toBeFalsy();
});
});