Skip to content

Commit 2a66eaa

Browse files
Add test for Group Management (#240)
* Add test for Group Management * Add permissions to a group * Add waiting for delete of a user/group to end and check that it ends with 204 * Admin user can add and remove users from a group * Remove use of .click({force: true}) and fix it to make it work * Add some waits and checks * Use removeAllPermissions and use variable for types of permission
1 parent 8a5a184 commit 2a66eaa

File tree

4 files changed

+164
-4
lines changed

4 files changed

+164
-4
lines changed

src/containers/group-management/group-detail.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ class GroupDetail extends React.Component<RouteComponentProps, IState> {
264264
style={{ marginTop: '16px' }}
265265
alignItems={{ default: 'alignItemsCenter' }}
266266
key={group.name}
267+
className={group.name}
267268
>
268269
<FlexItem style={{ minWidth: '200px' }}>{group.name}</FlexItem>
269270
<FlexItem grow={{ default: 'grow' }}>

src/containers/group-management/group-list.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ class GroupList extends React.Component<RouteComponentProps, IState> {
356356
<td>
357357
{!!user && user.model_permissions.delete_group && (
358358
<Button
359+
aria-label={'Delete'}
359360
key='delete'
360361
variant='danger'
361362
onClick={() =>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
describe('Hub Group Management Tests', () => {
2+
var host = Cypress.env("host");
3+
var adminUsername = Cypress.env("username");
4+
var adminPassword = Cypress.env("password");
5+
6+
beforeEach(() => {
7+
cy.visit(host);
8+
});
9+
10+
it('admin user can create/delete a group', () => {
11+
let name = 'testGroup';
12+
cy.login(adminUsername, adminPassword);
13+
cy.createGroup(name);
14+
cy.contains(name).should('exist');
15+
cy.deleteGroup(name);
16+
cy.contains(name).should('not.exist');
17+
});
18+
19+
it('admin user can add/remove a user to/from a group', () => {
20+
let groupName = 'testGroup';
21+
let userName = 'testUser';
22+
cy.login(adminUsername, adminPassword);
23+
cy.createGroup(groupName);
24+
cy.createUser(userName);
25+
cy.addUserToGroup(groupName, userName);
26+
cy.removeUserFromGroup(groupName, userName);
27+
cy.deleteGroup(groupName);
28+
cy.deleteUser(userName);
29+
});
30+
31+
it('admin user can add/remove permissions to/from a group', () => {
32+
let name = 'testGroup';
33+
let permissionTypes = [ 'namespaces', 'collections', 'users', 'groups', 'remotes' ];
34+
cy.login(adminUsername, adminPassword);
35+
cy.createGroup(name);
36+
cy.contains(name).should('exist');
37+
cy.addAllPermissions(name);
38+
permissionTypes.forEach(permGroup => cy.get(`.pf-l-flex.pf-m-align-items-center.${permGroup} [placeholder="No permission"]`).should('not.exist'));;
39+
cy.removeAllPermissions(name);
40+
permissionTypes.forEach(permGroup => cy.get(`.pf-l-flex.pf-m-align-items-center.${permGroup} [placeholder="No permission"]`).should('exist'));;
41+
cy.deleteGroup(name);
42+
cy.contains(name).should('not.exist');
43+
});
44+
45+
});

test/cypress/support/commands.js

+117-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ Cypress.Commands.add('containsnear', {}, (...args) => {
4040
Cypress.Commands.add('menuItem', {}, (name) => {
4141
return cy.contains('#page-sidebar a', name);
4242
});
43-
4443
Cypress.Commands.add('logout', {}, () => {
4544
cy.server();
4645
cy.route('GET', Cypress.env('prefix') + '_ui/v1/me/').as('me');
@@ -59,15 +58,15 @@ Cypress.Commands.add('login', {}, (username, password) => {
5958
cy.wait('@me');
6059
});
6160

62-
Cypress.Commands.add('createUser', {}, (username, password, firstName = null, lastName = null, email = null) => {
61+
Cypress.Commands.add('createUser', {}, (username, password = null, firstName = null, lastName = null, email = null) => {
6362
cy.contains('#page-sidebar a', 'Users').click();
6463

6564
const user = {
6665
firstName: firstName || 'First Name',
6766
lastName: lastName || 'Last Name',
6867
username: username,
6968
email: email || 'firstName@example.com',
70-
password: password,
69+
password: password || 'I am a complicated passw0rd',
7170
};
7271
cy.contains('Create user').click();
7372
cy.get('#first_name').type(user.firstName);
@@ -77,7 +76,102 @@ Cypress.Commands.add('createUser', {}, (username, password, firstName = null, la
7776
cy.get('#password').type(user.password);
7877
cy.get('#password-confirm').type(user.password);
7978

79+
cy.server();
80+
cy.route('POST', Cypress.env('prefix') + '_ui/v1/users/').as('createUser');
81+
8082
cy.contains('Save').click();
83+
cy.wait('@createUser');
84+
});
85+
86+
Cypress.Commands.add('createGroup', {}, (name => {
87+
cy.contains('#page-sidebar a', 'Groups').click();
88+
89+
cy.contains('Create').click();
90+
91+
cy.contains('div', 'Name *').findnear('input').first().type(name);
92+
93+
cy.server();
94+
cy.route('POST', Cypress.env('prefix') + '_ui/v1/groups/').as('createGroup');
95+
cy.contains('[role=dialog] button', 'Create').click();
96+
cy.wait('@createGroup');
97+
});
98+
99+
Cypress.Commands.add('addPermissions', {}, (groupName, permissions) => {
100+
cy.server();
101+
cy.route('GET', Cypress.env('prefix') + '_ui/v1/groups/*/model-permissions/*').as('groups');
102+
cy.contains('#page-sidebar a', 'Groups').click();
103+
cy.get(`[aria-labelledby=${groupName}] a`).click();
104+
cy.wait('@groups');
105+
cy.contains('button', 'Edit').click();
106+
permissions.forEach(permissionElement => {
107+
// closes previously open dropdowns
108+
cy.get('h1').click();
109+
cy.get(`.pf-l-flex.pf-m-align-items-center.${permissionElement.group} [aria-label="Options menu"]`).click();
110+
permissionElement.permissions.forEach(permission => {
111+
cy.contains('button', permission).click();
112+
})
113+
});
114+
cy.contains('button', 'Save').click();
115+
});
116+
117+
Cypress.Commands.add('removePermissions', {}, (groupName, permissions) => {
118+
cy.contains('#page-sidebar a', 'Groups').click();
119+
cy.get(`[aria-labelledby=${groupName}] a`).click();
120+
cy.contains('button', 'Edit').click();
121+
permissions.forEach(permissionElement => {
122+
// closes previously open dropdowns
123+
cy.get('h1').click();
124+
if (permissionElement.permissions.length > 3) {
125+
// Make sure all permissions are visible
126+
cy.containsnear(`.pf-l-flex.pf-m-align-items-center.${permissionElement.group} `, '1 more').first().click();
127+
}
128+
permissionElement.permissions.forEach(permission => {
129+
cy.containsnear(`.pf-l-flex.pf-m-align-items-center.${permissionElement.group} `, permission).findnear('button').first().click();
130+
});
131+
});
132+
cy.contains('button', 'Save').click();
133+
});
134+
135+
const allPerms = [{
136+
group: 'namespaces', permissions: ['Add namespace', 'Change namespace', 'Upload to namespace']
137+
}, {
138+
group: 'collections', permissions: ['Modify Ansible repo content']
139+
},{
140+
group: 'users', permissions: ['View user', 'Delete user', 'Add user', 'Change user']
141+
},{
142+
group: 'groups', permissions: ['View group', 'Delete group', 'Add group', 'Change group']
143+
},{
144+
group: 'remotes', permissions: ['Change collection remote', 'View collection remote']
145+
}];
146+
147+
Cypress.Commands.add('removeAllPermissions', {}, (groupName) => {
148+
cy.removePermissions(groupName, allPerms);
149+
});
150+
151+
Cypress.Commands.add('addAllPermissions', {}, (groupName) => {
152+
cy.addPermissions(groupName, allPerms);
153+
});
154+
155+
Cypress.Commands.add('addUserToGroup', {}, (groupName, userName) => {
156+
cy.contains('#page-sidebar a', 'Groups').click();
157+
cy.get(`[aria-labelledby=${groupName}] a`).click();
158+
cy.contains('button', 'Users').click();
159+
cy.contains('button', 'Add').click();
160+
cy.get('input.pf-c-select__toggle-typeahead').type(userName);
161+
cy.contains('button', userName).click();
162+
// closes previously open dropdown
163+
cy.get('[aria-label="Options menu"]').click();
164+
cy.contains('footer > button', 'Add').click();
165+
cy.get(`[aria-labelledby=${userName}]`).should('exist');
166+
});
167+
168+
Cypress.Commands.add('removeUserFromGroup', {}, (groupName, userName) => {
169+
cy.contains('#page-sidebar a', 'Groups').click();
170+
cy.get(`[aria-labelledby=${groupName}] a`).click();
171+
cy.contains('button', 'Users').click();
172+
cy.get(`[aria-labelledby=${userName}] [aria-label=Actions]`).click();
173+
cy.containsnear(`[aria-labelledby=${userName}] [aria-label=Actions]`, 'Remove').click();
174+
cy.contains(userName).should('not.exist');
81175
});
82176

83177
Cypress.Commands.add('deleteUser', {}, (username) => {
@@ -88,8 +182,27 @@ Cypress.Commands.add('deleteUser', {}, (username) => {
88182
cy.login(adminUsername, adminPassword);
89183

90184
cy.contains('#page-sidebar a', 'Users').click();
91-
185+
cy.server();
186+
cy.route('DELETE', Cypress.env('prefix') + '_ui/v1/users/**').as('deleteUser');
92187
cy.get(`[aria-labelledby=${username}] [aria-label=Actions]`).click();
93188
cy.containsnear(`[aria-labelledby=${username}] [aria-label=Actions]`, 'Delete').click();
94189
cy.contains('[role=dialog] button', 'Delete').click();
190+
cy.wait('@deleteUser');
191+
cy.get('@deleteUser').should('have.property', 'status', 204);
192+
});
193+
194+
Cypress.Commands.add('deleteGroup', {}, (name) => {
195+
var adminUsername = Cypress.env('username');
196+
var adminPassword = Cypress.env('password');
197+
198+
cy.logout();
199+
cy.login(adminUsername, adminPassword);
200+
201+
cy.contains('#page-sidebar a', 'Groups').click();
202+
cy.server();
203+
cy.route('DELETE', Cypress.env('prefix') + '_ui/v1/groups/**').as('deleteGroup');
204+
cy.get(`[aria-labelledby=${name}] [aria-label=Delete]`).click();
205+
cy.contains('[role=dialog] button', 'Delete').click();
206+
cy.wait('@deleteGroup');
207+
cy.get('@deleteGroup').should('have.property', 'status', 204);
95208
});

0 commit comments

Comments
 (0)