import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
import {Client} from 'sentry/api';
import ConfigStore from 'sentry/stores/configStore';
import App from 'sentry/views/app';
describe('Sudo Modal', function () {
const setHasPasswordAuth = hasPasswordAuth =>
ConfigStore.set('user', {...ConfigStore.get('user'), hasPasswordAuth});
beforeEach(function () {
Client.clearMockResponses();
Client.addMockResponse({
url: '/internal/health/',
body: {
problems: [],
},
});
Client.addMockResponse({
url: '/assistant/',
body: [],
});
Client.addMockResponse({
url: '/organizations/',
body: [TestStubs.Organization()],
});
Client.addMockResponse({
url: '/organizations/org-slug/',
method: 'DELETE',
statusCode: 401,
body: {
detail: {
code: 'sudo-required',
username: 'test@test.com',
},
},
});
Client.addMockResponse({
url: '/authenticators/',
body: [],
});
});
afterEach(() => {
ConfigStore.teardown();
});
it('can delete an org with sudo flow', async function () {
setHasPasswordAuth(true);
render({placeholder content
});
const api = new Client();
const successCb = jest.fn();
const errorCb = jest.fn();
// No Modal
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
// Should return w/ `sudoRequired`
api.request('/organizations/org-slug/', {
method: 'DELETE',
success: successCb,
error: errorCb,
});
// Should have Modal + input
expect(await screen.findByRole('dialog')).toBeInTheDocument();
// Original callbacks should not have been called
expect(successCb).not.toHaveBeenCalled();
expect(errorCb).not.toHaveBeenCalled();
// Clear mocks and allow DELETE
Client.clearMockResponses();
const orgDeleteMock = Client.addMockResponse({
url: '/organizations/org-slug/',
method: 'DELETE',
statusCode: 200,
});
const sudoMock = Client.addMockResponse({
url: '/auth/',
method: 'PUT',
statusCode: 200,
});
expect(sudoMock).not.toHaveBeenCalled();
// "Sudo" auth
userEvent.type(screen.getByLabelText('Password'), 'password');
userEvent.click(screen.getByRole('button', {name: 'Confirm Password'}));
expect(sudoMock).toHaveBeenCalledWith(
'/auth/',
expect.objectContaining({
method: 'PUT',
data: {isSuperuserModal: false, password: 'password'},
})
);
// Retry API request
await waitFor(() => expect(successCb).toHaveBeenCalled());
expect(orgDeleteMock).toHaveBeenCalledWith(
'/organizations/org-slug/',
expect.objectContaining({
method: 'DELETE',
})
);
// Sudo Modal should be closed
await waitFor(() => expect(screen.queryByRole('dialog')).not.toBeInTheDocument());
});
it('shows button to redirect if user does not have password auth', async function () {
setHasPasswordAuth(false);
render({placeholder content
});
const api = new Client();
const successCb = jest.fn();
const errorCb = jest.fn();
// No Modal
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
// Should return w/ `sudoRequired`
api.request('/organizations/org-slug/', {
method: 'DELETE',
success: successCb,
error: errorCb,
});
// Should have Modal + input
expect(await screen.findByRole('dialog')).toBeInTheDocument();
expect(screen.queryByLabelText('Password')).not.toBeInTheDocument();
expect(screen.getByRole('button', {name: 'Continue'})).toHaveAttribute(
'href',
'/auth/login/?next=%2F'
);
});
});