import React from 'react'; import {mount} from 'enzyme'; import {Client} from 'app/api'; import App from 'app/views/app'; import ConfigStore from 'app/stores/configStore'; jest.mock('jquery'); describe('Sudo Modal', function() { 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: [], }); }); it('can delete an org with sudo flow', async function() { ConfigStore.set('user', { ...ConfigStore.get('user'), hasPasswordAuth: true, }); const wrapper = mount({
placeholder content
}
); const api = new Client(); const successCb = jest.fn(); const errorCb = jest.fn(); // No Modal expect(wrapper.find('ModalDialog')).toHaveLength(0); // Should return w/ `sudoRequired` api.request('/organizations/org-slug/', { method: 'DELETE', success: successCb, error: errorCb, }); await tick(); await tick(); wrapper.update(); // Should have Modal + input expect(wrapper.find('ModalDialog input')).toHaveLength(1); // 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 wrapper .find('ModalDialog input[name="password"]') .simulate('change', {target: {value: 'password'}}); wrapper.find('ModalDialog form').simulate('submit'); wrapper.find('ModalDialog Button[type="submit"]').simulate('click'); await tick(); wrapper.update(); expect(sudoMock).toHaveBeenCalledWith( '/auth/', expect.objectContaining({ method: 'PUT', data: { password: 'password', }, }) ); // Retry API request expect(successCb).toHaveBeenCalled(); expect(orgDeleteMock).toHaveBeenCalledWith( '/organizations/org-slug/', expect.objectContaining({ method: 'DELETE', }) ); await tick(); wrapper.update(); // Sudo Modal should be closed expect(wrapper.find('ModalDialog')).toHaveLength(0); }); it('shows button to redirect if user does not have password auth', async function() { ConfigStore.set('user', { ...ConfigStore.get('user'), hasPasswordAuth: false, }); const wrapper = mount({
placeholder content
}
); const api = new Client(); const successCb = jest.fn(); const errorCb = jest.fn(); // No Modal expect(wrapper.find('ModalDialog')).toHaveLength(0); // Should return w/ `sudoRequired` api.request('/organizations/org-slug/', { method: 'DELETE', success: successCb, error: errorCb, }); await tick(); await tick(); wrapper.update(); // Should have Modal + input expect(wrapper.find('ModalDialog input')).toHaveLength(0); expect(wrapper.find('Button').prop('href')).toMatch('/auth/login/?next=%2F'); }); });