Skip to content

Commit 8a2e487

Browse files
authored
Merge pull request #9535 from asirvadAbrahamVarghese/zone-form-automation-testing
Added automated tests with cypress for Zone form
2 parents b3412fd + a916914 commit 8a2e487

File tree

1 file changed

+282
-0
lines changed
  • cypress/e2e/ui/Settings/Application-Settings

1 file changed

+282
-0
lines changed
Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
/* eslint-disable no-undef */
2+
import { flashClassMap } from '../../../../support/assertions/assertion_constants';
3+
import {
4+
LABEL_CONFIG_KEYS,
5+
FIELD_CONFIG_KEYS,
6+
FIELD_TYPES,
7+
BUTTON_CONFIG_KEYS,
8+
} from '../../../../support/commands/constants/command_constants.js';
9+
10+
// Component route url
11+
const COMPONENT_ROUTE_URL = '/ops/explorer#/';
12+
13+
// Menu options
14+
const SETTINGS_LABEL = 'Settings';
15+
const APP_SETTINGS_OPTION = 'Application Settings';
16+
17+
// Accordion items
18+
const MANAGEIQ_REGION_ACCORDION_ITEM = /^ManageIQ Region:/;
19+
const ZONES_ACCORDION_ITEM = 'Zones';
20+
21+
// Config options
22+
const CONFIG_TOOLBAR_BUTTON = 'Configuration';
23+
const ADD_ZONE_CONFIG_OPTION = 'Add a new Zone';
24+
const EDIT_ZONE_CONFIG_OPTION = 'Edit this Zone';
25+
const DELETE_ZONE_CONFIG_OPTION = 'Delete this Zone';
26+
27+
// Field values
28+
const NAME_FIELD_LABEL = 'Name';
29+
const DESCRIPTION_FIELD_LABEL = 'Description';
30+
const SERVER_IP_FIELD_LABEL = 'Server IP';
31+
const MAX_SCAN_FIELD_LABEL = 'VM Scans';
32+
const FORM_HEADER_FRAGMENT = 'Zone';
33+
const INFO_SUB_HEADER = 'Info';
34+
const SETTINGS_SUB_HEADER = 'Settings';
35+
const ZONE_NAME = 'Test-Zone-Name';
36+
const INITIAL_ZONE_DESCRIPTION = 'Test-Zone-Description';
37+
const UPDATED_ZONE_DESCRIPTION = 'Test-Zone-Description-Updated';
38+
const INITIAL_SERVER_IP = '0.0.0.0';
39+
const UPDATED_SERVER_IP = '1.1.1.1';
40+
const INITIAL_MAX_SCAN_LIMIT = 5;
41+
const UPDATED_MAX_SCAN_LIMIT = 10;
42+
43+
// Buttons
44+
const SAVE_BUTTON_TEXT = 'Save';
45+
const CANCEL_BUTTON_TEXT = 'Cancel';
46+
const ADD_BUTTON_TEXT = 'Add';
47+
const RESET_BUTTON_TEXT = 'Reset';
48+
49+
// Flash message text snippets
50+
const FLASH_MESSAGE_OPERATION_CANCELED = 'cancel';
51+
const FLASH_MESSAGE_ZONE_UPDATED = 'queued';
52+
const FLASH_MESSAGE_OPERATION_RESET = 'reset';
53+
const DELETE_CONFIRM_TEXT = 'delete';
54+
55+
function addZone() {
56+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, ADD_ZONE_CONFIG_OPTION);
57+
cy.getFormInputFieldByIdAndType({ inputId: 'name' }).type(ZONE_NAME);
58+
cy.getFormInputFieldByIdAndType({ inputId: 'description' }).type(
59+
INITIAL_ZONE_DESCRIPTION
60+
);
61+
cy.getFormInputFieldByIdAndType({ inputId: 'settings.proxy_server_ip' }).type(
62+
INITIAL_SERVER_IP
63+
);
64+
cy.getFormSelectFieldById({
65+
selectId: 'settings.concurrent_vm_scans',
66+
}).select(INITIAL_MAX_SCAN_LIMIT);
67+
cy.interceptApi({
68+
alias: 'createZoneApi',
69+
urlPattern: '/api/zones',
70+
triggerFn: () =>
71+
cy
72+
.getFormFooterButtonByTypeWithText({
73+
buttonText: ADD_BUTTON_TEXT,
74+
buttonType: 'submit',
75+
})
76+
.should('be.enabled')
77+
.click(),
78+
});
79+
return cy.then(() => {
80+
return `Zone: ${INITIAL_ZONE_DESCRIPTION}`;
81+
});
82+
}
83+
84+
function validateFormElements(isEditForm = false) {
85+
cy.expect_explorer_title(FORM_HEADER_FRAGMENT);
86+
cy.get('#main-content .bx--form h3').contains(INFO_SUB_HEADER);
87+
// Validate form labels
88+
cy.validateFormLabels([
89+
{
90+
[LABEL_CONFIG_KEYS.FOR_VALUE]: 'name',
91+
[LABEL_CONFIG_KEYS.EXPECTED_TEXT]: NAME_FIELD_LABEL,
92+
},
93+
{
94+
[LABEL_CONFIG_KEYS.FOR_VALUE]: 'description',
95+
[LABEL_CONFIG_KEYS.EXPECTED_TEXT]: DESCRIPTION_FIELD_LABEL,
96+
},
97+
{
98+
[LABEL_CONFIG_KEYS.FOR_VALUE]: 'settings.proxy_server_ip',
99+
[LABEL_CONFIG_KEYS.EXPECTED_TEXT]: SERVER_IP_FIELD_LABEL,
100+
},
101+
{
102+
[LABEL_CONFIG_KEYS.FOR_VALUE]: 'settings.concurrent_vm_scans',
103+
[LABEL_CONFIG_KEYS.EXPECTED_TEXT]: MAX_SCAN_FIELD_LABEL,
104+
},
105+
]);
106+
// Validate form fields
107+
cy.validateFormFields([
108+
{
109+
[FIELD_CONFIG_KEYS.ID]: 'name',
110+
[FIELD_CONFIG_KEYS.SHOULD_BE_DISABLED]: isEditForm,
111+
},
112+
{
113+
[FIELD_CONFIG_KEYS.ID]: 'description',
114+
},
115+
{
116+
[FIELD_CONFIG_KEYS.ID]: 'settings.proxy_server_ip',
117+
},
118+
{
119+
[FIELD_CONFIG_KEYS.ID]: 'settings.concurrent_vm_scans',
120+
[FIELD_CONFIG_KEYS.FIELD_TYPE]: FIELD_TYPES.SELECT,
121+
},
122+
]);
123+
// Validate form footer buttons
124+
cy.validateFormFooterButtons([
125+
{
126+
[BUTTON_CONFIG_KEYS.BUTTON_TEXT]: CANCEL_BUTTON_TEXT,
127+
},
128+
{
129+
[BUTTON_CONFIG_KEYS.BUTTON_TEXT]: isEditForm
130+
? SAVE_BUTTON_TEXT
131+
: ADD_BUTTON_TEXT,
132+
[BUTTON_CONFIG_KEYS.BUTTON_TYPE]: 'submit',
133+
[BUTTON_CONFIG_KEYS.SHOULD_BE_DISABLED]: true,
134+
},
135+
...(isEditForm
136+
? [
137+
{
138+
[BUTTON_CONFIG_KEYS.BUTTON_TEXT]: RESET_BUTTON_TEXT,
139+
[BUTTON_CONFIG_KEYS.SHOULD_BE_DISABLED]: true,
140+
},
141+
]
142+
: []),
143+
]);
144+
}
145+
146+
function cleanUp() {
147+
cy.get('li.list-group-item').each((item) => {
148+
const text = item.text().trim();
149+
if (text.includes(INITIAL_ZONE_DESCRIPTION)) {
150+
if (!item.hasClass('node-selected')) {
151+
cy.wrap(item).click();
152+
}
153+
cy.expect_browser_confirm_with_text({
154+
confirmTriggerFn: () =>
155+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, DELETE_ZONE_CONFIG_OPTION),
156+
});
157+
return false; // exit the iteration
158+
}
159+
return null; // has no impact - just to get rid of eslint warning
160+
});
161+
}
162+
163+
function selectZoneAccordionItem(childZoneNode) {
164+
cy.selectAccordionItem([
165+
MANAGEIQ_REGION_ACCORDION_ITEM,
166+
ZONES_ACCORDION_ITEM,
167+
...(childZoneNode ? [childZoneNode] : []),
168+
]);
169+
}
170+
171+
describe('Automate Zone form operations: Settings > Application Settings > Settings > Zones > Configuration > Add a new Zone', () => {
172+
beforeEach(() => {
173+
cy.login();
174+
cy.menu(SETTINGS_LABEL, APP_SETTINGS_OPTION);
175+
cy.accordion(SETTINGS_LABEL);
176+
selectZoneAccordionItem();
177+
});
178+
179+
it('Validate the visibility and state of add form elements', () => {
180+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, ADD_ZONE_CONFIG_OPTION);
181+
validateFormElements();
182+
});
183+
184+
it('Checking whether cancel button works on the add form', () => {
185+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, ADD_ZONE_CONFIG_OPTION);
186+
cy.getFormFooterButtonByTypeWithText({
187+
buttonText: CANCEL_BUTTON_TEXT,
188+
}).click();
189+
cy.expect_flash(flashClassMap.warning, FLASH_MESSAGE_OPERATION_CANCELED);
190+
});
191+
192+
it('Checking whether add, edit & delete zone works', () => {
193+
/* ===== Add ===== */
194+
addZone().then((createdZone) => {
195+
// Here the createdZone will have value "Zone: Test-Zone-Description",
196+
// which is the accordion item to be selected
197+
cy.expect_flash(flashClassMap.success, FLASH_MESSAGE_ZONE_UPDATED);
198+
selectZoneAccordionItem(createdZone);
199+
});
200+
/* ===== Edit ===== */
201+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, EDIT_ZONE_CONFIG_OPTION);
202+
cy.getFormInputFieldByIdAndType({ inputId: 'description' })
203+
.clear()
204+
.type(UPDATED_SERVER_IP);
205+
cy.getFormSelectFieldById({
206+
selectId: 'settings.concurrent_vm_scans',
207+
}).select(UPDATED_MAX_SCAN_LIMIT);
208+
cy.getFormFooterButtonByTypeWithText({
209+
buttonText: SAVE_BUTTON_TEXT,
210+
buttonType: 'submit',
211+
})
212+
.should('be.enabled')
213+
.click();
214+
cy.expect_flash(flashClassMap.success, FLASH_MESSAGE_ZONE_UPDATED);
215+
/* ===== Delete ===== */
216+
cy.expect_browser_confirm_with_text({
217+
confirmTriggerFn: () =>
218+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, DELETE_ZONE_CONFIG_OPTION),
219+
containsText: DELETE_CONFIRM_TEXT,
220+
});
221+
cy.expect_flash(flashClassMap.success, DELETE_CONFIRM_TEXT);
222+
});
223+
224+
it('Validate the visibility and state of edit form elements', () => {
225+
addZone().then((createdZone) => {
226+
// Here the createdZone will have value "Zone: Test-Zone-Description",
227+
// which is the accordion item to be selected
228+
selectZoneAccordionItem(createdZone);
229+
});
230+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, EDIT_ZONE_CONFIG_OPTION);
231+
validateFormElements(true);
232+
cy.getFormFooterButtonByTypeWithText({
233+
buttonText: CANCEL_BUTTON_TEXT,
234+
}).click();
235+
});
236+
237+
it('Checking whether cancel & reset buttons work on the edit form', () => {
238+
addZone().then((createdZone) => {
239+
// Here the createdZone will have value "Zone: Test-Zone-Description",
240+
// which is the accordion item to be selected
241+
selectZoneAccordionItem(createdZone);
242+
});
243+
cy.toolbar(CONFIG_TOOLBAR_BUTTON, EDIT_ZONE_CONFIG_OPTION);
244+
/* ===== Reset ===== */
245+
cy.getFormInputFieldByIdAndType({ inputId: 'description' })
246+
.clear()
247+
.type(UPDATED_ZONE_DESCRIPTION);
248+
cy.getFormInputFieldByIdAndType({ inputId: 'settings.proxy_server_ip' })
249+
.clear()
250+
.type(UPDATED_SERVER_IP);
251+
cy.getFormFooterButtonByTypeWithText({ buttonText: RESET_BUTTON_TEXT })
252+
.should('be.enabled')
253+
.click();
254+
cy.expect_flash(flashClassMap.warning, FLASH_MESSAGE_OPERATION_RESET);
255+
cy.getFormInputFieldByIdAndType({ inputId: 'description' }).should(
256+
'have.value',
257+
INITIAL_ZONE_DESCRIPTION
258+
);
259+
cy.getFormInputFieldByIdAndType({
260+
inputId: 'settings.proxy_server_ip',
261+
}).should('have.value', INITIAL_SERVER_IP);
262+
/* ===== Cancel ===== */
263+
cy.getFormFooterButtonByTypeWithText({
264+
buttonText: CANCEL_BUTTON_TEXT,
265+
}).click();
266+
cy.expect_flash(flashClassMap.warning, FLASH_MESSAGE_OPERATION_CANCELED);
267+
});
268+
269+
afterEach(() => {
270+
cy.url()
271+
.then((url) => {
272+
// Ensures navigation to Settings -> Application-Settings in the UI
273+
if (!url.endsWith(COMPONENT_ROUTE_URL)) {
274+
cy.visit(COMPONENT_ROUTE_URL);
275+
}
276+
cy.accordion(SETTINGS_LABEL);
277+
})
278+
.then(() => {
279+
cleanUp();
280+
});
281+
});
282+
});

0 commit comments

Comments
 (0)