diff --git a/awx/ui_next/src/components/AddRole/AddResourceRole.test.jsx b/awx/ui_next/src/components/AddRole/AddResourceRole.test.jsx index 1f6ba521b7..53c450f0b9 100644 --- a/awx/ui_next/src/components/AddRole/AddResourceRole.test.jsx +++ b/awx/ui_next/src/components/AddRole/AddResourceRole.test.jsx @@ -16,7 +16,6 @@ jest.mock('../../api/models/Users'); jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), - useHistory: () => ({ push: jest.fn(), location: { pathname: {} } }), })); // TODO: Once error handling is functional in diff --git a/awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx b/awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx index f16fd774e1..a0ba2b35dc 100644 --- a/awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx +++ b/awx/ui_next/src/components/ScreenHeader/ScreenHeader.test.jsx @@ -5,10 +5,6 @@ import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; import ScreenHeader from './ScreenHeader'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), -})); - describe('', () => { let breadcrumbWrapper; let breadcrumb; diff --git a/awx/ui_next/src/screens/Application/Application/Application.test.jsx b/awx/ui_next/src/screens/Application/Application/Application.test.jsx index 136c468075..58f29395db 100644 --- a/awx/ui_next/src/screens/Application/Application/Application.test.jsx +++ b/awx/ui_next/src/screens/Application/Application/Application.test.jsx @@ -15,6 +15,7 @@ jest.mock('react-router-dom', () => ({ }), useParams: () => ({ id: 1 }), })); + const options = { data: { actions: { diff --git a/awx/ui_next/src/screens/Setting/Settings.test.jsx b/awx/ui_next/src/screens/Setting/Settings.test.jsx index 13b8ec77ba..0a8a4cd0a9 100644 --- a/awx/ui_next/src/screens/Setting/Settings.test.jsx +++ b/awx/ui_next/src/screens/Setting/Settings.test.jsx @@ -11,10 +11,6 @@ import Settings from './Settings'; jest.mock('../../api'); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), -})); - describe('', () => { let wrapper; diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplate.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplate.test.jsx index b68d0f6b56..2888b8682d 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplate.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplate.test.jsx @@ -50,10 +50,11 @@ describe('', () => { }, }); }); + afterEach(() => { jest.clearAllMocks(); - wrapper.unmount(); }); + test('initially renders successfully', async () => { await act(async () => { wrapper = mountWithContexts( @@ -61,6 +62,7 @@ describe('', () => { ); }); }); + test('When component mounts API is called and the response is put in state', async () => { await act(async () => { wrapper = mountWithContexts( @@ -70,6 +72,7 @@ describe('', () => { expect(WorkflowJobTemplatesAPI.readDetail).toBeCalled(); expect(OrganizationsAPI.read).toBeCalled(); }); + test('notifications tab shown for admins', async () => { await act(async () => { wrapper = mountWithContexts( @@ -84,6 +87,7 @@ describe('', () => { ); expect(tabs.at(3).text()).toEqual('Notifications'); }); + test('notifications tab hidden with reduced permissions', async () => { OrganizationsAPI.read.mockResolvedValue({ data: { @@ -135,6 +139,7 @@ describe('', () => { await waitForElement(wrapper, 'ContentError', el => el.length === 1); }); + test('should call to get webhook key', async () => { const history = createMemoryHistory({ initialEntries: ['/templates/workflow_job_template/1/foobar'], @@ -161,6 +166,7 @@ describe('', () => { }); expect(WorkflowJobTemplatesAPI.readWebhookKey).toHaveBeenCalled(); }); + test('should not call to get webhook key', async () => { WorkflowJobTemplatesAPI.readWorkflowJobTemplateOptions.mockResolvedValueOnce( { diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/DeleteAllNodesModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/DeleteAllNodesModal.test.jsx index 26c806da26..1924c82092 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/DeleteAllNodesModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/DeleteAllNodesModal.test.jsx @@ -15,10 +15,6 @@ describe('DeleteAllNodesModal', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Delete All button dispatches as expected', () => { wrapper.find('button#confirm-delete-all-nodes').simulate('click'); expect(dispatch).toHaveBeenCalledWith({ diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkDeleteModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkDeleteModal.test.jsx index d0cee96579..64103aeb78 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkDeleteModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkDeleteModal.test.jsx @@ -32,10 +32,6 @@ describe('LinkDeleteModal', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Confirm button dispatches as expected', () => { wrapper.find('button#confirm-link-removal').simulate('click'); expect(dispatch).toHaveBeenCalledWith({ diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkModal.test.jsx index 787e891306..e98a49f10d 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/LinkModals/LinkModal.test.jsx @@ -27,10 +27,6 @@ describe('LinkModal', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Dropdown defaults to success when adding new link', () => { expect(wrapper.find('AnsibleSelect').prop('value')).toBe('success'); }); @@ -57,6 +53,7 @@ describe('LinkModal', () => { expect(onConfirm).toHaveBeenCalledWith('always'); }); }); + describe('Editing existing link', () => { test('Dropdown defaults to existing link type when editing link', () => { wrapper = mountWithContexts( @@ -79,7 +76,6 @@ describe('LinkModal', () => { ); expect(wrapper.find('AnsibleSelect').prop('value')).toBe('failure'); - wrapper.unmount(); }); }); }); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeDeleteModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeDeleteModal.test.jsx index 880af36e50..0bc87046c2 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeDeleteModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeDeleteModal.test.jsx @@ -32,10 +32,6 @@ describe('NodeDeleteModal', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Mounts successfully', () => { expect(wrapper.length).toBe(1); }); @@ -63,6 +59,7 @@ describe('NodeDeleteModal', () => { }); }); }); + describe('Node without unified job template', () => { test('Mounts successfully', () => { wrapper = mountWithContexts( @@ -79,7 +76,6 @@ describe('NodeDeleteModal', () => { ); expect(wrapper.length).toBe(1); - wrapper.unmount(); }); }); }); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeNextButton.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeNextButton.test.jsx index 8a254db9b1..4950e12391 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeNextButton.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeNextButton.test.jsx @@ -28,10 +28,6 @@ describe('NodeNextButton', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Button text matches', () => { expect(wrapper.find('button').text()).toBe(buttonText); }); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/InventorySourcesList.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/InventorySourcesList.test.jsx index e5237734b0..e6b339500d 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/InventorySourcesList.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/InventorySourcesList.test.jsx @@ -15,9 +15,6 @@ const onUpdateNodeResource = jest.fn(); describe('InventorySourcesList', () => { let wrapper; - afterEach(() => { - wrapper.unmount(); - }); test('Row selected when nodeResource id matches row id and clicking new row makes expected callback', async () => { InventorySourcesAPI.read.mockResolvedValueOnce({ data: { @@ -74,6 +71,7 @@ describe('InventorySourcesList', () => { url: '/api/v2/inventory_sources/2', }); }); + test('Error shown when read() request errors', async () => { InventorySourcesAPI.read.mockRejectedValue(new Error()); await act(async () => { diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/JobTemplatesList.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/JobTemplatesList.test.jsx index b66a6b1c38..8c15382a2c 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/JobTemplatesList.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/JobTemplatesList.test.jsx @@ -17,8 +17,8 @@ describe('JobTemplatesList', () => { let wrapper; afterEach(() => { jest.clearAllMocks(); - wrapper.unmount(); }); + test('Row selected when nodeResource id matches row id and clicking new row makes expected callback', async () => { JobTemplatesAPI.read.mockResolvedValueOnce({ data: { @@ -81,6 +81,7 @@ describe('JobTemplatesList', () => { project: 2, }); }); + test('Error shown when read() request errors', async () => { JobTemplatesAPI.read.mockRejectedValue(new Error()); JobTemplatesAPI.readOptions.mockResolvedValue({ diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/ProjectsList.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/ProjectsList.test.jsx index a6761c999e..7ecf17c088 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/ProjectsList.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/ProjectsList.test.jsx @@ -15,9 +15,7 @@ const onUpdateNodeResource = jest.fn(); describe('ProjectsList', () => { let wrapper; - afterEach(() => { - wrapper.unmount(); - }); + test('Row selected when nodeResource id matches row id and clicking new row makes expected callback', async () => { ProjectsAPI.read.mockResolvedValueOnce({ data: { @@ -70,6 +68,7 @@ describe('ProjectsList', () => { url: '/api/v2/projects/2', }); }); + test('Error shown when read() request errors', async () => { ProjectsAPI.read.mockRejectedValue(new Error()); await act(async () => { diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/WorkflowJobTemplatesList.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/WorkflowJobTemplatesList.test.jsx index a844f56a11..5ad36450ab 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/WorkflowJobTemplatesList.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeTypeStep/WorkflowJobTemplatesList.test.jsx @@ -15,9 +15,7 @@ const onUpdateNodeResource = jest.fn(); describe('WorkflowJobTemplatesList', () => { let wrapper; - afterEach(() => { - wrapper.unmount(); - }); + test('Row selected when nodeResource id matches row id and clicking new row makes expected callback', async () => { WorkflowJobTemplatesAPI.read.mockResolvedValueOnce({ data: { @@ -76,6 +74,7 @@ describe('WorkflowJobTemplatesList', () => { url: '/api/v2/workflow_job_templates/2', }); }); + test('Error shown when read() request errors', async () => { WorkflowJobTemplatesAPI.read.mockRejectedValue(new Error()); await act(async () => { diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx index 5abca07f18..e7d7a92f06 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx @@ -85,7 +85,6 @@ describe('NodeViewModal', () => { afterAll(() => { jest.resetAllMocks(); - wrapper.unmount(); }); test('should render prompt detail', () => { @@ -151,7 +150,6 @@ describe('NodeViewModal', () => { expect(JobTemplatesAPI.readWebhookKey).not.toHaveBeenCalledWith(); expect(JobTemplatesAPI.readLaunch).toHaveBeenCalledWith(1); expect(JobTemplatesAPI.readInstanceGroups).toHaveBeenCalledTimes(1); - wrapper.unmount(); jest.clearAllMocks(); }); @@ -169,7 +167,6 @@ describe('NodeViewModal', () => { }); waitForLoaded(wrapper); expect(wrapper.find('ContentError').length).toBe(1); - wrapper.unmount(); jest.clearAllMocks(); }); @@ -186,7 +183,6 @@ describe('NodeViewModal', () => { }); waitForLoaded(wrapper); expect(wrapper.find('Button#node-view-edit-button').length).toBe(1); - wrapper.unmount(); jest.clearAllMocks(); }); @@ -203,7 +199,6 @@ describe('NodeViewModal', () => { }); waitForLoaded(wrapper); expect(wrapper.find('Button#node-view-edit-button').length).toBe(0); - wrapper.unmount(); jest.clearAllMocks(); }); }); @@ -237,7 +232,6 @@ describe('NodeViewModal', () => { expect(WorkflowJobTemplatesAPI.readLaunch).not.toHaveBeenCalled(); expect(JobTemplatesAPI.readLaunch).not.toHaveBeenCalled(); expect(JobTemplatesAPI.readInstanceGroups).not.toHaveBeenCalled(); - wrapper.unmount(); jest.clearAllMocks(); }); }); @@ -271,7 +265,6 @@ describe('NodeViewModal', () => { expect(WorkflowJobTemplatesAPI.readLaunch).not.toHaveBeenCalled(); expect(JobTemplatesAPI.readLaunch).not.toHaveBeenCalled(); expect(JobTemplatesAPI.readInstanceGroups).not.toHaveBeenCalled(); - wrapper.unmount(); jest.clearAllMocks(); }); }); @@ -305,7 +298,6 @@ describe('NodeViewModal', () => { expect(WorkflowJobTemplatesAPI.readLaunch).not.toHaveBeenCalled(); expect(JobTemplatesAPI.readLaunch).not.toHaveBeenCalled(); expect(JobTemplatesAPI.readInstanceGroups).not.toHaveBeenCalled(); - wrapper.unmount(); jest.clearAllMocks(); }); }); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/RunStep.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/RunStep.test.jsx index e8ff15780c..2424d819b6 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/RunStep.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/RunStep.test.jsx @@ -16,10 +16,6 @@ describe('RunStep', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Default selected card matches default link type when present', () => { expect(wrapper.find('#link-type-success').props().isSelected).toBe(true); expect(wrapper.find('#link-type-failure').props().isSelected).toBe(false); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/UnsavedChangesModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/UnsavedChangesModal.test.jsx index 5695469ce2..92fe520e06 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/UnsavedChangesModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/UnsavedChangesModal.test.jsx @@ -17,10 +17,6 @@ describe('UnsavedChangesModal', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Exit Without Saving button dispatches as expected', () => { wrapper.find('button#confirm-exit-without-saving').simulate('click'); expect(onExit).toHaveBeenCalled(); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Visualizer.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Visualizer.test.jsx index 8a93cd116d..0ee9209487 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Visualizer.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Visualizer.test.jsx @@ -141,7 +141,6 @@ describe('Visualizer', () => { }); afterAll(() => { - wrapper.unmount(); delete window.SVGElement.prototype.getBBox; delete window.SVGElement.prototype.getBoundingClientRect; delete window.SVGElement.prototype.height; diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerLink.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerLink.test.jsx index ceb16b6b2d..5a8c90ef5d 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerLink.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerLink.test.jsx @@ -62,9 +62,6 @@ describe('VisualizerLink', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); test('Displays action tooltip on hover and updates help text on hover', () => { expect(wrapper.find('WorkflowActionTooltip').length).toBe(0); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerNode.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerNode.test.jsx index 184b56373b..7a47356557 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerNode.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerNode.test.jsx @@ -73,12 +73,11 @@ describe('VisualizerNode', () => { afterEach(() => { jest.clearAllMocks(); }); - afterAll(() => { - wrapper.unmount(); - }); + test('Displays unified job template name inside node', () => { expect(wrapper.find('NodeResourceName').text()).toBe('Automation JT'); }); + test('Displays action tooltip on hover and updates help text on hover', () => { expect(wrapper.find('WorkflowActionTooltip').length).toBe(0); wrapper.find('g').simulate('mouseenter'); @@ -234,9 +233,7 @@ describe('VisualizerNode', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); + test('Displays correct help text when hovering over node while adding link', () => { expect(wrapper.find('WorkflowActionTooltip').length).toBe(0); wrapper.find('g').simulate('mouseenter'); @@ -248,6 +245,7 @@ describe('VisualizerNode', () => { expect(wrapper.find('WorkflowActionTooltip').length).toBe(0); expect(updateHelpText).toHaveBeenCalledWith(null); }); + test('Dispatches properly when node is clicked', () => { wrapper .find('foreignObject') @@ -259,6 +257,7 @@ describe('VisualizerNode', () => { }); }); }); + describe('Node without unified job template', () => { test('Displays DELETED text inside node when unified job template is missing', () => { const wrapper = mountWithContexts( @@ -279,6 +278,7 @@ describe('VisualizerNode', () => { expect(wrapper.find('NodeResourceName').text()).toBe('DELETED'); }); }); + describe('Node without full unified job template', () => { let wrapper; beforeEach(() => { @@ -336,9 +336,7 @@ describe('VisualizerNode', () => { ); }); - afterEach(() => { - wrapper.unmount(); - }); + test('Attempts to fetch full unified job template on view', async () => { wrapper.find('g').simulate('mouseenter'); await act(async () => { @@ -348,6 +346,7 @@ describe('VisualizerNode', () => { }); expect(JobTemplatesAPI.readDetail).toHaveBeenCalledWith(7); }); + test('Displays error fetching full unified job template', async () => { JobTemplatesAPI.readDetail.mockRejectedValueOnce( new Error({ @@ -371,6 +370,7 @@ describe('VisualizerNode', () => { wrapper.update(); expect(wrapper.find('AlertModal').length).toBe(1); }); + test('Attempts to fetch credentials on view', async () => { JobTemplatesAPI.readDetail.mockResolvedValueOnce({ data: { diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerToolbar.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerToolbar.test.jsx index 3a6035eff1..aa55c4c6f3 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerToolbar.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/VisualizerToolbar.test.jsx @@ -54,10 +54,6 @@ describe('VisualizerToolbar', () => { ); }); - afterAll(() => { - wrapper.unmount(); - }); - test('Shows correct number of nodes', () => { // The start node (id=1) and deleted nodes (isDeleted=true) should be ignored expect(wrapper.find('Badge').text()).toBe('1'); diff --git a/awx/ui_next/src/screens/User/UserList/UserListItem.test.jsx b/awx/ui_next/src/screens/User/UserList/UserListItem.test.jsx index d41104b1dc..5bc6b4d7ac 100644 --- a/awx/ui_next/src/screens/User/UserList/UserListItem.test.jsx +++ b/awx/ui_next/src/screens/User/UserList/UserListItem.test.jsx @@ -16,10 +16,6 @@ i18n.activate('en'); let wrapper; -afterEach(() => { - wrapper.unmount(); -}); - describe('UserListItem with full permissions', () => { beforeEach(() => { wrapper = mountWithContexts( @@ -39,9 +35,11 @@ describe('UserListItem with full permissions', () => { ); }); + test('initially renders successfully', () => { expect(wrapper.length).toBe(1); }); + test('edit button shown to users with edit capabilities', () => { expect(wrapper.find('PencilAltIcon').exists()).toBeTruthy(); }); diff --git a/awx/ui_next/src/screens/User/UserRoles/UserRolesList.test.jsx b/awx/ui_next/src/screens/User/UserRoles/UserRolesList.test.jsx index a4e11c93f9..367ded2bb0 100644 --- a/awx/ui_next/src/screens/User/UserRoles/UserRolesList.test.jsx +++ b/awx/ui_next/src/screens/User/UserRoles/UserRolesList.test.jsx @@ -94,6 +94,7 @@ const roles = { }; describe('', () => { + let wrapper; beforeEach(() => { UsersAPI.readOptions.mockResolvedValue({ data: { @@ -102,11 +103,11 @@ describe('', () => { }, }); }); - let wrapper; + afterEach(() => { jest.clearAllMocks(); - wrapper.unmount(); }); + test('should render properly', async () => { UsersAPI.readRoles.mockResolvedValue(roles); diff --git a/awx/ui_next/src/screens/User/UserTeams/UserTeamList.test.jsx b/awx/ui_next/src/screens/User/UserTeams/UserTeamList.test.jsx index 5d17e6e7ee..b1b385e4ad 100644 --- a/awx/ui_next/src/screens/User/UserTeams/UserTeamList.test.jsx +++ b/awx/ui_next/src/screens/User/UserTeams/UserTeamList.test.jsx @@ -118,7 +118,6 @@ describe('', () => { afterEach(() => { jest.clearAllMocks(); - wrapper.unmount(); }); test('should load and render teams', async () => { diff --git a/awx/ui_next/src/screens/User/UserTokenAdd/UserTokenAdd.test.jsx b/awx/ui_next/src/screens/User/UserTokenAdd/UserTokenAdd.test.jsx index b74d2712c1..c003b059fd 100644 --- a/awx/ui_next/src/screens/User/UserTokenAdd/UserTokenAdd.test.jsx +++ b/awx/ui_next/src/screens/User/UserTokenAdd/UserTokenAdd.test.jsx @@ -22,9 +22,9 @@ const onSuccessfulAdd = jest.fn(); describe('', () => { afterEach(() => { - wrapper.unmount(); jest.clearAllMocks(); }); + test('handleSubmit should post to api', async () => { await act(async () => { wrapper = mountWithContexts( diff --git a/awx/ui_next/src/screens/User/UserTokens/UserTokens.test.jsx b/awx/ui_next/src/screens/User/UserTokens/UserTokens.test.jsx index 7a66eadca7..16017a5aa5 100644 --- a/awx/ui_next/src/screens/User/UserTokens/UserTokens.test.jsx +++ b/awx/ui_next/src/screens/User/UserTokens/UserTokens.test.jsx @@ -8,10 +8,6 @@ import UserTokens from './UserTokens'; describe('', () => { let wrapper; - afterEach(() => { - wrapper.unmount(); - }); - test('renders successfully', () => { wrapper = mountWithContexts(); expect(wrapper.length).toBe(1); diff --git a/awx/ui_next/src/screens/User/Users.test.jsx b/awx/ui_next/src/screens/User/Users.test.jsx index 146599b762..605aa9b797 100644 --- a/awx/ui_next/src/screens/User/Users.test.jsx +++ b/awx/ui_next/src/screens/User/Users.test.jsx @@ -1,38 +1,23 @@ import React from 'react'; -import { createMemoryHistory } from 'history'; - -import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; - +import { shallow } from 'enzyme'; import Users from './Users'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), + useRouteMatch: () => ({ + path: 'users', + }), })); describe('', () => { - test('initially renders successfully', () => { - const wrapper = mountWithContexts(); - wrapper.unmount(); - }); + test('should set breadcrumbs', () => { + const wrapper = shallow(); - test('should display a breadcrumb heading', () => { - const history = createMemoryHistory({ - initialEntries: ['/users'], + const header = wrapper.find('ScreenHeader'); + expect(header.prop('streamType')).toBe('user'); + expect(header.prop('breadcrumbConfig')).toEqual({ + '/users': 'Users', + '/users/add': 'Create New User', }); - const match = { path: '/users', url: '/users', isExact: true }; - - const wrapper = mountWithContexts(, { - context: { - router: { - history, - route: { - location: history.location, - match, - }, - }, - }, - }); - expect(wrapper.find('Title').length).toBe(1); - wrapper.unmount(); }); }); diff --git a/awx/ui_next/src/screens/User/shared/UserForm.test.jsx b/awx/ui_next/src/screens/User/shared/UserForm.test.jsx index 69c777bc5b..6e327290a9 100644 --- a/awx/ui_next/src/screens/User/shared/UserForm.test.jsx +++ b/awx/ui_next/src/screens/User/shared/UserForm.test.jsx @@ -27,7 +27,6 @@ describe('', () => { }); afterEach(() => { - wrapper.unmount(); jest.clearAllMocks(); }); diff --git a/awx/ui_next/src/screens/User/shared/UserTokenForm.test.jsx b/awx/ui_next/src/screens/User/shared/UserTokenForm.test.jsx index ddfcbd6cb4..9e6f2df703 100644 --- a/awx/ui_next/src/screens/User/shared/UserTokenForm.test.jsx +++ b/awx/ui_next/src/screens/User/shared/UserTokenForm.test.jsx @@ -28,9 +28,7 @@ const applications = { }; describe('', () => { let wrapper; - beforeEach(() => {}); afterEach(() => { - wrapper.unmount(); jest.clearAllMocks(); }); diff --git a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalList.test.jsx b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalList.test.jsx index 78a299d1ad..0358252713 100644 --- a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalList.test.jsx +++ b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalList.test.jsx @@ -29,7 +29,6 @@ describe('', () => { }); afterEach(() => { - wrapper.unmount(); jest.clearAllMocks(); }); diff --git a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalListItem.test.jsx b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalListItem.test.jsx index e64db9f3cc..06a0f18600 100644 --- a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalListItem.test.jsx +++ b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovalList/WorkflowApprovalListItem.test.jsx @@ -9,9 +9,6 @@ jest.mock('../../../api/models/WorkflowApprovals'); describe('', () => { let wrapper; - afterEach(() => { - wrapper.unmount(); - }); test('should display never expires status', () => { wrapper = mountWithContexts( @@ -28,6 +25,7 @@ describe('', () => { ); expect(wrapper.find('Label[children="Never expires"]').length).toBe(1); }); + test('should display timed out status', () => { wrapper = mountWithContexts( @@ -47,6 +45,7 @@ describe('', () => { ); expect(wrapper.find('Label[children="Timed out"]').length).toBe(1); }); + test('should display canceled status', () => { wrapper = mountWithContexts(
@@ -66,6 +65,7 @@ describe('', () => { ); expect(wrapper.find('Label[children="Canceled"]').length).toBe(1); }); + test('should display approved status', () => { wrapper = mountWithContexts(
@@ -93,6 +93,7 @@ describe('', () => { ); expect(wrapper.find('Label[children="Approved"]').length).toBe(1); }); + test('should display denied status', () => { wrapper = mountWithContexts(
diff --git a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx index 4e7d81b18f..05b1bf08b2 100644 --- a/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx +++ b/awx/ui_next/src/screens/WorkflowApproval/WorkflowApprovals.test.jsx @@ -11,10 +11,6 @@ import mockWorkflowApprovals from './data.workflowApprovals.json'; jest.mock('../../api'); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), -})); - describe('', () => { beforeEach(() => { WorkflowApprovalsAPI.read.mockResolvedValue({ @@ -70,6 +66,5 @@ describe('', () => { await waitForElement(wrapper, 'ContentLoading', el => el.length === 0); expect(wrapper.find('Title').length).toBe(1); - wrapper.unmount(); }); }); diff --git a/awx/ui_next/src/screens/WorkflowApproval/shared/WorkflowApprovalStatus.test.jsx b/awx/ui_next/src/screens/WorkflowApproval/shared/WorkflowApprovalStatus.test.jsx index 41d4965d26..e28ff7638b 100644 --- a/awx/ui_next/src/screens/WorkflowApproval/shared/WorkflowApprovalStatus.test.jsx +++ b/awx/ui_next/src/screens/WorkflowApproval/shared/WorkflowApprovalStatus.test.jsx @@ -8,15 +8,14 @@ const workflowApproval = mockWorkflowApprovals.results[0]; describe('', () => { let wrapper; - afterEach(() => { - wrapper.unmount(); - }); + test('shows no expiration when approval status is pending and no approval_expiration', () => { wrapper = mountWithContexts( ); expect(wrapper.text()).toBe('Never expires'); }); + test('shows expiration date/time when approval status is pending and approval_expiration present', () => { wrapper = mountWithContexts( ', () => { `Expires on ${formatDateString('2020-10-10T17:13:12.067947Z')}` ); }); + test('shows when an approval has timed out', () => { wrapper = mountWithContexts( ', () => { ); expect(wrapper.find('Label').text()).toBe('Timed out'); }); + test('shows when an approval has canceled', () => { wrapper = mountWithContexts( ', () => { ); expect(wrapper.find('Label').text()).toBe('Canceled'); }); + test('shows when an approval has approved', () => { wrapper = mountWithContexts( ', () => { ); expect(wrapper.find('Label').text()).toBe('Approved'); }); + test('shows when an approval has denied', () => { wrapper = mountWithContexts(