1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 describe('User Details Card tests', function () {
10 // Only set up common users once. These aren't set up as aliases because
11 // aliases are cleaned up after every test. Also it doesn't make sense
12 // to set the same users on beforeEach() over and over again, so we
13 // separate a little from Cypress' 'Best Practices' here.
14 cy.getUser('admin', 'Admin', 'User', true, true)
17 adminUser = this.adminUser;
19 cy.getUser('activeUser1', 'Active', 'User', false, true)
22 activeUser = this.activeUser;
24 cy.on('uncaught:exception', (err, runnable) => {
29 beforeEach(function () {
31 cy.clearLocalStorage();
34 it('should display the user details card', () => {
35 cy.loginAs(adminUser);
37 cy.get('[data-cy=user-details-card]').should('be.visible');
38 cy.get('[data-cy=user-details-card]').contains(adminUser.user.full_name).should('be.visible');
41 it('shows the appropriate buttons in the multiselect toolbar', () => {
42 const msButtonTooltips = ['API Details', 'Attributes', 'User account'];
44 cy.loginAs(activeUser);
46 cy.get('[data-cy=multiselect-button]').should('have.length', msButtonTooltips.length);
48 for (let i = 0; i < msButtonTooltips.length; i++) {
49 cy.get('[data-cy=multiselect-button]').eq(i).trigger('mouseover');
50 cy.get('body').contains(msButtonTooltips[i]).should('exist');
51 cy.get('[data-cy=multiselect-button]').eq(i).trigger('mouseout');
56 describe('Project Details Card tests', function () {
61 // Only set up common users once. These aren't set up as aliases because
62 // aliases are cleaned up after every test. Also it doesn't make sense
63 // to set the same users on beforeEach() over and over again, so we
64 // separate a little from Cypress' 'Best Practices' here.
65 cy.getUser('admin', 'Admin', 'User', true, true)
68 adminUser = this.adminUser;
70 cy.getUser('activeUser1', 'Active', 'User', false, true)
73 activeUser = this.activeUser;
75 cy.on('uncaught:exception', (err, runnable) => {
80 beforeEach(function () {
82 cy.clearLocalStorage();
85 it('should display the project details card', () => {
86 const projName = `Test project (${Math.floor(999999 * Math.random())})`;
87 cy.loginAs(adminUser);
90 cy.get('[data-cy=side-panel-button]').click();
91 cy.get('[data-cy=side-panel-new-project]').click();
92 cy.get('[data-cy=form-dialog]')
93 .should('contain', 'New Project')
95 cy.get('[data-cy=name-field]').within(() => {
96 cy.get('input').type(projName);
99 cy.get('[data-cy=form-submit-btn]').click();
100 cy.get('[data-cy=form-dialog]').should('not.exist');
102 cy.get('[data-cy=project-details-card]').should('be.visible');
103 cy.get('[data-cy=project-details-card]').contains(projName).should('be.visible');
106 it('shows the appropriate buttons in the multiselect toolbar', () => {
107 const msButtonTooltips = ['View details', 'Open in new tab', 'Copy link to clipboard'];
109 const msOverflowMenuButtonTooltips = [
110 'Open with 3rd party client',
121 const projName = `Test project (${Math.floor(999999 * Math.random())})`;
122 cy.loginAs(activeUser);
125 cy.get('[data-cy=side-panel-button]').click();
126 cy.get('[data-cy=side-panel-new-project]').click();
127 cy.get('[data-cy=form-dialog]')
128 .should('contain', 'New Project')
130 cy.get('[data-cy=name-field]').within(() => {
131 cy.get('input').type(projName);
134 cy.get('[data-cy=form-submit-btn]').click();
135 cy.get('[data-cy=form-dialog]').should('not.exist');
137 for (let i = 0; i < msButtonTooltips.length; i++) {
138 cy.get('[data-cy=multiselect-button]').eq(i).should('exist');
139 cy.get('[data-cy=multiselect-button]').eq(i).trigger('mouseover');
141 cy.get('body').within(() => {
142 cy.contains(msButtonTooltips[i]).should('exist');
144 cy.get('[data-cy=multiselect-button]').eq(i).trigger('mouseout');
147 cy.get('[data-cy=overflow-menu-button]').click();
148 cy.get('[data-cy=overflow-menu]')
149 .should('be.visible')
151 cy.get('[data-cy=multiselect-button]').should('exist');
153 for (let i = 0; i < msOverflowMenuButtonTooltips.length; i++) {
157 cy.get(`span`).should('have.prop', 'title', msOverflowMenuButtonTooltips[i]);
163 it('should toggle description display', () => {
164 const projName = `Test project (${Math.floor(999999 * Math.random())})`;
165 //must be long enough to require a 2nd line
166 const projDescription =
167 'Science! true daughter of Old Time thou art! Who alterest all things with thy peering eyes. Why preyest thou thus upon the poet’s heart, Vulture, whose wings are dull realities? '
168 cy.loginAs(adminUser);
171 cy.get('[data-cy=side-panel-button]').click();
172 cy.get('[data-cy=side-panel-new-project]').click();
173 cy.get('[data-cy=form-dialog]')
174 .should('contain', 'New Project')
176 cy.get('[data-cy=name-field]').within(() => {
177 cy.get('input').type(projName);
180 cy.get('[data-cy=form-submit-btn]').click();
182 //check for no description
183 cy.get('[data-cy=no-description').should('be.visible');
186 cy.get('[data-cy=side-panel-tree]').contains('Home Projects').click();
187 cy.get('[data-cy=project-panel] tbody tr').contains(projName).rightclick({ force: true });
188 cy.get('[data-cy=context-menu]').contains('Edit').click();
189 cy.get('[data-cy=form-dialog]').within(() => {
190 cy.get('div[contenteditable=true]').click().type(projDescription);
191 cy.get('[data-cy=form-submit-btn]').click();
193 cy.get('[data-cy=project-panel] tbody tr').contains(projName).click({ force: true });
194 cy.get('[data-cy=project-details-card]').contains(projName).should('be.visible');
197 //description is always visible, even when collapsed
198 cy.get('[data-cy=project-details-card]').contains(projDescription).should('be.visible');
199 cy.get('[data-cy=project-details-card]').invoke('height').should('be.lt', 90);
200 cy.get('[data-cy=toggle-description]').click();
202 cy.get('[data-cy=project-details-card]').invoke('height').should('be.gt', 91);
203 cy.get('[data-cy=toggle-description]').click();
205 cy.get('[data-cy=project-details-card]').invoke('height').should('be.lt', 90);
208 it('should display key/value pairs', () => {
209 const projName = `Test project (${Math.floor(999999 * Math.random())})`;
210 cy.loginAs(adminUser);
212 // Create project wih key/value pairs
213 cy.get('[data-cy=side-panel-button]').click();
214 cy.get('[data-cy=side-panel-new-project]').click();
215 cy.get('[data-cy=form-dialog]')
216 .should('contain', 'New Project')
218 cy.get('[data-cy=name-field]').within(() => {
219 cy.get('input').type(projName);
223 cy.get('[data-cy=key-input]').should('be.visible').click().type('Animal');
224 cy.get('[data-cy=value-input]').should('be.visible').click().type('Dog');
225 cy.get('[data-cy=property-add-btn]').should('be.visible').click();
227 cy.get('[data-cy=key-input]').should('be.visible').click().type('Importance');
228 cy.get('[data-cy=value-input]').should('be.visible').click().type('Critical');
229 cy.get('[data-cy=property-add-btn]').should('be.visible').click();
231 cy.get('[data-cy=form-submit-btn]').click();
234 cy.get('[data-cy=project-details-card]').invoke('height').should('be.lt', 100);
235 cy.get('[data-cy=toggle-chips]').click();
237 cy.get('[data-cy=project-details-card]').invoke('height').should('be.gt', 101);
238 cy.get('[data-cy=toggle-chips').click();
240 cy.get('[data-cy=project-details-card]').invoke('height').should('be.lt', 100);
242 //check for key/value pairs in project details card
243 cy.get('[data-cy=project-details-card]').contains('Animal').should('be.visible');
244 cy.get('[data-cy=project-details-card]').contains('Importance').should('be.visible').click();
246 cy.window().then((win) => {
247 win.navigator.clipboard.readText().then((text) => {
248 //wait is necessary due to known issue with cypress@13.7.1
250 expect(text).to.match(new RegExp(`Importance: Critical`));