From 63ee9df0903ee7378be295d9b0656f7ae0aa3ddc Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Tue, 28 Apr 2020 19:06:02 -0300 Subject: [PATCH] 16212: Adds tests for login via user/password form. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- cypress/integration/login.spec.js | 34 ++++++++++++++++ cypress/support/commands.js | 66 ++++++++++++++++--------------- 2 files changed, 68 insertions(+), 32 deletions(-) diff --git a/cypress/integration/login.spec.js b/cypress/integration/login.spec.js index 30fce0a6..c30124d8 100644 --- a/cypress/integration/login.spec.js +++ b/cypress/integration/login.spec.js @@ -6,6 +6,7 @@ describe('Login tests', function() { let activeUser; let inactiveUser; let adminUser; + let randomUser = {}; before(function() { // Only set up common users once. These aren't set up as aliases because @@ -27,6 +28,16 @@ describe('Login tests', function() { inactiveUser = this.inactiveUser; } ); + randomUser.username = `randomuser${Math.floor(Math.random() * Math.floor(999999))}`; + randomUser.password = { + crypt: 'zpAReoZzPnwmQ', + clear: 'topsecret', + }; + cy.exec(`useradd ${randomUser.username} -p ${randomUser.password.crypt}`); + }) + + after(function() { + cy.exec(`userdel ${randomUser.username}`); }) beforeEach(function() { @@ -60,6 +71,7 @@ describe('Login tests', function() { it('logs in successfully with valid user token', function() { cy.visit(`/token/?api_token=${activeUser.token}`); cy.url().should('contain', '/projects/'); + cy.get('div#root').should('contain', 'Arvados Workbench (zzzzz)'); cy.get('div#root').should('not.contain', 'Your account is inactive'); cy.get('button[title="Account Management"]').click(); cy.get('ul[role=menu] > li[role=menuitem]').contains( @@ -69,6 +81,7 @@ describe('Login tests', function() { it('logs in successfully with valid admin token', function() { cy.visit(`/token/?api_token=${adminUser.token}`); cy.url().should('contain', '/projects/'); + cy.get('div#root').should('contain', 'Arvados Workbench (zzzzz)'); cy.get('div#root').should('not.contain', 'Your account is inactive'); cy.get('button[title="Admin Panel"]').click(); cy.get('ul[role=menu] > li[role=menuitem]') @@ -78,4 +91,25 @@ describe('Login tests', function() { cy.get('ul[role=menu] > li[role=menuitem]').contains( `${adminUser.user.first_name} ${adminUser.user.last_name}`); }) + + it('fails to authenticate using the login form with wrong password', function() { + cy.visit('/'); + cy.get('#username').type(randomUser.username); + cy.get('#password').type('wrong password'); + cy.get("button span:contains('Log in')").click(); + cy.get('p#password-helper-text').should('contain', 'PAM: Authentication failure'); + cy.url().should('not.contain', '/projects/'); + }) + + it('successfully authenticates using the login form', function() { + cy.visit('/'); + cy.get('#username').type(randomUser.username); + cy.get('#password').type(randomUser.password.clear); + cy.get("button span:contains('Log in')").click(); + cy.url().should('contain', '/projects/'); + cy.get('div#root').should('contain', 'Arvados Workbench (zzzzz)'); + cy.get('div#root').should('contain', 'Your account is inactive'); + cy.get('button[title="Account Management"]').click(); + cy.get('ul[role=menu] > li[role=menuitem]').contains(randomUser.username); + }) }) \ No newline at end of file diff --git a/cypress/support/commands.js b/cypress/support/commands.js index ac4a5e0e..68ce6870 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -53,40 +53,42 @@ Cypress.Commands.add( } ) -Cypress.Commands.add("getUser", (username, first_name='', last_name='', is_admin=false, is_active=true) => { - // Create user if not already created - return cy.do_request('POST', '/auth/controller/callback', { - auth_info: JSON.stringify({ - email: `${username}@example.local`, - username: username, - first_name: first_name, - last_name: last_name, - alternate_emails: [] - }), - return_to: ',https://example.local' - }, null, systemToken, true, false) // Don't follow redirects so we can catch the token - .its('headers.location').as('location') - // Get its token and set the account up as admin and/or active - .then(function() { - this.userToken = this.location.split("=")[1] - assert.isString(this.userToken) - return cy.do_request('GET', '/arvados/v1/users', null, { - filters: `[["username", "=", "${username}"]]` - }) - .its('body.items.0') - .as('aUser') +Cypress.Commands.add( + "getUser", (username, first_name='', last_name='', is_admin=false, is_active=true) => { + // Create user if not already created + return cy.do_request('POST', '/auth/controller/callback', { + auth_info: JSON.stringify({ + email: `${username}@example.local`, + username: username, + first_name: first_name, + last_name: last_name, + alternate_emails: [] + }), + return_to: ',https://example.local' + }, null, systemToken, true, false) // Don't follow redirects so we can catch the token + .its('headers.location').as('location') + // Get its token and set the account up as admin and/or active .then(function() { - cy.do_request('PUT', `/arvados/v1/users/${this.aUser.uuid}`, { - user: { - is_admin: is_admin, - is_active: is_active - } + this.userToken = this.location.split("=")[1] + assert.isString(this.userToken) + return cy.do_request('GET', '/arvados/v1/users', null, { + filters: `[["username", "=", "${username}"]]` }) - .its('body') - .as('theUser') + .its('body.items.0') + .as('aUser') .then(function() { - return {user: this.theUser, token: this.userToken}; + cy.do_request('PUT', `/arvados/v1/users/${this.aUser.uuid}`, { + user: { + is_admin: is_admin, + is_active: is_active + } + }) + .its('body') + .as('theUser') + .then(function() { + return {user: this.theUser, token: this.userToken}; + }) }) }) - }) -}) + } +) -- 2.30.2