import {act, fireEvent, render, screen, waitFor} from 'sentry-test/reactTestingLibrary';
import {addErrorMessage} from 'sentry/actionCreators/indicator';
import WrappedDataExport from 'sentry/components/dataExport';
jest.mock('sentry/actionCreators/indicator');
const mockUnauthorizedOrg = TestStubs.Organization({
features: [],
});
const mockAuthorizedOrg = TestStubs.Organization({
features: ['discover-query'],
});
const mockPayload = {
queryType: 'Issues-by-Tag',
queryInfo: {project_id: '1', group_id: '1027', key: 'user'},
};
const mockRouterContext = mockOrganization =>
TestStubs.routerContext([
{
organization: mockOrganization,
},
]);
describe('DataExport', function () {
it('should not render anything for an unauthorized organization', function () {
render(, {
context: mockRouterContext(mockUnauthorizedOrg),
});
expect(screen.queryByRole('button')).not.toBeInTheDocument();
});
it('should render the button for an authorized organization', function () {
render(, {
context: mockRouterContext(mockAuthorizedOrg),
});
expect(screen.getByText(/Export All to CSV/)).toBeInTheDocument();
});
it('should render custom children if provided', function () {
render(
This is an example string
,
{context: mockRouterContext(mockAuthorizedOrg)}
);
expect(screen.getByText(/This is an example string/)).toBeInTheDocument();
});
it('should respect the disabled prop and not be clickable', function () {
const postDataExport = MockApiClient.addMockResponse({
url: `/organizations/${mockAuthorizedOrg.slug}/data-export/`,
method: 'POST',
body: {id: 721},
});
render(, {
context: mockRouterContext(mockAuthorizedOrg),
});
fireEvent.click(screen.getByRole('button'));
expect(postDataExport).not.toHaveBeenCalled();
expect(screen.getByRole('button')).toBeDisabled();
});
it('should send a request and disable itself when clicked', async function () {
const postDataExport = MockApiClient.addMockResponse({
url: `/organizations/${mockAuthorizedOrg.slug}/data-export/`,
method: 'POST',
body: {id: 721},
});
render(, {
context: mockRouterContext(mockAuthorizedOrg),
});
act(() => {
fireEvent.click(screen.getByRole('button'));
});
expect(postDataExport).toHaveBeenCalledWith(
`/organizations/${mockAuthorizedOrg.slug}/data-export/`,
{
data: {
query_type: mockPayload.queryType,
query_info: mockPayload.queryInfo,
},
method: 'POST',
error: expect.anything(),
success: expect.anything(),
}
);
await waitFor(() => {
expect(screen.getByRole('button')).toBeDisabled();
});
});
it('should reset the state when receiving a new payload', async function () {
MockApiClient.addMockResponse({
url: `/organizations/${mockAuthorizedOrg.slug}/data-export/`,
method: 'POST',
body: {id: 721},
});
const {rerender} = render(, {
context: mockRouterContext(mockAuthorizedOrg),
});
act(() => {
fireEvent.click(screen.getByText(/Export All to CSV/));
});
await waitFor(() => {
expect(screen.getByRole('button')).toBeDisabled();
});
rerender();
await waitFor(() => {
expect(screen.getByRole('button')).toBeEnabled();
});
});
it('should display default error message if non provided', async function () {
MockApiClient.addMockResponse({
url: `/organizations/${mockAuthorizedOrg.slug}/data-export/`,
method: 'POST',
statusCode: 400,
});
render(, {
context: mockRouterContext(mockAuthorizedOrg),
});
act(() => {
fireEvent.click(screen.getByRole('button'));
});
await waitFor(() => {
expect(addErrorMessage).toHaveBeenCalledWith(
"We tried our hardest, but we couldn't export your data. Give it another go."
);
});
await waitFor(() => {
expect(screen.getByRole('button')).toBeEnabled();
});
});
it('should display provided error message', async function () {
MockApiClient.addMockResponse({
url: `/organizations/${mockAuthorizedOrg.slug}/data-export/`,
method: 'POST',
statusCode: 400,
body: {detail: 'uh oh'},
});
render(, {
context: mockRouterContext(mockAuthorizedOrg),
});
act(() => {
fireEvent.click(screen.getByRole('button'));
});
await waitFor(() => {
expect(addErrorMessage).toHaveBeenCalledWith('uh oh');
});
});
});