18692: Removed tests relation on snackbar
[arvados-workbench2.git] / cypress / integration / virtual-machine-admin.spec.js
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 describe('Virtual machine login manage tests', function() {
6     let activeUser;
7     let adminUser;
8
9     const vmHost = `vm-${Math.floor(999999 * Math.random())}.host`;
10
11     before(function() {
12         // Only set up common users once. These aren't set up as aliases because
13         // aliases are cleaned up after every test. Also it doesn't make sense
14         // to set the same users on beforeEach() over and over again, so we
15         // separate a little from Cypress' 'Best Practices' here.
16         cy.getUser('admin', 'VMAdmin', 'User', true, true)
17             .as('adminUser').then(function() {
18                 adminUser = this.adminUser;
19             }
20         );
21         cy.getUser('user', 'VMActive', 'User', false, true)
22             .as('activeUser').then(function() {
23                 activeUser = this.activeUser;
24             }
25         );
26     });
27
28     it('adds and removes vm logins', function() {
29         cy.loginAs(adminUser);
30         cy.createVirtualMachine(adminUser.token, {hostname: vmHost});
31
32         // Navigate to VM admin
33         cy.get('header button[title="Admin Panel"]').click();
34         cy.get('#admin-menu').contains('Virtual Machines').click();
35
36         // Add login permission to admin
37         cy.get('[data-cy=vm-admin-table]')
38             .contains(vmHost)
39             .parents('tr')
40             .within(() => {
41                 cy.get('button[title="Add Login Permission"]').click();
42             });
43         cy.get('[data-cy=form-dialog]')
44             .should('contain', 'Add login permission')
45             .within(() => {
46                 cy.get('label')
47                   .contains('Search for user')
48                   .parent()
49                   .within(() => {
50                     cy.get('input').type('VMAdmin');
51                   })
52             });
53         cy.get('[role=tooltip]').click();
54         cy.get('[data-cy=form-dialog]')
55             .should('contain', 'Add login permission')
56             .within(() => {
57                 cy.get('label')
58                   .contains('Add groups')
59                   .parent()
60                   .within(() => {
61                     cy.get('input').type('docker sudo{enter}');
62                   })
63             });
64         cy.get('[data-cy=form-dialog]').within(() => {
65             cy.get('[data-cy=form-submit-btn]').click();
66         });
67
68         cy.get('[data-cy=vm-admin-table]')
69             .contains(vmHost)
70             .parents('tr')
71             .within(() => {
72                 cy.get('td').contains('admin');
73         });
74
75         // Add login permission to activeUser
76         cy.get('[data-cy=vm-admin-table]')
77             .contains(vmHost)
78             .parents('tr')
79             .within(() => {
80                 cy.get('button[title="Add Login Permission"]').click();
81             });
82         cy.get('[data-cy=form-dialog]')
83             .should('contain', 'Add login permission')
84             .within(() => {
85                 cy.get('label')
86                   .contains('Search for user')
87                   .parent()
88                   .within(() => {
89                     cy.get('input').type('VMActive user');
90                   })
91             });
92         cy.get('[role=tooltip]').click();
93         cy.get('[data-cy=form-dialog]').within(() => {
94             cy.get('[data-cy=form-submit-btn]').click();
95         });
96
97         cy.get('[data-cy=vm-admin-table]')
98             .contains(vmHost)
99             .parents('tr')
100             .within(() => {
101                 cy.get('td').contains('user');
102         });
103
104         // Check admin's vm page for login
105         cy.get('header button[title="Account Management"]').click();
106         cy.get('#account-menu').contains('Virtual Machines').click();
107
108         cy.get('[data-cy=vm-user-table]')
109             .contains(vmHost)
110             .parents('tr')
111             .within(() => {
112                 cy.get('td').contains('admin');
113                 cy.get('td').contains('docker');
114                 cy.get('td').contains('sudo');
115                 cy.get('td').contains('ssh admin@' + vmHost);
116         });
117
118         // Check activeUser's vm page for login
119         cy.loginAs(activeUser);
120         cy.get('header button[title="Account Management"]').click();
121         cy.get('#account-menu').contains('Virtual Machines').click();
122
123         cy.get('[data-cy=vm-user-table]')
124             .contains(vmHost)
125             .parents('tr')
126             .within(() => {
127                 cy.get('td').contains('user');
128                 cy.get('td').should('not.contain', 'docker');
129                 cy.get('td').should('not.contain', 'sudo');
130                 cy.get('td').contains('ssh user@' + vmHost);
131         });
132
133         // Edit login permissions
134         cy.loginAs(adminUser);
135         cy.get('header button[title="Admin Panel"]').click();
136         cy.get('#admin-menu').contains('Virtual Machines').click();
137
138         cy.get('[data-cy=vm-admin-table]')
139             .contains('admin'); // Wait for page to finish
140
141         cy.get('[data-cy=vm-admin-table]')
142             .contains(vmHost)
143             .parents('tr')
144             .contains('admin')
145             .click();
146
147         cy.get('[data-cy=form-dialog]')
148             .should('contain', 'Update login permission')
149             .within(() => {
150                 cy.get('label')
151                     .contains('Add groups')
152                     .parent()
153                     .as('groupInput');
154             });
155
156         cy.get('@groupInput').within(() => {
157             cy.get('div[role=button]').contains('sudo').parent().find('svg').click();
158             cy.get('div[role=button]').contains('docker').parent().find('svg').click();
159         });
160
161         cy.get('[data-cy=form-dialog]').within(() => {
162             cy.get('[data-cy=form-submit-btn]').click();
163         });
164
165         // Wait for page to finish loading
166         cy.get('[data-cy=vm-admin-table]')
167             .contains(vmHost)
168             .parents('tr')
169             .within(() => {
170                 cy.get('div[role=button]')
171                     .parent()
172                     .first()
173                     .contains('admin')
174             });
175
176         cy.get('[data-cy=vm-admin-table]')
177             .contains(vmHost)
178             .parents('tr')
179             .contains('user')
180             .click();
181
182         cy.get('[data-cy=form-dialog]')
183             .should('contain', 'Update login permission')
184             .within(() => {
185                 cy.get('label')
186                     .contains('Add groups')
187                     .parent()
188                     .within(() => {
189                         cy.get('input').type('docker{enter}');
190                     })
191             });
192
193         cy.get('[data-cy=form-dialog]').within(() => {
194             cy.get('[data-cy=form-submit-btn]').click();
195         });
196
197         // Verify new login permissions
198         // Check admin's vm page for login
199         cy.get('header button[title="Account Management"]').click();
200         cy.get('#account-menu').contains('Virtual Machines').click();
201
202         cy.get('[data-cy=vm-user-table]')
203             .contains(vmHost)
204             .parents('tr')
205             .within(() => {
206                 cy.get('td').contains('admin');
207                 cy.get('td').should('not.contain', 'docker');
208                 cy.get('td').should('not.contain', 'sudo');
209                 cy.get('td').contains('ssh admin@' + vmHost);
210         });
211
212         // Verify new login permissions
213         // Check activeUser's vm page for login
214         cy.loginAs(activeUser);
215         cy.get('header button[title="Account Management"]').click();
216         cy.get('#account-menu').contains('Virtual Machines').click();
217
218         cy.get('[data-cy=vm-user-table]')
219             .contains(vmHost)
220             .parents('tr')
221             .within(() => {
222                 cy.get('td').contains('user');
223                 cy.get('td').contains('docker');
224                 cy.get('td').should('not.contain', 'sudo');
225                 cy.get('td').contains('ssh user@' + vmHost);
226         });
227
228         // Remove login permissions
229         cy.loginAs(adminUser);
230         cy.get('header button[title="Admin Panel"]').click();
231         cy.get('#admin-menu').contains('Virtual Machines').click();
232
233         cy.get('[data-cy=vm-admin-table]')
234             .contains('user'); // Wait for page to finish
235
236         cy.get('[data-cy=vm-admin-table]')
237             .contains(vmHost)
238             .parents('tr')
239             .as('vmRow')
240             .contains('user')
241             .parents('[role=button]')
242             .find('svg')
243             .as('removeButton');
244         cy.get('@removeButton').click();
245         cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
246
247         cy.get('@vmRow')
248             .within(() => {
249                 cy.get('div[role=button]').should('not.contain', 'user');
250                 cy.get('div[role=button]').should('have.length', 1)
251             });
252
253         cy.get('@vmRow')
254             .find('div[role=button]')
255             .contains('admin')
256             .parents('[role=button]')
257             .find('svg')
258             .as('removeButton');
259         cy.get('@removeButton').click();
260         cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
261
262         cy.get('[data-cy=vm-admin-table]')
263             .contains(vmHost)
264             .parents('tr')
265             .within(() => {
266                 cy.get('div[role=button]').should('not.contain', 'admin');
267             });
268
269         // Check admin's vm page for login
270         cy.get('header button[title="Account Management"]').click();
271         cy.get('#account-menu').contains('Virtual Machines').click();
272
273         cy.get('[data-cy=vm-user-panel]')
274             .should('not.contain', vmHost);
275
276         // Check activeUser's vm page for login
277         cy.loginAs(activeUser);
278         cy.get('header button[title="Account Management"]').click();
279         cy.get('#account-menu').contains('Virtual Machines').click();
280
281         cy.get('[data-cy=vm-user-panel]')
282             .should('not.contain', vmHost);
283     });
284 });