diff --git a/.gitignore b/.gitignore index 433e4ee..ac641d3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ pyvenv.cfg config.yml prd.yml acc.yml -browser ./*.yml status/ +venv/ +screenshot.png diff --git a/config.yml.example b/config.yml.example index b014c2c..d902d35 100644 --- a/config.yml.example +++ b/config.yml.example @@ -1,104 +1,140 @@ -sbs_ci: - start: 'https://changeit/landing' - user: 'changeit' - password: 'changeit' +--- +sbs: + url: 'https://acc.sram.surf.nl/' -sram_monitoring: - 'https://demo-sp.sram.surf.nl/rp/acc': - user1.password: - sub: 269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org - name: Student One - eduperson_entitlement: - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:sram_demosp_acc-tweebob - - urn:mace:surf.nl:sram-acc:group:surf_demo - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:testdienst-g2 - - urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org - voperson_external_affiliation: - - member@test-idp.sram.surf.nl - - student@test-idp.sram.surf.nl - user2.password: - sub: fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org - name: Employee One +pam: + token: 'xxx' + +monitoring: + oidc_url: 'https://demo-sp.sram.surf.nl/rp/acc' + saml_url: 'https://demo-sp.sram.surf.nl/auth/acc?format=json' + +accounts: + student: + name: 'Student One' + password: 'xxx' + employee: + name: 'Employee One' + password: 'xxx' + +user_data: + student: + oidc_url: + sub: "269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org" + name: "Student One" + given_name: "Student" + family_name: "One" + email: "student@test-idp.sram.surf.nl" + uid: + - "sone" eduperson_entitlement: - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:sram_demosp_acc-tweebob - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco - - urn:mace:surf.nl:sram-acc:group:surf_demo - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:testdienst-g2 - - urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org + - "urn:mace:surf.nl:sram-acc:group:sramadmin:samloidc_monitor" + - "urn:mace:surf.nl:sram-acc:group:sramadmin" + - "urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org" + eduperson_principal_name: + - "sone@acc.sram.surf.nl" + eduperson_scoped_affiliation: + - "member@acc.sram.eduteams.org" voperson_external_affiliation: - - member@test-idp.sram.surf.nl - - employee@test-idp.sram.surf.nl - 'https://demo-sp.sram.surf.nl/auth/acc?format=json': - user1.password: + - "member@test-idp.sram.surf.nl" + - "student@test-idp.sram.surf.nl" + voperson_external_id: + - "student@test-idp.sram.surf.nl" + voperson_id: + - "269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org" + + saml_url: uid: - - sone + - "sone" schacHomeOrganization: - - test-idp.sram.surf.nl + - "test-idp.sram.surf.nl" voPersonExternalID: - - student@test-idp.sram.surf.nl + - "student@test-idp.sram.surf.nl" displayName: - - Student One + - "Student One" cn: - - Student One + - "Student One" sn: - - One + - "One" givenName: - - Student + - "Student" mail: - - student@test-idp.sram.surf.nl + - "student@test-idp.sram.surf.nl" eduPersonUniqueId: - - 269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org + - "269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org" subject-id: - - 269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org + - "269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org" voPersonID: - - 269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org + - "269b86b3899157d352f5bed21842441cbde42c07@acc.sram.eduteams.org" voPersonExternalAffiliation: - - member@test-idp.sram.surf.nl - - student@test-idp.sram.surf.nl + - "member@test-idp.sram.surf.nl" + - "student@test-idp.sram.surf.nl" eduPersonEntitlement: - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:sram_demosp_acc-tweebob - - urn:mace:surf.nl:sram-acc:group:surf_demo - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:testdienst-g2 - - urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org + - "urn:mace:surf.nl:sram-acc:group:sramadmin" + - "urn:mace:surf.nl:sram-acc:group:sramadmin:samloidc_monitor" + - "urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org" eduPersonPrincipalName: - - sone@acc.sram.surf.nl + - "sone@acc.sram.surf.nl" eduPersonScopedAffiliation: - - member@acc.sram.eduteams.org - user2.password: + - "member@acc.sram.eduteams.org" + + employee: + oidc_url: + sub: "fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org" + name: "Employee One" + given_name: "Employee" + family_name: "One" + email: "employee@test-idp.sram.surf.nl" + uid: + - "eone" + eduperson_entitlement: + - "urn:mace:surf.nl:sram-acc:group:sramadmin" + - "urn:mace:surf.nl:sram-acc:group:sramadmin:samloidc_monitor" + - "urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org" + eduperson_principal_name: + - "eone@acc.sram.surf.nl" + eduperson_scoped_affiliation: + - "member@acc.sram.eduteams.org" + voperson_external_affiliation: + - "member@test-idp.sram.surf.nl" + - "employee@test-idp.sram.surf.nl" + voperson_external_id: + - "employee@test-idp.sram.surf.nl" + voperson_id: + - "fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org" + + saml_url: uid: - - eone + - "eone" schacHomeOrganization: - - test-idp.sram.surf.nl + - "test-idp.sram.surf.nl" voPersonExternalID: - - employee@test-idp.sram.surf.nl + - "employee@test-idp.sram.surf.nl" displayName: - - Employee One + - "Employee One" cn: - - Employee One + - "Employee One" sn: - - One + - "One" givenName: - - Employee + - "Employee" mail: - - employee@test-idp.sram.surf.nl + - "employee@test-idp.sram.surf.nl" eduPersonUniqueId: - - fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org + - "fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org" subject-id: - - fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org + - "fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org" voPersonID: - - fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org + - "fdfc07b007da25f384d9935c8739c6923ff503e1@acc.sram.eduteams.org" voPersonExternalAffiliation: - - member@test-idp.sram.surf.nl - - employee@test-idp.sram.surf.nl + - "member@test-idp.sram.surf.nl" + - "employee@test-idp.sram.surf.nl" eduPersonEntitlement: - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:testdienst-g2 - - urn:mace:surf.nl:sram-acc:group:surf_demo - - urn:mace:surf.nl:sram-acc:group:surf_demo:monitoringco:sram_demosp_acc-tweebob - - urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org + - "urn:mace:surf.nl:sram-acc:group:sramadmin" + - "urn:mace:surf.nl:sram-acc:group:sramadmin:samloidc_monitor" + - "urn:geant:eduteams.org:acc.sram.eduteams.org:group:surf-ram#acc.sram.eduteams.org" eduPersonPrincipalName: - - eone@acc.sram.surf.nl + - "eone@acc.sram.surf.nl" eduPersonScopedAffiliation: - - member@acc.sram.eduteams.org + - "member@acc.sram.eduteams.org" + diff --git a/features/01_monitoring.feature b/features/01_monitoring.feature new file mode 100644 index 0000000..99fc788 --- /dev/null +++ b/features/01_monitoring.feature @@ -0,0 +1,14 @@ +Feature: Monitoring + Scenario Outline: Verifying End-to-End flow for user + Given SBS health UP + and we visit monitoring + and we choose SRAM Monitoring IdP + When we login as + Then test userdata for in + + Examples: Test + | start | user | + | oidc_url | student | + | saml_url | student | + | oidc_url | employee | + | saml_url | employee | diff --git a/features/02_sbs.feature b/features/02_sbs.feature new file mode 100644 index 0000000..73d6362 --- /dev/null +++ b/features/02_sbs.feature @@ -0,0 +1,12 @@ +Feature: SBS login + Scenario Outline: Verifying SBS login user + Given SBS health UP + and we visit profile + and we choose SRAM Monitoring IdP + When we login as + Then name in profile + + Examples: Test + | user | + | student | + | employee | diff --git a/features/03_pam-weblogin.feature b/features/03_pam-weblogin.feature new file mode 100644 index 0000000..9d0c211 --- /dev/null +++ b/features/03_pam-weblogin.feature @@ -0,0 +1,12 @@ +Feature: PAM weblogin + Scenario Outline: Verifying PAM weblogin for user + Given SBS health UP + and we call pam start + and we use link to login + and we choose SRAM Monitoring IdP + When we login as + Then we use code to check pam check-pin + + Examples: Test + | user | + | student | diff --git a/features/environment.py b/features/environment.py new file mode 100644 index 0000000..39585e9 --- /dev/null +++ b/features/environment.py @@ -0,0 +1,57 @@ +from behave import fixture, use_fixture +from selenium.webdriver import Remote, ChromeOptions, FirefoxOptions +from selenium.webdriver.support.wait import WebDriverWait +import yaml + + +@fixture +def selenium_browser(context, browser): + if browser == 'chrome': + options = ChromeOptions() + else: + options = FirefoxOptions() + + options.add_argument('--headless') + # options.add_argument('--ignore-certificate-errors') + # options.add_argument('--user-data-dir=/tmp/chrome-data') + context.browser = Remote("http://127.0.0.1:4444", options=options) + context.browser.implicitly_wait(5) + context.wait = WebDriverWait(context.browser, timeout=5) + + # Halts all tests on error + context.config.stop = True + yield context.browser + + context.browser.quit() + + +def before_all(context): + env = context.config.userdata.get("ENV") + + with open(env, 'r') as f: + try: + config = yaml.load(f, Loader=yaml.FullLoader) + except yaml.YAMLError as exc: + print(exc) + + context.env = config + + +def before_feature(context, feature): + pass + + +def before_scenario(context, scenario): + browser = context.config.userdata.get("BROWSER") + use_fixture(selenium_browser, context, browser) + + +def after_scenario(context, scenario): + pass + + +def after_step(context, step): + if step.status == "failed": + print(context.browser.current_url) + print(context.browser.page_source) + context.browser.save_screenshot("screenshot.png") diff --git a/features/steps/sram.py b/features/steps/sram.py new file mode 100644 index 0000000..c0fd734 --- /dev/null +++ b/features/steps/sram.py @@ -0,0 +1,174 @@ +from behave import given, when, then +from selenium.webdriver.support.expected_conditions import ( + presence_of_element_located, url_contains, element_to_be_clickable) +from selenium.webdriver.common.by import By +import requests +import time +import json +import re + + +@given('SBS health UP') +def step_impl(context): + # Environment + url = context.env['sbs']['url'] + health = f"{url}health" + + status = "" + tries = 0 + while status != "UP" and tries < 5: + tries += 1 + body = requests.get(health) + state = body.json() + status = state.get("status") + time.sleep(1) + + +@given('we visit monitoring {endpoint}') +def step_impl(context, endpoint): + # Environment + url = context.env['monitoring'][endpoint] + + context.browser.get(url) + + +@given('we visit profile') +def step_impl(context): + # Environment + url = context.env['sbs']['url'] + profile = f"{url}profile" + + context.browser.get(profile) + + +@given('we call pam start') +def step_impl(context): + # Environment + url = context.env['sbs']['url'] + start = f"{url}pam-weblogin/start" + token = context.env['pam']['token'] + + regex = r"(https?://.*)\s" + start_payload = { + "attribute": "username", + "cache_duration": 60, + "GIT_COMMIT": "monitor", + "JSONPARSER_GIT_COMMIT": "monitor", + } + headers = { + "Authorization": f"Bearer {token}", + } + + r = requests.post(start, json=start_payload, headers=headers) + j = json.loads(r.text) + + context.session_id = j['session_id'] + challenge = j['challenge'] + context.link = re.findall(regex, challenge)[0] + + +@given('we use link to login') +def step_impl(context): + xpath_login_button = "//span[@class='textual' and text()='Log in']" + + context.browser.get(context.link) + + # Wait for loginpage to load + context.wait.until(presence_of_element_located((By.XPATH, xpath_login_button)), + 'Timeout waiting for Profile') + # Click login + context.browser.find_element(By.XPATH, xpath_login_button).click() + + +@given('we choose {idp}') +def step_impl(context, idp): + # Wait for discovery to load + context.wait.until(presence_of_element_located((By.XPATH, "//p[@class='subtitleRA21']")), + 'Timeout waiting for discovery') + + search = context.wait.until(element_to_be_clickable((By.ID, 'searchinput')), + 'Timeout waiting for searchinput') + search.send_keys(idp) + + xpath = f"//div[@class='text-truncate label primary' and text()='{idp}']" + target = context.browser.find_element(By.XPATH, xpath) + + # Choose IdP + target.click() + + +@when('we login as {user}') +def step_impl(context, user): + # Environment + password = context.env['accounts'][user]['password'] + + context.wait.until(url_contains('test-idp.sram.surf.nl')) + + # Login as user + context.browser.find_element(By.ID, 'username').send_keys(user) + context.browser.find_element(By.ID, 'password').send_keys(password) + context.browser.find_element(By.NAME, 'f').submit() + + +@then('we use code to check pam check-pin') +def step_impl(context): + # Environment + url = context.env['sbs']['url'] + check_pin = f"{url}pam-weblogin/check-pin" + token = context.env['pam']['token'] + + xpath_code_element = "//span[@class='value']" + headers = { + "Authorization": f"Bearer {token}", + } + + # Wait for Verification code to load + context.wait.until(presence_of_element_located((By.XPATH, xpath_code_element)), + 'Timeout waiting for Profile') + + # Test admin attributes + code = context.browser.find_elements(By.XPATH, xpath_code_element)[0].text + + pin_payload = { + "session_id": context.session_id, + "pin": code, + } + + r = requests.post(check_pin, json=pin_payload, headers=headers) + j = json.loads(r.text) + + result = j['result'] + assert (result == "SUCCESS"), "Login did not return SUCCESS" + + +@then('{user} name in profile') +def step_impl(context, user): + # Environment + name = context.env['accounts'][user]['name'] + + # Wait for Profile to load + context.wait.until(presence_of_element_located((By.XPATH, "//h2[text()='Your profile']")), + 'Timeout waiting for Profile') + + # Test user attributes + attributes = context.browser.find_elements(By.XPATH, "//table[@class='my-attributes']/*/*/*") + print(name) + for a in attributes: + print(a.text) + assert (name in [a.text for a in attributes]), "No valid user profile found" + + +@then('test userdata for {user} in {endpoint}') +def step_impl(context, user, endpoint): + # Environment + userdata = context.env['user_data'][user][endpoint] + + data_element = context.browser.find_elements(By.ID, "data")[0].text + data = json.loads(data_element) + + for key, value in userdata.items(): + if isinstance(value, list): + for item in value: + assert (item in data.get(key)), f"{user['name']}, {key}: {item} not found" + else: + assert (value in data.get(key)), f"{user['name']}, {key}: {value} not found" diff --git a/pam-monitor.py b/pam-monitor.py deleted file mode 100755 index 690e5a5..0000000 --- a/pam-monitor.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python -import sys -import time -import yaml -import requests -import json -import re -import traceback - -from selenium.webdriver import Remote, ChromeOptions, FirefoxOptions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.support.expected_conditions import (staleness_of, presence_of_element_located, - title_contains, url_contains) -from selenium.webdriver.common.by import By - -if len(sys.argv) < 3: - sys.exit(sys.argv[0] + " ") - -print(f"= READING {sys.argv[1:]} ====", file=sys.stderr) -with open(sys.argv[1], 'r') as f: - try: - config = yaml.load(f, Loader=yaml.FullLoader) - except yaml.YAMLError as exc: - print(exc) - -KEY = 'pam_monitor' -config = config[KEY] - -start_payload = { - # "user_id": "ascz", - "attribute": "username", - "cache_duration": 60, - "GIT_COMMIT": "monitor", - "JSONPARSER_GIT_COMMIT": "monitor", -} -regex = r"(https?://.*)\s" -xpath_login_button = "//span[@class='textual' and text()='Log in']" -xpath_code_element = "//span[@class='value']" - - -browser = sys.argv[2] -print(f"= Starting Browser {browser} ===", file=sys.stderr) -if browser == "chrome": - options = ChromeOptions() -elif browser == "firefox": - options = FirefoxOptions() -else: - print('Bad Browser') - exit - -options.add_argument('--headless') - -try: - for url, values in config.items(): - browser = Remote("http://127.0.0.1:4444", options=options) - browser.implicitly_wait(2) - wait = WebDriverWait(browser, timeout=2) - - token = values['token'] - account = values['account'] - (username, password) = account.split('.') - # print(f"{url}, {token}", file=sys.stderr) - # print(f"{username}:{password}", file=sys.stderr) - health = f'{url}health' - headers = { - "Authorization": f"Bearer {token}", - } - - r = requests.post(f"{url}pam-weblogin/start", json=start_payload, headers=headers) - j = json.loads(r.text) - - session_id = j['session_id'] - challenge = j['challenge'] - link = re.findall(regex, challenge)[0] - print(link, file=sys.stderr) - # break - - # Wait for SBS health up - status = "" - while status != "UP": - body = requests.get(health) - state = body.json() - status = state.get("status") - time.sleep(1) - - # Get SBS link page - browser.get(link) - - # Wait for loginpage to load - wait.until(presence_of_element_located((By.XPATH, xpath_login_button)), - 'Timeout waiting for Profile') - - # Click login - browser.find_element(By.XPATH, xpath_login_button).click() - - # Wait for discovery to load - wait.until(title_contains('SURF Research Access Management'), - 'Timeout waiting for discovery') - - # Choose Monitoring IdP - try: - xpath = "//div[@class='primary' and text()='SRAM Monitoring IdP']" - monitor = browser.find_element(By.XPATH, xpath) - except Exception: - search = browser.find_element(By.ID, 'searchinput') - search.send_keys('monitoring') - xpath = "//div[@class='text-truncate label primary' and text()='SRAM Monitoring IdP']" - monitor = browser.find_element(By.XPATH, xpath) - - monitor.click() - - wait.until(url_contains('test-idp.sram.surf.nl')) - - # Login as user - browser.find_element(By.ID, 'username').send_keys(username) - browser.find_element(By.ID, 'password').send_keys(password) - browser.find_element(By.NAME, 'f').submit() - - # Wait for Verification code to load - wait.until(presence_of_element_located((By.XPATH, xpath_code_element)), - 'Timeout waiting for Profile') - - # Test admin attributes - code = browser.find_elements(By.XPATH, xpath_code_element)[0].text - - print(f"code: {code}", file=sys.stderr) - - pin_payload = { - "session_id": session_id, - "pin": code, - } - - r = requests.post(f"{url}pam-weblogin/check-pin", json=pin_payload, headers=headers) - j = json.loads(r.text) - - result = j['result'] - - if not result == "SUCCESS": - raise Exception("FAIL") - - print(f"result: {result}", file=sys.stderr) - print("= OK =======", file=sys.stderr) - browser.quit() - - print("OK") - -except Exception as e: - tr = traceback.extract_tb(e.__traceback__)[0] - print(f"error {type(e).__name__} on line {tr.lineno} of '{tr.filename}'") - browser.quit() - exit(1) diff --git a/requirements.txt b/requirements.txt index afca43e..fd3f6d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ PyYAML selenium +behave requests +setuptools diff --git a/run_sram_monitoring.sh b/run_sram_monitoring.sh index a06a876..00e053f 100755 --- a/run_sram_monitoring.sh +++ b/run_sram_monitoring.sh @@ -1,4 +1,13 @@ -#!/bin/sh +#!/bin/bash + +function ok { + if [ "$1" == "0" ]; then + echo "OK" + else + echo "ERROR" + fi +} + if [ -z $1 ]; then echo "Environment not set" exit 1 @@ -42,18 +51,14 @@ LOGFILE="status/${ENV}.log" #date date --utc +"%s" > ${LOGFILE}.new -# Service login test -OUTPUT=$(python3 sram_monitoring_test.py "${ENV}.yml" "$BROWSER") -echo login=$OUTPUT >> ${LOGFILE}.new - -# SBS login test -OUTPUT=$(python3 sbs-login.py "${ENV}.yml" "$BROWSER") -echo sbs_login=$OUTPUT >> ${LOGFILE}.new - -# PAM weblogin test -OUTPUT=$(python3 pam-monitor.py "${ENV}.yml" "$BROWSER") -echo pam_weblogin=$OUTPUT >> ${LOGFILE}.new +# Run behave tests +behave features/01_monitoring.feature -D ENV="${ENV}.yml" -D BROWSER="$BROWSER" +echo login=$(ok $?) >> ${LOGFILE}.new +behave features/02_sbs.feature -D ENV="${ENV}.yml" -D BROWSER="$BROWSER" +echo sbs_login=$(ok $?) >> ${LOGFILE}.new +behave features/03_pam-weblogin.feature -D ENV="${ENV}.yml" -D BROWSER="$BROWSER" +echo pam_weblogin=$(ok $?) >> ${LOGFILE}.new echo "browser=$BROWSER" >> ${LOGFILE}.new cat ${LOGFILE}.new diff --git a/sbs-login.py b/sbs-login.py deleted file mode 100755 index d8f33b6..0000000 --- a/sbs-login.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python - -from selenium.webdriver import Remote, ChromeOptions, FirefoxOptions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.support.expected_conditions import (staleness_of, presence_of_element_located, - title_contains, url_contains) -from selenium.webdriver.common.by import By - -import sys -import yaml -import json -import time -import traceback -import requests - -if len(sys.argv) < 3: - sys.exit(sys.argv[0] + " ") - -print(f"= READING {sys.argv[1:]} ====", file=sys.stderr) -with open(sys.argv[1], 'r') as f: - try: - config = yaml.load(f, Loader=yaml.FullLoader) - except yaml.YAMLError as exc: - print(exc) - -KEY = 'sbs_login' -config = config[KEY] - -xpath_login_button = '//button[span[text()="Log in"]]' -xpath_logo = '//a[@class="logo"]//span[text()="Research Access Management"]' - -browser = sys.argv[2] -print(f"= Starting Browser {browser} ===", file=sys.stderr) -if browser == "chrome": - options = ChromeOptions() -elif browser == "firefox": - options = FirefoxOptions() -else: - print('Bad Browser') - exit - -options.add_argument('--headless') - -try: - for (url, login) in config.items(): - print(url, file=sys.stderr) - for (account, name) in login.items(): - browser = Remote("http://127.0.0.1:4444", options=options) - browser.implicitly_wait(2) - wait = WebDriverWait(browser, timeout=2) - - (username, password) = account.split('.') - print("============", file=sys.stderr) - print(username, name, file=sys.stderr) - # print(password, file=sys.stderr) - # print(name, file=sys.stderr) - - health = f'{url}health' - start = f'{url}profile' - - # Wait for SBS health up - status = "" - while status != "UP": - body = requests.get(health) - state = body.json() - status = state.get("status") - time.sleep(1) - - # Get SBS profile page - browser.get(start) - - # Wait for discovery to load - wait.until(title_contains('SURF Research Access Management'), - 'Timeout waiting for discovery') - - # Choose Monitoring IdP - try: - xpath = "//div[@class='primary' and text()='SRAM Monitoring IdP']" - monitor = browser.find_element(By.XPATH, xpath) - except Exception: - search = browser.find_element(By.ID, 'searchinput') - search.send_keys('monitoring') - xpath = "//div[@class='text-truncate label primary' and text()='SRAM Monitoring IdP']" - monitor = browser.find_element(By.XPATH, xpath) - - monitor.click() - - wait.until(url_contains('test-idp.sram.surf.nl')) - - # Login as user - browser.find_element(By.ID, 'username').send_keys(username) - browser.find_element(By.ID, 'password').send_keys(password) - browser.find_element(By.NAME, 'f').submit() - - # Wait for Profile to load - wait.until(presence_of_element_located((By.XPATH, "//h2[text()='Your profile']")), - 'Timeout waiting for Profile') - - # Test admin attributes - attributes = browser.find_elements(By.XPATH, "//table[@class='my-attributes']/*/*/*") - # for a in attributes: - # print(f"a.text: {a.text}") - assert (name in [a.text for a in attributes]), "No valid admin profile found" - print("= OK =======", file=sys.stderr) - browser.quit() - - print("OK") - print("============", file=sys.stderr) - exit(0) - -except Exception as e: - # url = browser.current_url - # print(f"url: {url}") - - tr = traceback.extract_tb(e.__traceback__)[0] - print(f"error {type(e).__name__} on line {tr.lineno} of '{tr.filename}'") - browser.quit() - - print("", end="", flush=True) - exit(1) diff --git a/sram_monitoring_test.py b/sram_monitoring_test.py deleted file mode 100755 index 444535d..0000000 --- a/sram_monitoring_test.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python - -from selenium.webdriver import Remote, ChromeOptions, FirefoxOptions -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.support.expected_conditions import (staleness_of, presence_of_element_located, - title_contains, url_contains) -from selenium.webdriver.common.by import By - -import sys -import yaml -import json - -if len(sys.argv) < 3: - sys.exit(sys.argv[0] + " ") - -print(f"= READING {sys.argv[1:]} ====", file=sys.stderr) -with open(sys.argv[1], 'r') as f: - try: - config = yaml.load(f, Loader=yaml.FullLoader) - except yaml.YAMLError as exc: - print(exc) - - -KEY = 'sram_monitoring' -config = config[KEY] - -browser = sys.argv[2] -print(f"= Starting Browser {browser} ===", file=sys.stderr) -if browser == "chrome": - options = ChromeOptions() -elif browser == "firefox": - options = FirefoxOptions() -else: - print('Bad Browser') - exit - -options.add_argument('--headless') - - -def test_user(start, user, userinfo): - browser = Remote("http://127.0.0.1:4444/wd/hub", options=options) - browser.implicitly_wait(2) - wait = WebDriverWait(browser, timeout=2) - - print("============", file=sys.stderr) - print(f"user: {user}", file=sys.stderr) - print(f"userinfo: {userinfo}", file=sys.stderr) - - try: - # Start browser on RP - browser.get(start) - - # Wait for discovery to load - wait.until(title_contains('SURF Research Access Management'), - 'Timeout waiting for discovery') - - # Choose Monitoring IdP - try: - xpath = "//div[@class='primary' and text()='SRAM Monitoring IdP']" - monitor = browser.find_element(By.XPATH, xpath) - except Exception: - search = browser.find_element(By.ID, 'searchinput') - search.send_keys('monitoring') - xpath = "//div[@class='text-truncate label primary' and text()='SRAM Monitoring IdP']" - monitor = browser.find_element(By.XPATH, xpath) - - monitor.click() - - wait.until(url_contains('test-idp.sram.surf.nl')) - - # Login as user - browser.find_element(By.ID, 'username').send_keys(user['name']) - browser.find_element(By.ID, 'password').send_keys(user['password']) - browser.find_element(By.NAME, 'f').submit() - - # Wait for user profile to appear - wait.until(presence_of_element_located((By.ID, "data")), 'Timeout waiting for user userinfo') - - # Test userinfo - data_element = browser.find_elements(By.ID, "data")[0].text - data = json.loads(data_element) - for key, value in userinfo.items(): - if isinstance(value, list): - for item in value: - # print(f"Testing {key}: {item}") - assert (item in data.get(key)), f"{user['name']}, {key}: {item} not found" - else: - # print(f"Testing {key}: {value}") - assert (value in data.get(key)), f"{user['name']}, {key}: {value} not found" - - except Exception as e: - # print the type of exception and the message, but not the stacktrace - print(f"Exception: {type(e).__name__}: {e}", file=sys.stderr) - - print(f"Last page encountered: {browser.current_url}", file=sys.stderr) - print(f"FAILED on user={user['name']} page={start}", file=sys.stderr) - print(f"FAILED on user={user['name']} page={start}") - # page = browser.page_source - # print("page: {}".format(page)) - browser.quit() - - # exit without error, so that the next tests will still run - exit(0) - - print("= OK =======", file=sys.stderr) - browser.quit() - - -user = {} -for startpage, accounts in config.items(): - # print(f"start: {startpage}") - for account, userinfo in accounts.items(): - (username, password) = account.split('.') - user['name'] = username - user['password'] = password - test_user(startpage, user, userinfo) - -print('OK')