mirror of
https://github.com/ansible/awx.git
synced 2026-02-19 20:20:06 -03:30
Add support for deleting templates on templates list (#266)
Adds support for deleting templates from the templates list
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { createMemoryHistory } from 'history';
|
||||
import { mountWithContexts } from '../../../enzymeHelpers';
|
||||
import { mountWithContexts, waitForElement } from '../../../enzymeHelpers';
|
||||
import OrganizationsList, { _OrganizationsList } from '../../../../src/pages/Organizations/screens/OrganizationsList';
|
||||
import { OrganizationsAPI } from '../../../../src/api';
|
||||
|
||||
@@ -122,25 +121,16 @@ describe('<OrganizationsList />', () => {
|
||||
expect(fetchOrgs).toBeCalled();
|
||||
});
|
||||
|
||||
test('error is thrown when org not successfully deleted from api', async () => {
|
||||
const history = createMemoryHistory({
|
||||
initialEntries: ['organizations?order_by=name&page=1&page_size=5'],
|
||||
});
|
||||
wrapper = mountWithContexts(
|
||||
<OrganizationsList />,
|
||||
{ context: { router: { history } } }
|
||||
);
|
||||
await wrapper.setState({
|
||||
test('error is shown when org not successfully deleted from api', async () => {
|
||||
OrganizationsAPI.destroy = () => Promise.reject();
|
||||
wrapper = mountWithContexts(<OrganizationsList />);
|
||||
wrapper.find('OrganizationsList').setState({
|
||||
organizations: mockAPIOrgsList.data.results,
|
||||
itemCount: 3,
|
||||
isInitialized: true,
|
||||
selected: [...mockAPIOrgsList.data.results].push({
|
||||
name: 'Organization 6',
|
||||
id: 'a',
|
||||
})
|
||||
selected: mockAPIOrgsList.data.results.slice(0, 1)
|
||||
});
|
||||
wrapper.update();
|
||||
const component = wrapper.find('OrganizationsList');
|
||||
component.instance().handleOrgDelete();
|
||||
wrapper.find('ToolbarDeleteButton').prop('onDelete')();
|
||||
await waitForElement(wrapper, 'Modal', (el) => el.props().isOpen === true && el.props().title === 'Error!');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,38 +1,63 @@
|
||||
import React from 'react';
|
||||
import { mountWithContexts, waitForElement } from '../../enzymeHelpers';
|
||||
import TemplatesList, { _TemplatesList } from '../../../src/pages/Templates/TemplatesList';
|
||||
import { UnifiedJobTemplatesAPI } from '../../../src/api';
|
||||
import { JobTemplatesAPI, UnifiedJobTemplatesAPI, WorkflowJobTemplatesAPI } from '../../../src/api';
|
||||
|
||||
jest.mock('../../../src/api');
|
||||
|
||||
const mockTemplates = [{
|
||||
id: 1,
|
||||
name: 'Template 1',
|
||||
name: 'Job Template 1',
|
||||
url: '/templates/job_template/1',
|
||||
type: 'job_template',
|
||||
summary_fields: {
|
||||
inventory: {},
|
||||
project: {},
|
||||
user_capabilities: {
|
||||
delete: true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: 'Template 2',
|
||||
name: 'Job Template 2',
|
||||
url: '/templates/job_template/2',
|
||||
type: 'job_template',
|
||||
summary_fields: {
|
||||
inventory: {},
|
||||
project: {},
|
||||
user_capabilities: {
|
||||
delete: true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
name: 'Template 3',
|
||||
name: 'Job Template 3',
|
||||
url: '/templates/job_template/3',
|
||||
type: 'job_template',
|
||||
summary_fields: {
|
||||
inventory: {},
|
||||
project: {},
|
||||
user_capabilities: {
|
||||
delete: true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
name: 'Workflow Job Template 1',
|
||||
url: '/templates/workflow_job_template/4',
|
||||
type: 'workflow_job_template',
|
||||
summary_fields: {
|
||||
user_capabilities: {
|
||||
delete: true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
name: 'Workflow Job Template 2',
|
||||
url: '/templates/workflow_job_template/5',
|
||||
type: 'workflow_job_template',
|
||||
summary_fields: {
|
||||
user_capabilities: {
|
||||
delete: false
|
||||
}
|
||||
}
|
||||
}];
|
||||
|
||||
@@ -60,10 +85,10 @@ describe('<TemplatesList />', () => {
|
||||
});
|
||||
|
||||
test('Templates are retrieved from the api and the components finishes loading', async (done) => {
|
||||
const loadUnifiedJobTemplates = jest.spyOn(_TemplatesList.prototype, 'loadUnifiedJobTemplates');
|
||||
const loadTemplates = jest.spyOn(_TemplatesList.prototype, 'loadTemplates');
|
||||
const wrapper = mountWithContexts(<TemplatesList />);
|
||||
await waitForElement(wrapper, 'TemplatesList', (el) => el.state('contentLoading') === true);
|
||||
expect(loadUnifiedJobTemplates).toHaveBeenCalled();
|
||||
expect(loadTemplates).toHaveBeenCalled();
|
||||
await waitForElement(wrapper, 'TemplatesList', (el) => el.state('contentLoading') === false);
|
||||
done();
|
||||
});
|
||||
@@ -84,7 +109,53 @@ describe('<TemplatesList />', () => {
|
||||
await waitForElement(wrapper, 'TemplatesList', (el) => el.state('contentLoading') === false);
|
||||
wrapper.find('Checkbox#select-all').props().onChange(true);
|
||||
expect(handleSelectAll).toBeCalled();
|
||||
await waitForElement(wrapper, 'TemplatesList', (el) => el.state('selected').length === 3);
|
||||
await waitForElement(wrapper, 'TemplatesList', (el) => el.state('selected').length === 5);
|
||||
done();
|
||||
});
|
||||
|
||||
test('delete button is disabled if user does not have delete capabilities on a selected template', async (done) => {
|
||||
const wrapper = mountWithContexts(<TemplatesList />);
|
||||
wrapper.find('TemplatesList').setState({
|
||||
templates: mockTemplates,
|
||||
itemCount: 5,
|
||||
isInitialized: true,
|
||||
selected: mockTemplates.slice(0, 4)
|
||||
});
|
||||
await waitForElement(wrapper, 'ToolbarDeleteButton * button', (el) => el.getDOMNode().disabled === false);
|
||||
wrapper.find('TemplatesList').setState({
|
||||
selected: mockTemplates
|
||||
});
|
||||
await waitForElement(wrapper, 'ToolbarDeleteButton * button', (el) => el.getDOMNode().disabled === true);
|
||||
done();
|
||||
});
|
||||
|
||||
test('api is called to delete templates for each selected template.', () => {
|
||||
JobTemplatesAPI.destroy = jest.fn();
|
||||
WorkflowJobTemplatesAPI.destroy = jest.fn();
|
||||
const wrapper = mountWithContexts(<TemplatesList />);
|
||||
wrapper.find('TemplatesList').setState({
|
||||
templates: mockTemplates,
|
||||
itemCount: 5,
|
||||
isInitialized: true,
|
||||
isModalOpen: true,
|
||||
selected: mockTemplates.slice(0, 4)
|
||||
});
|
||||
wrapper.find('ToolbarDeleteButton').prop('onDelete')();
|
||||
expect(JobTemplatesAPI.destroy).toHaveBeenCalledTimes(3);
|
||||
expect(WorkflowJobTemplatesAPI.destroy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
test('error is shown when template not successfully deleted from api', async () => {
|
||||
JobTemplatesAPI.destroy = () => Promise.reject();
|
||||
const wrapper = mountWithContexts(<TemplatesList />);
|
||||
wrapper.find('TemplatesList').setState({
|
||||
templates: mockTemplates,
|
||||
itemCount: 1,
|
||||
isInitialized: true,
|
||||
isModalOpen: true,
|
||||
selected: mockTemplates.slice(0, 1)
|
||||
});
|
||||
wrapper.find('ToolbarDeleteButton').prop('onDelete')();
|
||||
await waitForElement(wrapper, 'Modal', (el) => el.props().isOpen === true && el.props().title === 'Error!');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user