diff --git a/.github/workflows/dataverse_jsf_tests.yml b/.github/workflows/dataverse_jsf_tests.yml new file mode 100644 index 00000000000..77f41093fc5 --- /dev/null +++ b/.github/workflows/dataverse_jsf_tests.yml @@ -0,0 +1,264 @@ +name: Dataverse JSF Frontend Tests Workflow + +on: + workflow_dispatch: + push: + branches: + - develop + - master + paths-ignore: + - "doc/**" + - "**/*.md" + - ".github/ISSUE_TEMPLATE/**" + - ".github/*.md" + pull_request: + branches: + - develop + - master + paths-ignore: + - "doc/**" + - "**/*.md" + - ".github/ISSUE_TEMPLATE/**" + - ".github/*.md" + +concurrency: + group: "dataverse-jsf-frontend-tests-${{ github.ref }}" + cancel-in-progress: true + +jobs: + main-jsf-tests-workflow: + runs-on: ubuntu-latest + timeout-minutes: 90 + + defaults: + run: + shell: bash + + permissions: + contents: read + + steps: + + # --------------------------- + # CHECKOUT + # --------------------------- + - name: Checkout repository + uses: actions/checkout@v7 + # --------------------------- + # VERIFY DOCKER + # --------------------------- + - name: Verify Docker + run: | + set -euo pipefail + docker version + + # --------------------------- + # SETUP JAVA + MAVEN + # --------------------------- + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: "temurin" + java-version: "21" + cache: "maven" + + - name: Verify Maven + run: | + set -euo pipefail + mvn -version + + # --------------------------- + # BUILD IMAGES (Dataverse-native) + # --------------------------- + - name: Build Dataverse containers via Maven + run: | + set -euo pipefail + mvn -Pct -T 1C package + + # --------------------------- + # START CONTAINERS (BACKGROUND) + # --------------------------- + - name: Start Dataverse stack + run: | + set -euo pipefail + mvn -Pct docker:start \ + -Ddataverse.feature.index-harvested-metadata-source=true \ + -Ddataverse.oai.server.maxidentifiers=2 \ + -Ddataverse.oai.server.maxrecords=2 + + # --------------------------- + # WAIT FOR API READINESS + # --------------------------- + - name: Wait for Dataverse API readiness + run: | + set -euo pipefail + URL="http://localhost:8080/api/info/version" + MAX_ATTEMPTS=10 + SLEEP_TIME=15 + echo "Waiting for Dataverse readiness..." + for attempt in $(seq 1 $MAX_ATTEMPTS); do + echo "Attempt $attempt..." + RESPONSE=$(curl -s --max-time 15 "$URL" || true) + STATUS=$(echo "$RESPONSE" | jq -r '.status' 2>/dev/null || echo "NOT_READY") + if [ "$STATUS" = "OK" ]; then + echo "Dataverse endpoint is READY." + echo "Waiting 30 more seconds for full readiness..." + sleep 30 + echo "Response: $RESPONSE" + exit 0 + fi + echo "Not ready. Sleeping ${SLEEP_TIME}s..." + sleep $SLEEP_TIME + if [ $SLEEP_TIME -lt 60 ]; then + SLEEP_TIME=$((SLEEP_TIME * 2)) + if [ $SLEEP_TIME -gt 60 ]; then + SLEEP_TIME=60 + fi + fi + done + echo "Dataverse failed to become ready." + docker ps + CONTAINERS="$(docker ps -aq)" + if [ -n "$CONTAINERS" ]; then + for cid in $CONTAINERS; do + echo "===== Logs for container $cid =====" + docker logs "$cid" || true + done + else + echo "No running containers to show logs for." + fi + exit 1 + + # --------------------------- + # MAP LOCALSTACK TO LOCALHOST + # --------------------------- + - name: Map localstack to localhost for Maven tests + run: echo "127.0.0.1 localstack" | sudo tee -a /etc/hosts + + # --------------------------- + # CONFIGURE DATAVERSE FOR TESTS + # --------------------------- + - name: Configure Dataverse API Settings + run: | + set -euo pipefail + + echo "Setting API Database Settings via internal container curl..." + + declare -A settings=( + [":BuiltinUsersKey"]="burrito" + [":ProvCollectionEnabled"]="true" + [":AllowApiTokenLookupViaApi"]="true" + [":AllowSignUp"]="true" + ) + for key in "${!settings[@]}"; do + echo "Setting $key..." + docker exec dev_dataverse curl --fail-with-body -sS -X PUT -d "${settings[$key]}" "http://localhost:8080/api/admin/settings/$key" + echo "" + done + + # --------------------------- + # PRE-TEST INJECTIONS + # --------------------------- + - name: Put SUSHI config file in place + run: | + set -euo pipefail + + SOURCE_FILE="${{ github.workspace }}/src/test/java/edu/harvard/iq/dataverse/makedatacount/sushi_sample_logs.json" + + echo "Injecting local file into container..." + docker exec -i dev_dataverse sh -c "cat > /tmp/sushi_sample_logs.json" < "$SOURCE_FILE" + + docker exec dev_dataverse ls -l /tmp/sushi_sample_logs.json + docker exec dev_dataverse head -n 5 /tmp/sushi_sample_logs.json + + # --------------------------- + # SETUP NODE.JS + # --------------------------- + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: "24" + + # --------------------------- + # CHECKOUT dataverse-jsf-tests + # --------------------------- + - name: Checkout dataverse-jsf-tests + uses: actions/checkout@v7 + with: + repository: gdcc/dataverse-jsf-tests + path: dataverse-jsf-tests + + - name: Install dataverse-jsf-tests dependencies + run: npm ci + working-directory: dataverse-jsf-tests + + - name: Install Playwright browsers + run: npx playwright install --with-deps + working-directory: dataverse-jsf-tests + + # --------------------------- + # RUN PLAYWRIGHT FRONTEND TESTS + # --------------------------- + - name: Run Playwright frontend tests + run: npx playwright test + working-directory: dataverse-jsf-tests + env: + BASE_URL: "http://localhost:8080" + LOGIN_ADAPTER: "builtin" + DV_USERNAME: "dataverseAdmin" + DV_PASSWORD: "admin1" + DV_FULL_NAME: "Dataverse Admin" + ROOT_DATAVERSE: "/dataverse/root" + SKIP_PREFLIGHT: "true" + DOTENV_CONFIG_QUIET: "true" + + # --------------------------- + # UPLOAD PLAYWRIGHT REPORT + # --------------------------- + - name: Upload Playwright report + if: always() + uses: actions/upload-artifact@v7 + with: + name: playwright-report + path: dataverse-jsf-tests/playwright-report/ + retention-days: 14 + + # --------------------------- + # COLLECT DOCKER LOGS (ALWAYS) + # --------------------------- + - name: Collect Docker logs (mapped) + if: always() + run: | + mkdir -p docker-logs + echo "Gathering container metadata..." + docker ps -a --format '{{.Names}}|{{.Image}}|{{.Status}}' > docker-logs/container-summary.txt + while IFS='|' read -r name image status; do + label="$name" + case "$name" in + *dataverse*) label="dataverse-app" ;; + *postgres*) label="postgres-db" ;; + *solr*) label="solr-index" ;; + *localstack*)label="localstack-s3" ;; + esac + echo "Collecting logs for $name ($label)" + { + echo "===== CONTAINER: $name =====" + echo "Label: $label" + echo "Image: $image" + echo "Status: $status" + echo "" + echo "===== LOGS =====" + docker logs --timestamps "$name" 2>&1 || true + } > "docker-logs/${label}__${name}.log" + done < docker-logs/container-summary.txt + + # --------------------------- + # UPLOAD DOCKER LOGS (ALWAYS) + # --------------------------- + - name: Upload Docker logs + if: always() + uses: actions/upload-artifact@v7 + with: + name: docker-logs + path: docker-logs/ + retention-days: 14 diff --git a/doc/sphinx-guides/source/developers/testing.rst b/doc/sphinx-guides/source/developers/testing.rst index b85a83a0f92..4fc67583723 100755 --- a/doc/sphinx-guides/source/developers/testing.rst +++ b/doc/sphinx-guides/source/developers/testing.rst @@ -496,6 +496,19 @@ Developers who contribute front-end UI code are responsible for understanding th There are browser developer tools such as the `Wave toolbar `__ by WebAIM (available for Chrome, Firefox) and the `Siteimprove Accessibility Checker `__ (available for Chrome, Firefox) that will generate reports for a single page. It is required that developers utilize these tools to catch any accessibility issues with pages or features that are being added to the application UI. +Browser-Based Testing +--------------------- + +Browser-Based Testing of JSF +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The JSF frontend is being tested with Playwright via a GitHub Action that runs a test suite from https://github.com/gdcc/dataverse-jsf-tests (see https://github.com/IQSS/dataverse/pull/12526). + +Browser-Based Testing of the SPA +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +https://github.com/IQSS/dataverse-frontend uses Cypress. + Future Work ----------- @@ -518,11 +531,6 @@ Future Work on Integration Tests - Consistent logging of API Tests. Show test name at the beginning and end and status codes returned. - expected passing and known/expected failing integration tests: https://github.com/IQSS/dataverse/issues/4438 -Browser-Based Testing -~~~~~~~~~~~~~~~~~~~~~ - -- Revisit Selenium/Open Sauce: https://github.com/IQSS/dataverse/commit/8a26404 and https://saucelabs.com/u/esodvn and https://saucelabs.com/u/wdjs and http://sauceio.com/index.php/2013/05/a-browser-matrix-widget-for-the-open-source-community/ - Installation Testing ~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/access_dvn.py b/tests/access_dvn.py deleted file mode 100755 index 99e475bea58..00000000000 --- a/tests/access_dvn.py +++ /dev/null @@ -1,29 +0,0 @@ -# This is a test to access Dataverse homepage. -import unittest -from selenium import webdriver - - -class AccessDVN(unittest.TestCase): - - def setUp(self): - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'Testing Selenium 2 in Python at Sauce' - - self.driver = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - self.driver.implicitly_wait(30) - - def test_sauce(self): - self.driver.get('http://dvn-build.hmdc.harvard.edu') - - - def tearDown(self): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.driver.session_id) - self.driver.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/config.py b/tests/config.py deleted file mode 100644 index f77499163d8..00000000000 --- a/tests/config.py +++ /dev/null @@ -1,8 +0,0 @@ -#local = False -local = True -testUser = "tester" -rootDv = "root" -#accessURL = "http://140.247.116.223:8080/" -accessURL = "http://localhost:8080/" -#accessURL = "http://dvn-build.hmdc.harvard.edu" - diff --git a/tests/create_account.py b/tests/create_account.py deleted file mode 100644 index e7eeb219432..00000000000 --- a/tests/create_account.py +++ /dev/null @@ -1,62 +0,0 @@ -# This is a test to create an account. -import unittest, time -from selenium import webdriver - - -class CreateAccountSuite(unittest.TestCase): - - def setUp(self): - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'Create Account' - - self.driver = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - self.driver.implicitly_wait(30) - - def test_sauce(self): - driver=self.driver - driver.get('http://dvn-build.hmdc.harvard.edu/dataverseuser.xhtml') - driver.find_element_by_id("dataverseUserForm:editAccountButton_button").click() - driver.find_element_by_link_text("Create Account").click() - driver.find_element_by_id("dataverseUserForm:userName").click() - driver.find_element_by_id("dataverseUserForm:userName").clear() - driver.find_element_by_id("dataverseUserForm:userName").send_keys("user1") - driver.find_element_by_id("dataverseUserForm:inputPassword").click() - driver.find_element_by_id("dataverseUserForm:inputPassword").clear() - driver.find_element_by_id("dataverseUserForm:inputPassword").send_keys("u") - driver.find_element_by_id("dataverseUserForm:retypePassword").click() - driver.find_element_by_id("dataverseUserForm:retypePassword").clear() - driver.find_element_by_id("dataverseUserForm:retypePassword").send_keys("u") - driver.find_element_by_id("dataverseUserForm:firstName").click() - driver.find_element_by_id("dataverseUserForm:firstName").clear() - driver.find_element_by_id("dataverseUserForm:firstName").send_keys("user") - driver.find_element_by_id("dataverseUserForm:lastName").click() - driver.find_element_by_id("dataverseUserForm:lastName").clear() - driver.find_element_by_id("dataverseUserForm:lastName").send_keys("zero") - driver.find_element_by_id("dataverseUserForm:email").click() - driver.find_element_by_id("dataverseUserForm:email").clear() - driver.find_element_by_id("dataverseUserForm:email").send_keys("u@u.edu") - driver.find_element_by_id("dataverseUserForm:institution").click() - driver.find_element_by_id("dataverseUserForm:institution").clear() - driver.find_element_by_id("dataverseUserForm:institution").send_keys("IQSS") - driver.find_element_by_id("dataverseUserForm:j_idt45_focus").click() - driver.find_element_by_id("dataverseUserForm:j_idt45_focus").send_keys("\\9") - driver.find_element_by_css_selector("span.ui-icon.ui-icon-triangle-1-s").click() - driver.find_element_by_xpath("//div[@class='ui-selectonemenu-items-wrapper']//li[.='Student']").click() - driver.find_element_by_id("dataverseUserForm:phone").click() - driver.find_element_by_id("dataverseUserForm:phone").click() - driver.find_element_by_id("dataverseUserForm:phone").clear() - driver.find_element_by_id("dataverseUserForm:phone").send_keys("888-888-8888") - driver.find_element_by_id("dataverseUserForm:save").click() - - - def tearDown(self): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.driver.session_id) - self.driver.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/cypress.json b/tests/cypress.json deleted file mode 100644 index d7b657c4c26..00000000000 --- a/tests/cypress.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "baseUrl": "http://localhost:8084", - "projectId": "ufkudc" -} diff --git a/tests/cypress/fixtures/example.json b/tests/cypress/fixtures/example.json deleted file mode 100644 index 02e4254378e..00000000000 --- a/tests/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/tests/cypress/integration/test_dv.spec.js b/tests/cypress/integration/test_dv.spec.js deleted file mode 100644 index dba70db096f..00000000000 --- a/tests/cypress/integration/test_dv.spec.js +++ /dev/null @@ -1,75 +0,0 @@ -import { login } from '../util' - -describe('Dataverse', function() { - beforeEach(function() { - login(cy) - }) - - it('can be created with minimal customization', function() { - cy.visit('/dataverse.xhtml?ownerId=1') - - // setup aliases for used fields - cy.get('input[id="dataverseForm:name"]').as('name') - cy.get('input[id="dataverseForm:identifier"]').as('identifier') - cy.get('select[id="dataverseForm:dataverseCategory"]').as( - 'categorySelection' - ) - cy.get('input[id="dataverseForm:affiliation"]').as('affiliation') - cy.get('textarea[id="dataverseForm:description"]').as('description') - cy.get('input[id="dataverseForm:metadataRoot"]').as('metadataRoot') - cy.get('input[id="dataverseForm:facetsRoot"]').as('facetsRoot') - - // assert that there are no alerts in the initial state - cy.get('.alert:not(.alert-success)').should('not.exist') - cy.get('.ui-message-error-detail').should('not.exist') - - // assert that the initial values have been set correctly - cy.get('@name').should('have.value', 'Dataverse Admin Dataverse') - cy.get('@identifier').should('be.empty') - cy.get('@categorySelection').should('have.value', '') - cy.get('@affiliation').should('have.value', 'Dataverse.org') - cy.get('@description').should('be.empty') - cy.get('@metadataRoot').should('be.checked') - cy.get('@facetsRoot').should('be.checked') - - // try to create a dataverse - cy.contains('Create Dataverse').click() - - // expect validation to fail for some key fields - cy.get('.alert').should('exist') - cy.get('.ui-message-error-detail').should('have.length', 2) - - // fill in the remaining forms - cy.get('@identifier').type('testDv') - cy.get('@categorySelection').select('DEPARTMENT') - - // create a dataverse - cy.contains('Create Dataverse').click() - - // ensure that we have been redirected to the correct dataverse page - cy.url().should('contain', '/dataverse/testDv') - cy.get('.dataverseHeaderCell').should('contain', 'Unpublished') - }) - - it('allows datasets to be created', function() { - cy.visit('/dataverse/testDv') - - // click through to the new dataset page - // TODO: this should all be tested in a different spec - cy.contains('Add Data').click() - cy.contains('New Dataset').click() - - // fill in the necessary fields for the simplest new dataset - cy.get('.panel-body').within(() => { - cy.get('> :nth-child(1) input[type="text"]').type('Some dataset') - cy.get('> :nth-child(4) textarea').type('It is about some data') - cy.get('> :nth-child(5) tr:nth-child(5) div.ui-chkbox-box').click() - }) - - // save the new dataset - cy.contains('Save Dataset').click() - - // ensure that we have been redirected to the correct dataverse page - cy.url().should('contain', '/dataset.xhtml') - }) -}) diff --git a/tests/cypress/integration/test_dv_user.spec.js b/tests/cypress/integration/test_dv_user.spec.js deleted file mode 100644 index c552710bbe4..00000000000 --- a/tests/cypress/integration/test_dv_user.spec.js +++ /dev/null @@ -1,76 +0,0 @@ -import { login } from '../util' - -describe('Dataverse User', function() { - beforeEach(function() { - login(cy) - }) - - it('allows the user to read and remove notifications', function() { - cy.visit('/dataverseuser.xhtml?selectTab=notifications') - - // expect there to be one notification - cy.get('.notification-item').should('have.length.of', 1) - - // remove the notification - cy.get('.notification-item') - .eq(0) - .find('.notification-item-cell') - .eq(1) - .click() - - // expect there to be no more notifications - cy.get('.notification-item').should('have.length.of', 0) - }) - - it('allows looking up account information', function() { - cy.visit('/dataverseuser.xhtml?selectTab=accountInfo') - - cy.get('.form-control-static') - .eq(0) - .should('contain', 'dataverseAdmin') - - cy.get('.form-control-static') - .eq(1) - .should('contain', 'Dataverse') - - cy.get('.form-control-static') - .eq(2) - .should('contain', 'Admin') - - cy.get('.form-control-static') - .eq(3) - .should('contain', 'dataverse@mailinator.com') - - cy.get('.form-control-static') - .eq(4) - .should('contain', 'Not Verified') - - cy.get('.form-control-static') - .eq(5) - .should('contain', 'Dataverse.org') - - cy.get('.form-control-static') - .eq(6) - .should('contain', 'Admin') - }) - - it('enables recreation of the API token', function() { - const tokenTabId = - 'div[id="dataverseUserForm:dataRelatedToMeView:apiTokenTab"]' - cy.visit('/dataverseuser.xhtml?selectTab=apiTokenTab') - - cy.get(`${tokenTabId} pre code`) - .should('not.be.empty') - .then(oldToken => { - // click the token recreation button - cy.get(`${tokenTabId} button[type=submit]`).click() - - cy.get(`${tokenTabId} pre code`) - .should('not.be.empty') - .then(newToken => { - // assert that the new token is different from the old one - expect(newToken[0].textContent).to.not.eq(oldToken[0].textContent) - }) - }) - }) -}) diff --git a/tests/cypress/integration/test_login.spec.js b/tests/cypress/integration/test_login.spec.js deleted file mode 100644 index 4741d57dd5b..00000000000 --- a/tests/cypress/integration/test_login.spec.js +++ /dev/null @@ -1,61 +0,0 @@ -describe('Log In', function() { - beforeEach(function() { - // visit the log in page - cy.visit('/loginpage.xhtml') - - // should create a session cookie - cy.getCookie('JSESSIONID').should('exist') - - // fill out the login form inputs - cy.get('input[name="loginForm:credentialsContainer:0:credValue"]').type( - 'dataverseAdmin' - ) - cy.get('input[name="loginForm:credentialsContainer:1:sCredValue"]').type( - 'admin1' - ) - }) - - it('enables logging in with the enter key', function() { - // press enter - cy.get('input[name="loginForm:credentialsContainer:1:sCredValue"]').type( - '{enter}' - ) - - // should redirect to the dataverse root page - cy.url().should('include', '/dataverse/root') - - // should show the user name in the navbar - cy.get('span[id=userDisplayInfoTitle]').should('contain', 'Dataverse Admin') - }) - - it('enables logging in by clicking the submit button', function() { - // click the login button - cy.get('button[name="loginForm:login').click() - - // should redirect to the dataverse root page - cy.url().should('include', '/dataverse/root') - - // should show the user name in the navbar - cy.get('span[id=userDisplayInfoTitle]').should('contain', 'Dataverse Admin') - }) - - it('prevents an invalid login', function() { - // add some additional characters to the valid credentials - cy.get('input[name="loginForm:credentialsContainer:0:credValue"]').type( - 'Invalid' - ) - cy.get('input[name="loginForm:credentialsContainer:1:sCredValue"]').type( - 'Invalid' - ) - // click the login button - cy.get('button[name="loginForm:login').click() - - cy.url().should('contain', '/loginpage.xhtml') - cy.get('.alert').should('contain', 'Error') - }) - - it('allows jumping to the password reset page', function() { - cy.get('a[href="passwordreset.xhtml"]').click() - cy.url().should('contain', '/passwordreset.xhtml') - }) -}) diff --git a/tests/cypress/integration/test_password_reset.spec.js b/tests/cypress/integration/test_password_reset.spec.js deleted file mode 100644 index a60c181978d..00000000000 --- a/tests/cypress/integration/test_password_reset.spec.js +++ /dev/null @@ -1,21 +0,0 @@ -describe('Password Reset', function() { - it('allows a valid user to request its password', function() { - cy.visit('/passwordreset.xhtml') - - cy.get('input[name="passwordReset:email"]').type( - 'dataverse@mailinator.com{enter}' - ) - - cy.get('.alert').should('contain', 'Password Reset Initiated') - }) - - it('does not treat invalid users differently', function() { - cy.visit('/passwordreset.xhtml') - - cy.get('input[name="passwordReset:email"]').type( - 'invalid_user@gmail.com{enter}' - ) - - cy.get('.alert').should('contain', 'Password Reset Initiated') - }) -}) diff --git a/tests/cypress/plugins/index.js b/tests/cypress/plugins/index.js deleted file mode 100644 index 95ee42a7b1c..00000000000 --- a/tests/cypress/plugins/index.js +++ /dev/null @@ -1,18 +0,0 @@ - -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js deleted file mode 100644 index c1f5a772e2b..00000000000 --- a/tests/cypress/support/commands.js +++ /dev/null @@ -1,25 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add("login", (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This is will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/tests/cypress/support/index.js b/tests/cypress/support/index.js deleted file mode 100644 index d68db96df26..00000000000 --- a/tests/cypress/support/index.js +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/tests/cypress/util.js b/tests/cypress/util.js deleted file mode 100644 index a824dde7496..00000000000 --- a/tests/cypress/util.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Function that performs a programmatic login - * @param {Cypress} cy - */ -export function login(cy, cb) { - // need to visit the login page to get the CSRF token - cy.visit('/loginpage.xhtml') - - // a session needs to have been setup - cy.getCookie('JSESSIONID').should('exist') - - // extract the CSRF token from the view state - cy.get('#loginForm input[name="javax.faces.ViewState"]').then(viewState => { - cy.request({ - method: 'POST', - url: 'http://localhost:8084/loginpage.xhtml', - form: true, - body: { - 'javax.faces.partial.ajax': true, - 'javax.faces.source': 'loginForm:login', - 'javax.faces.partial.execute': '@all', - 'javax.faces.partial.render': '@all', - 'loginForm:login': 'loginForm:login', - loginForm: 'loginForm', - 'loginForm:credentialsContainer:0:credValue': 'dataverseAdmin', - 'loginForm:credentialsContainer:1:sCredValue': 'admin1', - 'javax.faces.ViewState': viewState[0].value, - }, - }).then(cb ? cb : () => null) - }) -} diff --git a/tests/package.json b/tests/package.json deleted file mode 100644 index 170f3d99fdf..00000000000 --- a/tests/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "dataverse-tests", - "version": "0.0.1", - "scripts": { - "cypress:dev": "cypress open", - "cypress:ci": "cypress run" - }, - "devDependencies": { - "cypress": "3.3.1" - } -} diff --git a/tests/test_access.py b/tests/test_access.py deleted file mode 100644 index 53dd333cccd..00000000000 --- a/tests/test_access.py +++ /dev/null @@ -1,44 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_access(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - - def test_test_access(self): - success = True - msg = "Success" - wd = self.wd - wd.get(config.accessURL) - if not ("Log In" in wd.find_element_by_tag_name("html").text): - success = False - print("Could not verify page text.") - self.assertTrue(success) - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_account.py b/tests/test_account.py deleted file mode 100644 index 9347c756930..00000000000 --- a/tests/test_account.py +++ /dev/null @@ -1,68 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_account(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - def test_test_account(self): - success = True - varName = "Tester", time.time() - wd = self.wd - wd.get(config.accessURL) - wd.find_element_by_link_text("Create Account").click() - wd.find_element_by_id("dataverseUserForm:userName").click() - wd.find_element_by_id("dataverseUserForm:userName").clear() - wd.find_element_by_id("dataverseUserForm:userName").send_keys("varName") - wd.find_element_by_id("dataverseUserForm:inputPassword").click() - wd.find_element_by_id("dataverseUserForm:inputPassword").clear() - wd.find_element_by_id("dataverseUserForm:inputPassword").send_keys("tester") - wd.find_element_by_id("dataverseUserForm:retypePassword").click() - wd.find_element_by_id("dataverseUserForm:retypePassword").clear() - wd.find_element_by_id("dataverseUserForm:retypePassword").send_keys("tester") - wd.find_element_by_id("dataverseUserForm:firstName").click() - wd.find_element_by_id("dataverseUserForm:firstName").clear() - wd.find_element_by_id("dataverseUserForm:firstName").send_keys("test") - wd.find_element_by_id("dataverseUserForm:lastName").click() - wd.find_element_by_id("dataverseUserForm:lastName").clear() - wd.find_element_by_id("dataverseUserForm:lastName").send_keys("user") - wd.find_element_by_id("dataverseUserForm:email").click() - wd.find_element_by_id("dataverseUserForm:email").clear() - wd.find_element_by_id("dataverseUserForm:email").send_keys("kcondon@hmdc.harvard.edu") - wd.find_element_by_id("dataverseUserForm:institution").click() - wd.find_element_by_id("dataverseUserForm:institution").clear() - wd.find_element_by_id("dataverseUserForm:institution").send_keys("IQSS") - wd.find_element_by_xpath("//div[@id='dataverseUserForm:j_idt45']/div[3]").click() - wd.find_element_by_xpath("//div[@class='ui-selectonemenu-items-wrapper']//li[.='Staff']").click() - wd.find_element_by_id("dataverseUserForm:phone").click() - wd.find_element_by_id("dataverseUserForm:phone").clear() - wd.find_element_by_id("dataverseUserForm:phone").send_keys("1-222-333-4444") - wd.find_element_by_id("dataverseUserForm:save").click() - - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_create_test_account.py b/tests/test_create_test_account.py deleted file mode 100644 index 06491dc0c28..00000000000 --- a/tests/test_create_test_account.py +++ /dev/null @@ -1,74 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_create_test_account(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - def test_test_create_test_account(self): - success = True - wd = self.wd - wd.get(config.accessURL) - wd.find_element_by_link_text("Create Account").click() - wd.find_element_by_id("dataverseUserForm:userName").click() - wd.find_element_by_id("dataverseUserForm:userName").clear() - wd.find_element_by_id("dataverseUserForm:userName").send_keys("tester") - wd.find_element_by_id("dataverseUserForm:inputPassword").click() - wd.find_element_by_id("dataverseUserForm:inputPassword").clear() - wd.find_element_by_id("dataverseUserForm:inputPassword").send_keys("tester") - wd.find_element_by_id("dataverseUserForm:retypePassword").click() - wd.find_element_by_id("dataverseUserForm:retypePassword").clear() - wd.find_element_by_id("dataverseUserForm:retypePassword").send_keys("tester") - wd.find_element_by_id("dataverseUserForm:firstName").click() - wd.find_element_by_id("dataverseUserForm:firstName").clear() - wd.find_element_by_id("dataverseUserForm:firstName").send_keys("test") - wd.find_element_by_id("dataverseUserForm:lastName").click() - wd.find_element_by_id("dataverseUserForm:lastName").clear() - wd.find_element_by_id("dataverseUserForm:lastName").send_keys("user") - wd.find_element_by_id("dataverseUserForm:email").click() - wd.find_element_by_id("dataverseUserForm:email").clear() - wd.find_element_by_id("dataverseUserForm:email").send_keys("kcondon@hmdc.harvard.edu") - wd.find_element_by_id("dataverseUserForm:institution").click() - wd.find_element_by_id("dataverseUserForm:institution").clear() - wd.find_element_by_id("dataverseUserForm:institution").send_keys("IQSS") - wd.find_element_by_xpath("//div[@id='dataverseUserForm:j_idt45']/div[3]").click() - wd.find_element_by_xpath("//div[@class='ui-selectonemenu-items-wrapper']//li[.='Staff']").click() - wd.find_element_by_id("dataverseUserForm:phone").click() - wd.find_element_by_id("dataverseUserForm:phone").clear() - wd.find_element_by_id("dataverseUserForm:phone").send_keys("1-222-333-4444") - wd.find_element_by_id("dataverseUserForm:save").click() - time.sleep(1) - if ("This Username is already taken." in wd.find_element_by_tag_name("html").text): - print("Username exists. Exiting.") - return - if not ("Log Out" in wd.find_element_by_tag_name("html").text): - success = false - print("User was not logged in after create account.") - self.assertTrue(success) - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_dataset.py b/tests/test_dataset.py deleted file mode 100644 index 264124abef7..00000000000 --- a/tests/test_dataset.py +++ /dev/null @@ -1,69 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_dataset(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - def test_test_dataset(self): - success = True - wd = self.wd - wd.get(config.accessURL) - wd.find_element_by_link_text("Log In").click() - time.sleep(1) - wd.find_element_by_id("loginForm:userName").click() - wd.find_element_by_id("loginForm:userName").clear() - wd.find_element_by_id("loginForm:userName").send_keys("tester") - wd.find_element_by_id("loginForm:password").click() - wd.find_element_by_id("loginForm:password").clear() - wd.find_element_by_id("loginForm:password").send_keys("tester") - wd.find_element_by_id("loginForm:login").click() - time.sleep(1) - wd.find_element_by_id("shareForm:shareData_button").click() - wd.find_element_by_link_text("Add Dataset").click() - wd.find_element_by_id("datasetForm:title").click() - wd.find_element_by_id("datasetForm:title").clear() - wd.find_element_by_id("datasetForm:title").send_keys("test dataset") - wd.find_element_by_css_selector("td.leftClass").click() - wd.find_element_by_id("datasetForm:author").click() - wd.find_element_by_id("datasetForm:author").clear() - wd.find_element_by_id("datasetForm:author").send_keys("tester") - wd.find_element_by_id("datasetForm:date").click() - wd.find_element_by_id("datasetForm:date").clear() - wd.find_element_by_id("datasetForm:date").send_keys("2013") - wd.find_element_by_id("datasetForm:distributor").click() - wd.find_element_by_id("datasetForm:distributor").clear() - wd.find_element_by_id("datasetForm:distributor").send_keys("test inc") - wd.find_element_by_id("datasetForm:description").click() - wd.find_element_by_id("datasetForm:description").clear() - wd.find_element_by_id("datasetForm:description").send_keys("This is a test") - wd.find_element_by_id("datasetForm:save").click() - wd.find_element_by_link_text("Log Out").click() - self.assertTrue(success) - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_dataset_fileupload.py b/tests/test_dataset_fileupload.py deleted file mode 100644 index 6edad93ef33..00000000000 --- a/tests/test_dataset_fileupload.py +++ /dev/null @@ -1,85 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_dataset_fileupload(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - def test_test_dataset_fileupload(self): - success = True - wd = self.wd - wd.get(config.accessURL) - # Log in as test user - wd.find_element_by_link_text("Log In").click() - time.sleep(1) - wd.find_element_by_id("loginForm:userName").click() - wd.find_element_by_id("loginForm:userName").clear() - wd.find_element_by_id("loginForm:userName").send_keys("tester") - wd.find_element_by_id("loginForm:password").click() - wd.find_element_by_id("loginForm:password").clear() - wd.find_element_by_id("loginForm:password").send_keys("tester") - wd.find_element_by_id("loginForm:login").click() - time.sleep(1) - # Choose to upload dataset - wd.find_element_by_id("shareForm:shareData_button").click() - wd.find_element_by_link_text("Add Dataset").click() - time.sleep(1) - # Enter dataset info - wd.find_element_by_id("datasetForm:title").click() - wd.find_element_by_id("datasetForm:title").clear() - wd.find_element_by_id("datasetForm:title").send_keys("Test Drag and Drop") - wd.find_element_by_id("datasetForm:author").click() - wd.find_element_by_id("datasetForm:author").clear() - wd.find_element_by_id("datasetForm:author").send_keys("tester") - wd.find_element_by_id("datasetForm:date").click() - wd.find_element_by_id("datasetForm:date").clear() - wd.find_element_by_id("datasetForm:date").send_keys("2013") - wd.find_element_by_id("datasetForm:distributor").click() - wd.find_element_by_id("datasetForm:distributor").clear() - wd.find_element_by_id("datasetForm:distributor").send_keys("test") - wd.find_element_by_id("datasetForm:description").click() - wd.find_element_by_id("datasetForm:description").clear() - wd.find_element_by_id("datasetForm:description").send_keys("This is a test.") - # Upload file - wd.find_element_by_id("datasetForm:tabView:fileUpload_input").send_keys("/Users/kcondon/Downloads/50by1000.dta") - time.sleep(3) - if wd.find_element_by_id("datasetForm:tabView:filesTable:0:fileName").get_attribute("value") != "50by1000.dta": - success = False - print("Could not find file name in upload table.") - wd.find_element_by_id("datasetForm:save").click() - time.sleep(3) - if not ("Test Drag and Drop" in wd.find_element_by_tag_name("html").text): - success = False - print("Could not find dataset title on page.") - if not ("tester, \"Test Drag and Drop\", 2013, test, http://dx.doi.org/10.1234/dataverse/" in wd.find_element_by_tag_name("html").text): - success = False - print("Could not verify data citation.") - wd.find_element_by_link_text("Log Out").click() - self.assertTrue(success) - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_dataverse.py b/tests/test_dataverse.py deleted file mode 100644 index 5de4e7d0e41..00000000000 --- a/tests/test_dataverse.py +++ /dev/null @@ -1,71 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_dataverse(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - def test_test_dataverse(self): - success = True - wd = self.wd - wd.get(config.accessURL) - wd.find_element_by_link_text("Log In").click() - time.sleep(1) - if not ("Login" in wd.find_element_by_tag_name("html").text): - success = False - print("verifyTextPresent failed") - wd.find_element_by_id("loginForm:userName").click() - wd.find_element_by_id("loginForm:userName").clear() - wd.find_element_by_id("loginForm:userName").send_keys("tester") - wd.find_element_by_id("loginForm:password").click() - wd.find_element_by_id("loginForm:password").clear() - wd.find_element_by_id("loginForm:password").send_keys("tester") - wd.find_element_by_id("loginForm:login").click() - wd.find_element_by_id("shareForm:shareData_button").click() - wd.find_element_by_link_text("Create Dataverse").click() - wd.find_element_by_id("dataverseForm:name").click() - wd.find_element_by_id("dataverseForm:name").clear() - wd.find_element_by_id("dataverseForm:name").send_keys("test dv") - wd.find_element_by_id("dataverseForm:alias").click() - wd.find_element_by_id("dataverseForm:alias").clear() - wd.find_element_by_id("dataverseForm:alias").send_keys("testdv") - wd.find_element_by_id("dataverseForm:contactEmail").click() - wd.find_element_by_id("dataverseForm:contactEmail").clear() - wd.find_element_by_id("dataverseForm:contactEmail").send_keys("kcondon@hmdc.harvard.edu") - wd.find_element_by_id("dataverseForm:affiliation").click() - wd.find_element_by_id("dataverseForm:affiliation").clear() - wd.find_element_by_id("dataverseForm:affiliation").send_keys("IQSS") - wd.find_element_by_id("dataverseForm:description").click() - wd.find_element_by_id("dataverseForm:description").clear() - wd.find_element_by_id("dataverseForm:description").send_keys("This is a test") - wd.find_element_by_id("dataverseForm:save").click() - - wd.find_element_by_link_text("Log Out").click() - self.assertTrue(success) - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_root_dataverse.py b/tests/test_root_dataverse.py deleted file mode 100644 index c97a99c8b01..00000000000 --- a/tests/test_root_dataverse.py +++ /dev/null @@ -1,62 +0,0 @@ -from selenium import webdriver -import time, unittest, config - -def is_alert_present(wd): - try: - wd.switch_to_alert().text - return True - except: - return False - -class test_root_dataverse(unittest.TestCase): - def setUp(self): - if (config.local): - self.wd = webdriver.Firefox() - else: - desired_capabilities = webdriver.DesiredCapabilities.FIREFOX - desired_capabilities['version'] = '24' - desired_capabilities['platform'] = 'Linux' - desired_capabilities['name'] = 'test_access' - self.wd = webdriver.Remote( - desired_capabilities=desired_capabilities, - command_executor="http://esodvn:325caef9-81dd-47a5-8b74-433057ce888f@ondemand.saucelabs.com:80/wd/hub" - ) - - self.wd.implicitly_wait(60) - - def test_test_root_dataverse(self): - success = True - wd = self.wd - wd.get(config.accessURL) - if not ("Create Root Dataverse" in wd.find_element_by_tag_name("html").text): - print("Root dataverse exists. Exiting.") - return - wd.find_element_by_id("dataverseForm:name").click() - wd.find_element_by_id("dataverseForm:name").clear() - wd.find_element_by_id("dataverseForm:name").send_keys("root dv") - wd.find_element_by_id("dataverseForm:alias").click() - wd.find_element_by_id("dataverseForm:alias").clear() - wd.find_element_by_id("dataverseForm:alias").send_keys("rootdv") - wd.find_element_by_id("dataverseForm:contactEmail").click() - wd.find_element_by_id("dataverseForm:contactEmail").clear() - wd.find_element_by_id("dataverseForm:contactEmail").send_keys("kcondon@hmdc.harvard.edu") - wd.find_element_by_id("dataverseForm:affiliation").click() - wd.find_element_by_id("dataverseForm:affiliation").clear() - wd.find_element_by_id("dataverseForm:affiliation").send_keys("IQSS") - wd.find_element_by_id("dataverseForm:description").click() - wd.find_element_by_id("dataverseForm:description").clear() - wd.find_element_by_id("dataverseForm:description").send_keys("This is a test") - wd.find_element_by_id("dataverseForm:save").click() - time.sleep(1) - if not ("root dv" in wd.find_element_by_tag_name("html").text): - success = False - print("verify root dv name failed") - self.assertTrue(success) - - def tearDown(self): - if not (config.local): - print("Link to your job: https://saucelabs.com/jobs/%s" % self.wd.session_id) - self.wd.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_suite.py b/tests/test_suite.py deleted file mode 100644 index 7210d5cc965..00000000000 --- a/tests/test_suite.py +++ /dev/null @@ -1,25 +0,0 @@ -# This contain a list of individual test and will be run from Jenkins. - -import unittest -import test_access -import test_create_test_account -import test_root_dataverse -import test_account -import test_dataverse -import test_dataset -import test_dataset_fileupload - -# This is a list of testFileName.testClass -def suite(): - return unittest.TestSuite((\ - unittest.makeSuite(test_access.test_access), - unittest.makeSuite(test_create_test_account.test_create_test_account), - unittest.makeSuite(test_root_dataverse.test_root_dataverse), - unittest.makeSuite(test_account.test_account), - unittest.makeSuite(test_dataverse.test_dataverse), - unittest.makeSuite(test_dataset.test_dataset), - unittest.makeSuite(test_dataset_fileupload.test_dataset_fileupload), - )) - -if __name__ == '__main__': - result = unittest.TextTestRunner(verbosity=2).run(suite()) \ No newline at end of file