From 8d8ada97d5d180a03b635c16aabd7523689b8a32 Mon Sep 17 00:00:00 2001 From: Taslan Graham Date: Tue, 15 Oct 2024 18:54:46 -0500 Subject: [PATCH] pkp/pkp-lib#10127 Add e2e tests for ORCID --- cypress/support/commands_orcid.js | 43 ++++++++ cypress/tests/integration/orcid/Orcid.cy.js | 111 ++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 cypress/support/commands_orcid.js create mode 100644 cypress/tests/integration/orcid/Orcid.cy.js diff --git a/cypress/support/commands_orcid.js b/cypress/support/commands_orcid.js new file mode 100644 index 00000000000..f4227fcb69e --- /dev/null +++ b/cypress/support/commands_orcid.js @@ -0,0 +1,43 @@ +/** + * @file cypress/support/commands_orcid.js + * + * Copyright (c) 2014-2024 Simon Fraser University + * Copyright (c) 2000-2024 John Willinsky + * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING. + * + */ + +Cypress.Commands.add('enableOrcid', (language, contextPath) => { + cy.login('admin', 'admin'); + + cy.visit('index.php/publicknowledge/management/settings/access'); + cy.get('#orcidSettings-button').should('exist').click(); + + // Check that the checkbox to enable ORCID is visible, and select it + cy.get('input[name^="orcidEnabled"]').should('be.visible').check(); + + // Check that the form fields are visible + cy.get('select[name="orcidApiType"]') + .should('be.visible') + .select('memberSandbox'); + cy.get('input[name="orcidClientId"]') + .should('be.visible') + .clear() + .type('TEST_CLIENT_ID', {delay: 0}); + cy.get('input[name="orcidClientSecret"]') + .should('be.visible') + .clear() + .type('TEST_SECRET', {delay: 0}); + cy.get('input[name="orcidCity"]').should('be.visible'); + cy.get('input[name="orcidSendMailToAuthorsOnPublication"]') + .should('be.visible') + .check(); + cy.get('select[name="orcidLogLevel"]').should('be.visible').select('INFO'); + cy.get('button:contains("Save")').eq(1).should('be.visible').click(); + + cy.reload(); + + cy.get('input[name="orcidClientId"]') + .should('be.visible') + .should('have.value', 'TEST_CLIENT_ID'); +}); diff --git a/cypress/tests/integration/orcid/Orcid.cy.js b/cypress/tests/integration/orcid/Orcid.cy.js new file mode 100644 index 00000000000..227a9a69509 --- /dev/null +++ b/cypress/tests/integration/orcid/Orcid.cy.js @@ -0,0 +1,111 @@ +/** + * @file cypress/tests/integration/Orcid.cy.js + * + * Copyright (c) 2014-2024 Simon Fraser University + * Copyright (c) 2000-2024 John Willinsky + * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING. + * + */ + +describe('ORCID tests', function() { + + it('Enables ORCID', function() { + cy.enableOrcid(); + + }); + it('Adds ORCID to user profile', function() { + cy.login('dbarnes'); + cy.visit('index.php/publicknowledge/en/user/profile'); + cy.window().then((win) => cy.stub(win, 'open').returns({})); + + cy.get('#connect-orcid-button').should('be.visible').click(); + }); + + it('Uses ORCID in user registration', function() { + cy.visit('index.php/publicknowledge/user/register'); + + cy.window().then((win) => { + // Cypress does not work well with multiple tabs or windows + // instead of displaying the ORCID oauth interface in a new tab, have it load in a hidden iFrame + // then intercept the call to ORCID and populate form fields similar to the actual implementation. + cy.stub(win, 'open').callsFake((url) => { + const iframe = win.document.createElement('iframe'); + iframe.src = url; + iframe.id = 'iframe'; + iframe.style.display = 'none'; + win.document.body.appendChild(iframe); // Append the iframe to the body + + // The ORCID window would eventually call the app's backend, which responds with html containing a script to update form fields in the parent(opener) window. + // In this case, we bypass the backend and set the iFrame to have a similar html(with script) content as the app's implementation. This then executes, + // simulating how the ORCID tab would modify the parent (opener) tab's form fields. + iframe.srcdoc = ``; + return iframe.contentWindow; + }); + }); + + // Intercept requests from the iframe (simulating new tab requests) + cy.intercept('GET', 'https://sandbox.orcid.org/**', {}); + + cy.get('#connect-orcid-button').should('be.visible').click(); + // Remove iFrame from DOM + cy.get('iframe').should('exist').and('not.be.visible'); + + // Fields should be populated with ORCID data + cy.get('#givenName').should('have.value', 'John'); + cy.get('#familyName').should('have.value', 'Doe'); + cy.get('#email').should('have.value', 'john.doe@example.com'); + cy.get('select#country').should('have.value', 'JM'); + cy.get('#affiliation').should('have.value', 'PKP'); + cy.get('#orcid').should('have.value', 'https://orcid.org/1000-2000-3000-4000'); + + // Populate remaining fields and submit registration form + cy.get('#username').type('johndoe'); + cy.get('#password').type('superSecretPassword'); + cy.get('#password2').type('superSecretPassword'); + cy.get('input[name="privacyConsent"]').check(); + + cy.get('button[type="submit"]').click(); + + // Navigate to profile and check user data + cy.visit('/index.php/publicknowledge/en/user/profile'); + cy.get('input[name="givenName[en]"]').should('have.value', 'John'); + cy.get('input[name="familyName[en]"]').should('have.value', 'Doe'); + }); + + it('Disables ORCID', function() { + cy.login('admin', 'admin'); + + cy.visit('index.php/publicknowledge/management/settings/access'); + cy.get('#orcidSettings-button').should('exist').click(); + + // Check that the checkbox to disbaled ORCID is visible + cy.get('input[name^="orcidEnabled"]').should('be.visible'); + + cy.get('input[name^="orcidEnabled"]').then((checkbox) => { + if (checkbox.prop('checked')) { + cy.get('input[name^="orcidEnabled"]').click(); + + // Check that the form fields are visible + cy.get('select[name="orcidApiType"]').should('not.exist'); + cy.get('input[name="orcidClientId"]').should('not.exist'); + cy.get('input[name="orcidClientSecret"]').should('not.exist'); + cy.get('input[name="orcidCity"]').should('not.exist'); + cy.get('input[name="orcidSendMailToAuthorsOnPublication"]').should('not.exist'); + cy.get('select[name="orcidLogLevel"]').should('not.exist'); + cy.get('button:contains("Save")').eq(1).should('be.visible').click(); + + // reload to check that data was saved + cy.reload(); + cy.get('input[name^="orcidEnabled"]').should('not.be.checked'); + } + }); + }); +});