18549: Layout fixed, tests updated
[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         cy.get('[data-cy=vm-admin-table]')
68             .contains(vmHost)
69             .parents('tr')
70             .within(() => {
71                 cy.get('td').contains('admin');
72         });
73
74         // Add login permission to activeUser
75         cy.get('[data-cy=vm-admin-table]')
76             .contains(vmHost)
77             .parents('tr')
78             .within(() => {
79                 cy.get('button[title="Add Login Permission"]').click();
80             });
81         cy.get('[data-cy=form-dialog]')
82             .should('contain', 'Add login permission')
83             .within(() => {
84                 cy.get('label')
85                   .contains('Search for user')
86                   .parent()
87                   .within(() => {
88                     cy.get('input').type('VMActive user');
89                   })
90             });
91         cy.get('[role=tooltip]').click();
92         cy.get('[data-cy=form-dialog]').within(() => {
93             cy.get('[data-cy=form-submit-btn]').click();
94         });
95         cy.get('[data-cy=vm-admin-table]')
96             .contains(vmHost)
97             .parents('tr')
98             .within(() => {
99                 cy.get('td').contains('user');
100         });
101
102         // Check admin's vm page for login
103         cy.get('header button[title="Account Management"]').click();
104         cy.get('#account-menu').contains('Virtual Machines').click();
105
106         cy.get('[data-cy=vm-user-table]')
107             .contains(vmHost)
108             .parents('tr')
109             .within(() => {
110                 cy.get('td').contains('admin');
111                 cy.get('td').contains('docker');
112                 cy.get('td').contains('sudo');
113                 cy.get('td').contains('ssh admin@' + vmHost);
114         });
115
116         // Check activeUser's vm page for login
117         cy.loginAs(activeUser);
118         cy.get('header button[title="Account Management"]').click();
119         cy.get('#account-menu').contains('Virtual Machines').click();
120
121         cy.get('[data-cy=vm-user-table]')
122             .contains(vmHost)
123             .parents('tr')
124             .within(() => {
125                 cy.get('td').contains('user');
126                 cy.get('td').should('not.contain', 'docker');
127                 cy.get('td').should('not.contain', 'sudo');
128                 cy.get('td').contains('ssh user@' + vmHost);
129         });
130
131         // Edit login permissions
132         cy.loginAs(adminUser);
133         cy.get('header button[title="Admin Panel"]').click();
134         cy.get('#admin-menu').contains('Virtual Machines').click();
135
136         cy.get('[data-cy=vm-admin-table]')
137             .contains('admin'); // Wait for page to finish
138
139         cy.get('[data-cy=vm-admin-table]')
140             .contains(vmHost)
141             .parents('tr')
142             .contains('admin')
143             .click();
144
145         cy.get('[data-cy=form-dialog]')
146             .should('contain', 'Update login permission')
147             .within(() => {
148                 cy.get('label')
149                     .contains('Add groups')
150                     .parent()
151                     .as('groupInput');
152             });
153
154         cy.get('@groupInput').within(() => {
155             cy.get('div[role=button]').contains('sudo').parent().find('svg').click();
156             cy.get('div[role=button]').contains('docker').parent().find('svg').click();
157         });
158
159         cy.get('[data-cy=form-dialog]').within(() => {
160             cy.get('[data-cy=form-submit-btn]').click();
161         });
162
163         cy.get('[data-cy=vm-admin-table]')
164             .contains('user'); // Wait for page to finish
165
166         cy.get('[data-cy=vm-admin-table]')
167             .contains(vmHost)
168             .parents('tr')
169             .contains('user')
170             .click();
171
172         cy.get('[data-cy=form-dialog]')
173             .should('contain', 'Update login permission')
174             .within(() => {
175                 cy.get('label')
176                     .contains('Add groups')
177                     .parent()
178                     .within(() => {
179                         cy.get('input').type('docker{enter}');
180                     })
181             });
182
183         cy.get('[data-cy=form-dialog]').within(() => {
184             cy.get('[data-cy=form-submit-btn]').click();
185         });
186
187         // Verify new login permissions
188         // Check admin's vm page for login
189         cy.get('header button[title="Account Management"]').click();
190         cy.get('#account-menu').contains('Virtual Machines').click();
191
192         cy.get('[data-cy=vm-user-table]')
193             .contains(vmHost)
194             .parents('tr')
195             .within(() => {
196                 cy.get('td').contains('admin');
197                 cy.get('td').should('not.contain', 'docker');
198                 cy.get('td').should('not.contain', 'sudo');
199                 cy.get('td').contains('ssh admin@' + vmHost);
200         });
201
202         // Verify new login permissions
203         // Check activeUser's vm page for login
204         cy.loginAs(activeUser);
205         cy.get('header button[title="Account Management"]').click();
206         cy.get('#account-menu').contains('Virtual Machines').click();
207
208         cy.get('[data-cy=vm-user-table]')
209             .contains(vmHost)
210             .parents('tr')
211             .within(() => {
212                 cy.get('td').contains('user');
213                 cy.get('td').contains('docker');
214                 cy.get('td').should('not.contain', 'sudo');
215                 cy.get('td').contains('ssh user@' + vmHost);
216         });
217
218         // Remove login permissions
219         cy.loginAs(adminUser);
220         cy.get('header button[title="Admin Panel"]').click();
221         cy.get('#admin-menu').contains('Virtual Machines').click();
222
223         cy.get('[data-cy=vm-admin-table]')
224             .contains('user'); // Wait for page to finish
225
226         cy.get('[data-cy=vm-admin-table]')
227             .contains(vmHost)
228             .parents('tr')
229             .as('vmRow')
230             .contains('user')
231             .parents('[role=button]')
232             .find('svg')
233             .as('removeButton');
234         cy.get('@removeButton').click();
235         cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
236
237         cy.get('@vmRow')
238             .within(() => {
239                 cy.get('div[role=button]').should('not.contain', 'user');
240                 cy.get('div[role=button]').should('have.length', 1)
241             });
242
243         cy.get('@vmRow')
244             .find('div[role=button]')
245             .contains('admin')
246             .parents('[role=button]')
247             .find('svg')
248             .as('removeButton');
249         cy.get('@removeButton').click();
250         cy.get('[data-cy=confirmation-dialog-ok-btn]').click();
251
252         cy.get('[data-cy=vm-admin-table]')
253             .contains(vmHost)
254             .parents('tr')
255             .within(() => {
256                 cy.get('div[role=button]').should('not.contain', 'admin');
257             });
258
259         // Check admin's vm page for login
260         cy.get('header button[title="Account Management"]').click();
261         cy.get('#account-menu').contains('Virtual Machines').click();
262
263         cy.get('[data-cy=vm-user-panel]')
264             .should('not.contain', vmHost);
265
266         // Check activeUser's vm page for login
267         cy.loginAs(activeUser);
268         cy.get('header button[title="Account Management"]').click();
269         cy.get('#account-menu').contains('Virtual Machines').click();
270
271         cy.get('[data-cy=vm-user-panel]')
272             .should('not.contain', vmHost);
273     });
274 });