From 572baaf73ede33de6d196aae8764835d06f06220 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/tests/integration/orcid/Orcid.cy.js | 189 ++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 cypress/tests/integration/orcid/Orcid.cy.js diff --git a/cypress/tests/integration/orcid/Orcid.cy.js b/cypress/tests/integration/orcid/Orcid.cy.js new file mode 100644 index 00000000000..ce86107cef2 --- /dev/null +++ b/cypress/tests/integration/orcid/Orcid.cy.js @@ -0,0 +1,189 @@ +/** + * @file cypress/tests/integration/Orcid.cy.js + * + * Copyright (c) 2014-2021 Simon Fraser University + * Copyright (c) 2000-2021 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.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'); + }); + + // This should be skipped for OPS & OMP since they are not using the new UI yet + it('Sends ORCID verification request to author', function () { + cy.login('dbarnes'); + cy.visit( + 'index.php/publicknowledge/en/dashboard/editorial?currentViewId=assigned-to-me', + ); + + // CLick on first submission in submission list + cy.get('button[aria-describedby^="submission-title-"]').first().click(); + + // TODO Check that the Publications sections is expanded before attempting to click on Contributors + cy.get('a').contains('Contributors').click(); + + cy.get('div.listPanel__itemActions') + .contains('Primary Contact') + .parents('div.listPanel__itemActions') + .within(() => { + cy.contains('button', 'Edit').click(); + }) + .then(() => { + // Ensure side modal is opened before continuing + cy.wait(10000); + + cy.get('[data-cy="sidemodal-header"]').should('be.visible'); + cy.contains('Request verification').click(); + cy.get('button').contains('Yes').click(); + cy.contains( + 'ORCID Verification has been requested! Resend Verification Email', + ).should('be.visible'); + }); + }); + + 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 return stubbed data + cy.stub(win, 'open').callsFake((url) => { + // Create an iframe and set its source to the URL + const iframe = win.document.createElement('iframe'); + iframe.src = url; + iframe.id = 'new-tab-iframe'; + iframe.style.display = 'none'; + win.document.body.appendChild(iframe); // Append the iframe to the body + + return iframe.contentWindow; + }); + }); + + // Intercept requests from the iframe (simulating new tab requests) + cy.intercept( + { + method: 'GET', + url: 'https://sandbox.orcid.org/oauth/authorize?client_id=TEST_CLIENT_ID&response_type=code&scope=%2Factivities%2Fupdate&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Findex.php%2Fpublicknowledge%2Forcid%2FauthorizeOrcid%3FtargetOp%3Dregister', + }, + (req) => { + req.reply({ + statusCode: 200, + headers: {'Content-Type': 'text/html'}, + body: ` + `, + }); + }, + ); + + // Trigger the action that would normally open a new tab + cy.get('#connect-orcid-button').should('be.visible').click(); + + cy.wait(5000); + + 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', '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('http://localhost:8000/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'); + } + }); + }); +});