├── aries-mobile-tests ├── __init__.py ├── allure │ ├── projects │ │ ├── .gitkeep │ │ └── default │ │ │ ├── reports │ │ │ ├── 1 │ │ │ │ ├── data │ │ │ │ │ ├── suites.csv │ │ │ │ │ ├── behaviors.csv │ │ │ │ │ ├── categories.csv │ │ │ │ │ ├── packages.json │ │ │ │ │ ├── suites.json │ │ │ │ │ ├── timeline.json │ │ │ │ │ ├── behaviors.json │ │ │ │ │ └── categories.json │ │ │ │ ├── history │ │ │ │ │ ├── history.json │ │ │ │ │ ├── duration-trend.json │ │ │ │ │ ├── categories-trend.json │ │ │ │ │ ├── retry-trend.json │ │ │ │ │ └── history-trend.json │ │ │ │ ├── widgets │ │ │ │ │ ├── duration.json │ │ │ │ │ ├── launch.json │ │ │ │ │ ├── severity.json │ │ │ │ │ ├── environment.json │ │ │ │ │ ├── status-chart.json │ │ │ │ │ ├── suites.json │ │ │ │ │ ├── behaviors.json │ │ │ │ │ ├── categories.json │ │ │ │ │ ├── duration-trend.json │ │ │ │ │ ├── categories-trend.json │ │ │ │ │ ├── executors.json │ │ │ │ │ ├── retry-trend.json │ │ │ │ │ ├── summary.json │ │ │ │ │ └── history-trend.json │ │ │ │ ├── favicon.ico │ │ │ │ ├── export │ │ │ │ │ ├── mail.html │ │ │ │ │ ├── prometheusData.txt │ │ │ │ │ └── influxDbData.txt │ │ │ │ ├── plugins │ │ │ │ │ ├── screen-diff │ │ │ │ │ │ └── styles.css │ │ │ │ │ └── packages │ │ │ │ │ │ └── index.js │ │ │ │ └── index.html │ │ │ ├── 2 │ │ │ │ ├── data │ │ │ │ │ ├── suites.csv │ │ │ │ │ ├── behaviors.csv │ │ │ │ │ ├── categories.csv │ │ │ │ │ ├── packages.json │ │ │ │ │ ├── suites.json │ │ │ │ │ ├── timeline.json │ │ │ │ │ ├── behaviors.json │ │ │ │ │ └── categories.json │ │ │ │ ├── history │ │ │ │ │ ├── history.json │ │ │ │ │ ├── categories-trend.json │ │ │ │ │ ├── duration-trend.json │ │ │ │ │ ├── retry-trend.json │ │ │ │ │ └── history-trend.json │ │ │ │ ├── widgets │ │ │ │ │ ├── duration.json │ │ │ │ │ ├── launch.json │ │ │ │ │ ├── severity.json │ │ │ │ │ ├── environment.json │ │ │ │ │ ├── status-chart.json │ │ │ │ │ ├── suites.json │ │ │ │ │ ├── behaviors.json │ │ │ │ │ ├── categories.json │ │ │ │ │ ├── executors.json │ │ │ │ │ ├── summary.json │ │ │ │ │ ├── categories-trend.json │ │ │ │ │ ├── duration-trend.json │ │ │ │ │ ├── retry-trend.json │ │ │ │ │ └── history-trend.json │ │ │ │ ├── favicon.ico │ │ │ │ ├── export │ │ │ │ │ ├── mail.html │ │ │ │ │ ├── prometheusData.txt │ │ │ │ │ └── influxDbData.txt │ │ │ │ ├── plugins │ │ │ │ │ ├── screen-diff │ │ │ │ │ │ └── styles.css │ │ │ │ │ └── packages │ │ │ │ │ │ └── index.js │ │ │ │ └── index.html │ │ │ ├── 3 │ │ │ │ ├── data │ │ │ │ │ ├── suites.csv │ │ │ │ │ ├── behaviors.csv │ │ │ │ │ ├── categories.csv │ │ │ │ │ ├── packages.json │ │ │ │ │ ├── suites.json │ │ │ │ │ ├── timeline.json │ │ │ │ │ ├── behaviors.json │ │ │ │ │ └── categories.json │ │ │ │ ├── history │ │ │ │ │ ├── history.json │ │ │ │ │ ├── duration-trend.json │ │ │ │ │ ├── categories-trend.json │ │ │ │ │ ├── retry-trend.json │ │ │ │ │ └── history-trend.json │ │ │ │ ├── widgets │ │ │ │ │ ├── duration.json │ │ │ │ │ ├── launch.json │ │ │ │ │ ├── severity.json │ │ │ │ │ ├── environment.json │ │ │ │ │ ├── status-chart.json │ │ │ │ │ ├── suites.json │ │ │ │ │ ├── behaviors.json │ │ │ │ │ ├── categories.json │ │ │ │ │ ├── executors.json │ │ │ │ │ ├── summary.json │ │ │ │ │ ├── duration-trend.json │ │ │ │ │ ├── categories-trend.json │ │ │ │ │ ├── retry-trend.json │ │ │ │ │ └── history-trend.json │ │ │ │ ├── favicon.ico │ │ │ │ ├── export │ │ │ │ │ ├── mail.html │ │ │ │ │ ├── prometheusData.txt │ │ │ │ │ └── influxDbData.txt │ │ │ │ ├── plugins │ │ │ │ │ ├── screen-diff │ │ │ │ │ │ └── styles.css │ │ │ │ │ └── packages │ │ │ │ │ │ └── index.js │ │ │ │ └── index.html │ │ │ └── latest │ │ │ │ ├── data │ │ │ │ ├── suites.csv │ │ │ │ ├── behaviors.csv │ │ │ │ ├── categories.csv │ │ │ │ ├── packages.json │ │ │ │ ├── suites.json │ │ │ │ ├── timeline.json │ │ │ │ ├── behaviors.json │ │ │ │ └── categories.json │ │ │ │ ├── history │ │ │ │ ├── history.json │ │ │ │ ├── duration-trend.json │ │ │ │ ├── categories-trend.json │ │ │ │ ├── retry-trend.json │ │ │ │ └── history-trend.json │ │ │ │ ├── widgets │ │ │ │ ├── duration.json │ │ │ │ ├── launch.json │ │ │ │ ├── severity.json │ │ │ │ ├── environment.json │ │ │ │ ├── status-chart.json │ │ │ │ ├── suites.json │ │ │ │ ├── behaviors.json │ │ │ │ ├── categories.json │ │ │ │ ├── executors.json │ │ │ │ ├── summary.json │ │ │ │ ├── duration-trend.json │ │ │ │ ├── categories-trend.json │ │ │ │ ├── retry-trend.json │ │ │ │ └── history-trend.json │ │ │ │ ├── favicon.ico │ │ │ │ ├── export │ │ │ │ ├── mail.html │ │ │ │ ├── prometheusData.txt │ │ │ │ └── influxDbData.txt │ │ │ │ ├── plugins │ │ │ │ ├── screen-diff │ │ │ │ │ └── styles.css │ │ │ │ └── packages │ │ │ │ │ └── index.js │ │ │ │ └── index.html │ │ │ └── results │ │ │ ├── history │ │ │ ├── history.json │ │ │ ├── duration-trend.json │ │ │ ├── categories-trend.json │ │ │ ├── retry-trend.json │ │ │ └── history-trend.json │ │ │ └── executor.json │ ├── allure-results │ │ └── .gitkeep │ ├── docker-compose.yml │ └── cookiesFile ├── pageobjects │ ├── __init__.py │ ├── bc_wallet │ │ ├── holder_get_invite_interface │ │ │ ├── __init__.py │ │ │ └── pageobjects │ │ │ │ ├── connect_with_issuer_page.py │ │ │ │ ├── bc_vc_invitation_request_credential_page.py │ │ │ │ ├── bc_vc_invitation_agree_page.py │ │ │ │ └── bc_vc_invitation_review_page.py │ │ ├── issuer_get_authcode_interface │ │ │ └── __init__.py │ │ ├── no_internet_toast_notification.py │ │ ├── biometrics.py │ │ ├── sending_information_securely.py │ │ ├── toast_notification.py │ │ ├── credential_added.py │ │ ├── bc_services_card_credential_issued.py │ │ ├── information_approved.py │ │ ├── proof_request_declined.py │ │ ├── create_bc_digital_id.py │ │ ├── why_you_need_a_pin.py │ │ ├── contact_details.py │ │ ├── pin.py │ │ ├── pin_explainer.py │ │ ├── bc_services_card_login_vt_pc.py │ │ ├── information_sent_successfully.py │ │ ├── contact_remove_from_wallet.py │ │ ├── feedback.py │ │ ├── proof_request_details.py │ │ ├── bc_services_card_review.py │ │ ├── bc_services_card_login_vt_csn.py │ │ ├── decline_credential_offer.py │ │ ├── get_person_credential.py │ │ ├── scan.py │ │ ├── are_you_sure_decline_proof_request.py │ │ ├── bc_services_card_login.py │ │ ├── onboarding_biometrics.py │ │ ├── contacts.py │ │ ├── welcome_to_bc_wallet.py │ │ ├── onboarding_a_different_smart_wallet.py │ │ ├── onboarding_private_confidential.py │ │ ├── bc_services_card_login_unpw.py │ │ ├── termsandconditions.py │ │ ├── allownotifications.py │ │ ├── navbar.py │ │ ├── secure.py │ │ ├── onboarding_digital_credentials.py │ │ ├── onboarding_is_this_app_for_you.py │ │ └── connecting.py │ └── bifold │ │ ├── contacts.py │ │ ├── pin.py │ │ └── pinsetup.py ├── agent_factory │ ├── __init__.py │ ├── bc_vp │ │ ├── __init__.py │ │ └── pageobjects │ │ │ ├── authcode_page.py │ │ │ ├── authenticate_page.py │ │ │ └── authenticate_with_page.py │ ├── candy_uvp │ │ ├── __init__.py │ │ └── pageobjects │ │ │ ├── issuing_credential_page.py │ │ │ ├── review_and_confirm_page.py │ │ │ ├── connect_with_issuer_page.py │ │ │ └── terms_of_service_page.py │ ├── verifier_agent_interface.py │ ├── bc_showcase │ │ └── pageobjects │ │ │ ├── lets_get_started_page.py │ │ │ ├── book_a_study_room_page.py │ │ │ ├── install_bc_wallet_page.py │ │ │ ├── youre_all_set_page.py │ │ │ ├── getting_a_student_discount_page.py │ │ │ ├── bc_wallet_showcase_main_page.py │ │ │ ├── connect_with_best_bc_college_page.py │ │ │ ├── using_your_credentials_page.py │ │ │ └── start_booking_the_room_page.py │ ├── issuer_agent_interface.py │ └── traction │ │ └── traction_verifier_agent_interface.py ├── .dockerignore ├── features │ ├── data │ │ ├── schema_sauce_labs_test.json │ │ ├── cred_data_sauce_labs_test.json │ │ ├── schema_photo_id.json │ │ ├── schema_drivers_license.json │ │ ├── schema_drivers_license_😀.json │ │ ├── schema_photo_id_revokable.json │ │ ├── proof_photo_id_revokable_self_attested.json │ │ ├── proof_photo_id_revokable_no_schema_restriction.json │ │ ├── multi_cred_proof.json │ │ ├── proof_photo_id.json │ │ ├── cred_data_unverified_person.json │ │ ├── proof_drivers_license.json │ │ ├── proof_photo_id_revokable_no_schema_restriction_predicates.json │ │ ├── proof_photo_id_revokable.json │ │ ├── proof_drivers_license_sp_char.json │ │ ├── pcft_connectionless_proof.json │ │ ├── cred_data_drivers_license.json │ │ └── cred_data_drivers_license_sp_char.json │ ├── bifold │ │ └── bifold_connect.feature │ ├── steps │ │ ├── all_steps.py │ │ └── bc_wallet │ │ │ └── give_feedback.py │ └── bc_wallet │ │ ├── give_feedback.feature │ │ ├── change_language.feature │ │ └── terms.feature ├── requirements.txt ├── results │ └── environment.properties ├── local_android_config.json ├── behave.ini ├── sl_bifold_android_config.json ├── sl_wikipedia_config.json ├── sl_config.json ├── bs_config.json ├── device_service_handler │ ├── device_service_map.py │ └── device_service_handler_factory.py ├── lt_ios_config.json ├── lt_android_config.json ├── config.json ├── sl_android_config.json ├── sl_ios_config.json ├── Dockerfile.harness ├── local_ios_config.json └── Dockerfile.dev-harness ├── aries-mobile-automation.code-workspace ├── docs └── assets │ ├── amth-arch │ └── amth-arch.png │ └── agent_abstraction_layer_arch │ └── AgentInterfaceAbstraction.png ├── .env.example ├── COMPLIANCE.yaml ├── .gitignore ├── config.json ├── .github ├── dependabot.yml └── workflows │ └── run-send-gen-test-results-secure │ └── action.yml ├── runTest.sh ├── .vscode └── tasks.json ├── CONTRIBUTING └── CODE_OF_CONDUCT.md /aries-mobile-tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_vp/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/allure-results/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/candy_uvp/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/suites.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/suites.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/suites.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/behaviors.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/categories.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/behaviors.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/categories.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/behaviors.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/categories.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/suites.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/history/history.json: -------------------------------------------------------------------------------- 1 | { } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/duration.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/launch.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/severity.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/history/history.json: -------------------------------------------------------------------------------- 1 | { } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/duration.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/launch.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/severity.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/history/history.json: -------------------------------------------------------------------------------- 1 | { } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/duration.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/launch.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/severity.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/behaviors.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/categories.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/results/history/history.json: -------------------------------------------------------------------------------- 1 | { } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/environment.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/status-chart.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/environment.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/status-chart.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/environment.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/status-chart.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/history/history.json: -------------------------------------------------------------------------------- 1 | { } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/duration.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/launch.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/severity.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/holder_get_invite_interface/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/issuer_get_authcode_interface/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/environment.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/status-chart.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/favicon.ico: -------------------------------------------------------------------------------- 1 | module.exports = __webpack_public_path__ + "favicon.ico"; -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/favicon.ico: -------------------------------------------------------------------------------- 1 | module.exports = __webpack_public_path__ + "favicon.ico"; -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/favicon.ico: -------------------------------------------------------------------------------- 1 | module.exports = __webpack_public_path__ + "favicon.ico"; -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-automation.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": {} 8 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/favicon.ico: -------------------------------------------------------------------------------- 1 | module.exports = __webpack_public_path__ + "favicon.ico"; -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /docs/assets/amth-arch/amth-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwallet-foundation/owl-mobile-wallet-test-harness/HEAD/docs/assets/amth-arch/amth-arch.png -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/packages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 3 | "name" : "packages", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "98d3104e051c652961429bf95fa0b5d6", 3 | "name" : "suites", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/timeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc", 3 | "name" : "timeline", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/packages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 3 | "name" : "packages", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "98d3104e051c652961429bf95fa0b5d6", 3 | "name" : "suites", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/timeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc", 3 | "name" : "timeline", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/packages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 3 | "name" : "packages", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "98d3104e051c652961429bf95fa0b5d6", 3 | "name" : "suites", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/timeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc", 3 | "name" : "timeline", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "b1a8273437954620fa374b796ffaacdd", 3 | "name" : "behaviors", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/data/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "4b4757e66a1912dae1a509f688f20b0f", 3 | "name" : "categories", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "b1a8273437954620fa374b796ffaacdd", 3 | "name" : "behaviors", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/data/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "4b4757e66a1912dae1a509f688f20b0f", 3 | "name" : "categories", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "b1a8273437954620fa374b796ffaacdd", 3 | "name" : "behaviors", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/data/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "4b4757e66a1912dae1a509f688f20b0f", 3 | "name" : "categories", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/packages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 3 | "name" : "packages", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "98d3104e051c652961429bf95fa0b5d6", 3 | "name" : "suites", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/timeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc", 3 | "name" : "timeline", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | node_modules 4 | npm-debug.log 5 | Dockerfile* 6 | docker-compose* 7 | README.md 8 | LICENSE 9 | .vscode 10 | __pycache__ -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "b1a8273437954620fa374b796ffaacdd", 3 | "name" : "behaviors", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/data/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "4b4757e66a1912dae1a509f688f20b0f", 3 | "name" : "categories", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/schema_sauce_labs_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name": "sauce_labs_test", 3 | "schema_version": "1.0.0", 4 | "attributes": [ 5 | "first_name", 6 | "last_name" 7 | ] 8 | } -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | ### Sauce Labs keys 2 | SAUCE_USERNAME='oauth-username-0a0b0c' 3 | SAUCE_ACCESS_KEY='' 4 | 5 | ### Traction API Keys, required if using the Traction agent 6 | TRACTION_TENANT_ID='' 7 | TRACTION_API_KEY='' -------------------------------------------------------------------------------- /docs/assets/agent_abstraction_layer_arch/AgentInterfaceAbstraction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openwallet-foundation/owl-mobile-wallet-test-harness/HEAD/docs/assets/agent_abstraction_layer_arch/AgentInterfaceAbstraction.png -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "data" : { } 8 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "data" : { } 8 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "data" : { } 8 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "data" : { } 8 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/results/executor.json: -------------------------------------------------------------------------------- 1 | { "reportName": "default", "buildName": "default #3", "buildOrder": "3", "name": "Automatic Execution", "reportUrl": "../3/index.html", "buildUrl": "", "type": "another" } 2 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/export/mail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report summary mail 6 | 7 | 8 | Mail body 9 | 10 | 11 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/export/mail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report summary mail 6 | 7 | 8 | Mail body 9 | 10 | 11 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/export/mail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report summary mail 6 | 7 | 8 | Mail body 9 | 10 | 11 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/export/mail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report summary mail 6 | 7 | 8 | Mail body 9 | 10 | 11 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/executors.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "name" : "Automatic Execution", 3 | "type" : "another", 4 | "buildOrder" : 1, 5 | "buildName" : "default #1", 6 | "buildUrl" : "", 7 | "reportName" : "default", 8 | "reportUrl" : "../1/index.html" 9 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/executors.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "name" : "Automatic Execution", 3 | "type" : "another", 4 | "buildOrder" : 2, 5 | "buildName" : "default #2", 6 | "buildUrl" : "", 7 | "reportName" : "default", 8 | "reportUrl" : "../2/index.html" 9 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/executors.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "name" : "Automatic Execution", 3 | "type" : "another", 4 | "buildOrder" : 3, 5 | "buildName" : "default #3", 6 | "buildUrl" : "", 7 | "reportName" : "default", 8 | "reportUrl" : "../3/index.html" 9 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/executors.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "name" : "Automatic Execution", 3 | "type" : "another", 4 | "buildOrder" : 3, 5 | "buildName" : "default #3", 6 | "buildUrl" : "", 7 | "reportName" : "default", 8 | "reportUrl" : "../3/index.html" 9 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/requirements.txt: -------------------------------------------------------------------------------- 1 | behave 2 | allure-behave 3 | SauceClient 4 | paver==1.3.4 5 | selenium==4.25.0 6 | psutil==5.7.2 7 | Appium-Python-Client==3.2.1 8 | qrcode[pil]~=6.1 9 | webdriver-manager 10 | google-api-python-client 11 | google-auth-httplib2 12 | google-auth-oauthlib 13 | aiohttp 14 | -------------------------------------------------------------------------------- /aries-mobile-tests/results/environment.properties: -------------------------------------------------------------------------------- 1 | role.acme=acapy-agent-backchannel 2 | acme.agent.version=0.5.6 3 | role.bob=acapy-agent-backchannel 4 | bob.agent.version=0.5.6 5 | role.faber=acapy-agent-backchannel 6 | faber.agent.version=0.5.6 7 | role.mallory=acapy-agent-backchannel 8 | mallory.agent.version=0.5.6 9 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "data" : { 11 | "run" : 0, 12 | "retry" : 0 13 | } 14 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "data" : { 11 | "run" : 0, 12 | "retry" : 0 13 | } 14 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "reportName" : "Allure Report", 3 | "testRuns" : [ ], 4 | "statistic" : { 5 | "failed" : 0, 6 | "broken" : 0, 7 | "skipped" : 0, 8 | "passed" : 0, 9 | "unknown" : 0, 10 | "total" : 0 11 | }, 12 | "time" : { } 13 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "reportName" : "Allure Report", 3 | "testRuns" : [ ], 4 | "statistic" : { 5 | "failed" : 0, 6 | "broken" : 0, 7 | "skipped" : 0, 8 | "passed" : 0, 9 | "unknown" : 0, 10 | "total" : 0 11 | }, 12 | "time" : { } 13 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "reportName" : "Allure Report", 3 | "testRuns" : [ ], 4 | "statistic" : { 5 | "failed" : 0, 6 | "broken" : 0, 7 | "skipped" : 0, 8 | "passed" : 0, 9 | "unknown" : 0, 10 | "total" : 0 11 | }, 12 | "time" : { } 13 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "reportName" : "Allure Report", 3 | "testRuns" : [ ], 4 | "statistic" : { 5 | "failed" : 0, 6 | "broken" : 0, 7 | "skipped" : 0, 8 | "passed" : 0, 9 | "unknown" : 0, 10 | "total" : 0 11 | }, 12 | "time" : { } 13 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/cred_data_sauce_labs_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name": "sauce_labs_test", 3 | "schema_version": "1.0.0", 4 | "attributes": [ 5 | { 6 | "name": "first_name", 7 | "value": "John" 8 | }, 9 | { 10 | "name": "last_name", 11 | "value": "Smith" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /COMPLIANCE.yaml: -------------------------------------------------------------------------------- 1 | name: compliance 2 | description: | 3 | This document is used to track a projects PIA and STRA 4 | compliance. 5 | spec: 6 | - name: PIA 7 | status: PIA_STATUS_HERE 8 | last-updated: '2021-11-08T21:25:44.615Z' 9 | - name: STRA 10 | status: STRA_STATUS_HERE 11 | last-updated: '2021-11-08T21:25:44.615Z' 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .env 3 | .logs 4 | .build 5 | *.log 6 | all_steps.py 7 | aries-mobile-tests/features/steps/all_steps.py 8 | aries-mobile-tests/allure/allure-results/environment.properties 9 | aries-mobile-tests/allure/cookiesFile 10 | aries-mobile-tests/config.json 11 | aries-mobile-tests/json.pretty.output 12 | aries-mobile-tests/qrcode_test.png -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/results/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 1, 8 | "reportUrl" : "../1/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "data" : { } 13 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 1, 8 | "reportUrl" : "../1/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "data" : { } 13 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 1, 8 | "reportUrl" : "../1/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "data" : { } 13 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 1, 8 | "reportUrl" : "../1/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "data" : { } 13 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 1, 8 | "reportUrl" : "../1/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "data" : { } 13 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/results/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 1, 8 | "reportUrl" : "../1/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "data" : { } 13 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/local_android_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "platformName": "Android", 4 | "app": "/bc-wallet/app/app-release1735.apk", 5 | "autoGrantPermissions": true, 6 | "automationName": "UiAutomator2", 7 | "udid": "emulator-5554", 8 | "remoteAdbHost": "host.docker.internal", 9 | "newCommandTimeout": 480 10 | } 11 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/schema_photo_id.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name":"photo_id", 3 | "schema_version":"1.0.0", 4 | "attributes":[ 5 | "name", 6 | "civic_address", 7 | "city", 8 | "province", 9 | "country", 10 | "postal_code", 11 | "birth_dateint", 12 | "photo", 13 | "issue_date", 14 | "expiry_date" 15 | ] 16 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/export/prometheusData.txt: -------------------------------------------------------------------------------- 1 | launch_status_failed 0 2 | launch_status_broken 0 3 | launch_status_passed 0 4 | launch_status_skipped 0 5 | launch_status_unknown 0 6 | launch_time_duration 0 7 | launch_time_min_duration 0 8 | launch_time_max_duration 0 9 | launch_time_sum_duration 0 10 | launch_retries_retries 0 11 | launch_retries_run 0 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/export/prometheusData.txt: -------------------------------------------------------------------------------- 1 | launch_status_failed 0 2 | launch_status_broken 0 3 | launch_status_passed 0 4 | launch_status_skipped 0 5 | launch_status_unknown 0 6 | launch_time_duration 0 7 | launch_time_min_duration 0 8 | launch_time_max_duration 0 9 | launch_time_sum_duration 0 10 | launch_retries_retries 0 11 | launch_retries_run 0 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/export/prometheusData.txt: -------------------------------------------------------------------------------- 1 | launch_status_failed 0 2 | launch_status_broken 0 3 | launch_status_passed 0 4 | launch_status_skipped 0 5 | launch_status_unknown 0 6 | launch_time_duration 0 7 | launch_time_min_duration 0 8 | launch_time_max_duration 0 9 | launch_time_sum_duration 0 10 | launch_retries_retries 0 11 | launch_retries_run 0 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/export/prometheusData.txt: -------------------------------------------------------------------------------- 1 | launch_status_failed 0 2 | launch_status_broken 0 3 | launch_status_passed 0 4 | launch_status_skipped 0 5 | launch_status_unknown 0 6 | launch_time_duration 0 7 | launch_time_min_duration 0 8 | launch_time_max_duration 0 9 | launch_time_sum_duration 0 10 | launch_retries_retries 0 11 | launch_retries_run 0 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/schema_drivers_license.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name":"drivers_license", 3 | "schema_version":"1.0.0", 4 | "attributes":[ 5 | "name", 6 | "civic_address", 7 | "city", 8 | "province", 9 | "country", 10 | "postal_code", 11 | "birth_dateint", 12 | "id", 13 | "issue_date", 14 | "expiry_date" 15 | ] 16 | } -------------------------------------------------------------------------------- /aries-mobile-tests/behave.ini: -------------------------------------------------------------------------------- 1 | # -- FILE: behave.ini 2 | [behave] 3 | #include_re=0160-connection.feature 4 | #include_re=0011-0183-revocation.feature 5 | format=json.pretty 6 | no_skipped=true 7 | stderr_capture=false 8 | stdout_capture=false 9 | #logging_level = INFO 10 | 11 | [behave.userdata] 12 | print_page_source_on_failure=False 13 | print_qr_code_on_creation=False 14 | save_qr_code_on_creation=False 15 | test_retry_attempts=1 -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/schema_drivers_license_😀.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name":"drivers_license_😀", 3 | "schema_version":"1.0.0", 4 | "attributes":[ 5 | "name_😀", 6 | "civic_address_!@#", 7 | "city_$%^", 8 | "province_&*(", 9 | ")_+_country", 10 | "~!@_postal_code", 11 | "#$%_birth_dateint", 12 | "^&*_id", 13 | "issue_()_date", 14 | "expiry_/0_date" 15 | ] 16 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/schema_photo_id_revokable.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name":"photo_id_revokable", 3 | "schema_version":"1.0.0", 4 | "attributes":[ 5 | "name", 6 | "civic_address", 7 | "city", 8 | "province", 9 | "country", 10 | "postal_code", 11 | "birth_dateint", 12 | "photo", 13 | "issue_date", 14 | "expiry_date" 15 | ], 16 | "support_revocation":true 17 | } -------------------------------------------------------------------------------- /aries-mobile-tests/sl_bifold_android_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "project": "Bifold Behave Project", 4 | "build": "build-1", 5 | "platformName": "Android", 6 | "appium:app":"storage:filename=app-release.apk", 7 | "appium:deviceName":"Samsung Galaxy S9", 8 | "appium:platformVersion":"10.0", 9 | "sauce:options":{ 10 | "appiumVersion":"1.20.2" 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/bifold/bifold_connect.feature: -------------------------------------------------------------------------------- 1 | @Connect @bifold 2 | Feature: Connect to an Issuer 3 | 4 | @T001-Connect 5 | Scenario: Connect to an Issuer based on a QR code 6 | Given the terms of service has been accepted 7 | And a PIN has been set up 8 | When the wallet user scans the QR code sent by the issuer 9 | And accepts the connection 10 | Then there is a connection between Issuer and wallet user 11 | -------------------------------------------------------------------------------- /aries-mobile-tests/sl_wikipedia_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "project": "Sample Behave Project", 4 | "build": "build-1", 5 | "platformName": "Android", 6 | "appium:app":"storage:filename=WikipediaSample.apk", 7 | "appium:deviceName":"Samsung Galaxy S9", 8 | "appium:platformVersion":"10.0", 9 | "sauce:options":{ 10 | "appiumVersion":"1.20.2" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /aries-mobile-tests/sl_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "project": "Bifold Behave Project", 4 | "build": "bifold-build-1", 5 | "platformName": "iOS", 6 | "appium:app":"storage:filename=AriesBifold.zip", 7 | "appium:deviceName":"iPhone SE (2nd generation) Simulator", 8 | "appium:platformVersion":"14.5", 9 | "sauce:options":{ 10 | "appiumVersion":"1.21.0" 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_photo_id_revokable_self_attested.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "photo_attrs": { 4 | "name": "photo" 5 | } 6 | }, 7 | "requested_predicates": { 8 | "age": { 9 | "name": "birth_dateint", 10 | "p_type": ">", 11 | "p_value": 19420116 12 | } 13 | }, 14 | "version": "0.1.0", 15 | "name": "Sauce labs revokable photo proof id", 16 | "nonce": "1234567890" 17 | } -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "project": "Bifold Behave Project", 4 | "build": "build-1", 5 | "platformName": "Android", 6 | "app": "storage:filename=app-release.apk", 7 | "deviceName": "Samsung_Galaxy_S9_real_us", 8 | "platformVersion": "10.0", 9 | "appiumVersion": "1.22.1", 10 | "sauceLabsImageInjectionEnabled": true, 11 | "autoGrantPermissions": true, 12 | "appium:platformName": "storage:filename=${APP_NAME}" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { } 6 | }, { 7 | "buildOrder" : 2, 8 | "reportUrl" : "../2/index.html", 9 | "reportName" : "default", 10 | "data" : { } 11 | }, { 12 | "buildOrder" : 1, 13 | "reportUrl" : "../1/index.html", 14 | "reportName" : "default", 15 | "data" : { } 16 | }, { 17 | "data" : { } 18 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/results/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 1, 11 | "reportUrl" : "../1/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "data" : { 19 | "run" : 0, 20 | "retry" : 0 21 | } 22 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 1, 11 | "reportUrl" : "../1/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "data" : { 19 | "run" : 0, 20 | "retry" : 0 21 | } 22 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 1, 11 | "reportUrl" : "../1/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "data" : { 19 | "run" : 0, 20 | "retry" : 0 21 | } 22 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/bs_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "browserstack.user" : "sheldon11", 4 | "browserstack.key" : "FUxuxakn4P6dgeBbv9C4", 5 | "project": "Bifold Behave Android Project", 6 | "build": "bifold-build-1", 7 | "name": "bifold_sample_test", 8 | "browserstack.debug": true, 9 | "app": "bs://e1aad69246cb74c89bbd463a3eeed9bfbe140ee0", 10 | "device": "Google Pixel 3", 11 | "os_version": "9.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "data" : { 15 | "failed" : 0, 16 | "broken" : 0, 17 | "skipped" : 0, 18 | "passed" : 0, 19 | "unknown" : 0, 20 | "total" : 0 21 | } 22 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/widgets/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 1, 3 | "reportUrl" : "../1/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "data" : { 15 | "failed" : 0, 16 | "broken" : 0, 17 | "skipped" : 0, 18 | "passed" : 0, 19 | "unknown" : 0, 20 | "total" : 0 21 | } 22 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/no_internet_toast_notification.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.bc_wallet.toast_notification import ToastNotification 3 | 4 | class NoInternetConnectionToastNotification(ToastNotification): 5 | """No Internet Connection toast notification page object""" 6 | 7 | # Locators 8 | on_this_page_text_locator = "No internet connection" 9 | notification_locator = (AppiumBy.ID, "com.ariesbifold:id/ToastTitle") 10 | 11 | 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/device_service_handler/device_service_map.py: -------------------------------------------------------------------------------- 1 | """ 2 | Mapping of device service names to thier classes 3 | """ 4 | from device_service_handler.lambda_test_handler import LambdaTestHandler 5 | from device_service_handler.sauce_labs_handler import SauceLabsHandler 6 | from device_service_handler.local_android_handler import LocalAndroidHandler 7 | 8 | device_service_map_dict = { 9 | "SauceLabs": SauceLabsHandler, 10 | "LocalAndroid": LocalAndroidHandler, 11 | "LambdaTest": LambdaTestHandler 12 | } 13 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/steps/all_steps.py: -------------------------------------------------------------------------------- 1 | from steps.bc_wallet.bc_showcase import * 2 | from steps.bc_wallet.bcsc import * 3 | from steps.bc_wallet.connect import * 4 | from steps.bc_wallet.credential_offer import * 5 | from steps.bc_wallet.give_feedback import * 6 | from steps.bc_wallet.offline_handling import * 7 | from steps.bc_wallet.onboarding import * 8 | from steps.bc_wallet.proof import * 9 | from steps.bc_wallet.security import * 10 | from steps.bc_wallet.terms import * 11 | from steps.bc_wallet.wallet_naming import * 12 | 13 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # For details on how this file works refer to: 2 | # - https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 3 | version: 2 4 | updates: 5 | # Maintain dependencies for GitHub Actions 6 | # - Check for updates once a week 7 | # - Group all updates into a single PR 8 | - package-ecosystem: github-actions 9 | directory: / 10 | schedule: 11 | interval: weekly 12 | groups: 13 | all-actions: 14 | patterns: [ "*" ] -------------------------------------------------------------------------------- /aries-mobile-tests/lt_ios_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "lt:options": { 4 | "w3c": true, 5 | "deviceName": "iPhone.*", 6 | "platformName": "iOS", 7 | "build": "QCWallet-XXX", 8 | "name": "Sample Test iOS - Python", 9 | "app": "app_url_lt", 10 | "autoGrantPermissions": true, 11 | "enableImageInjection": true, 12 | "media": "lt://MEDIA14a54efe064642f9a9cf39ab5d189751", 13 | "isRealMobile": true, 14 | "visual": true, 15 | "video": true 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/biometrics.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pageobjects.basepage import BasePage 3 | 4 | class BiometricsPage(BasePage): 5 | """Biometrics enter page object""" 6 | 7 | # Locators 8 | on_this_page_text_locator = "Wallet Unlock" 9 | 10 | 11 | def on_this_page(self): 12 | #print(self.driver.page_source) 13 | timeout = 50 14 | if "Local" in os.environ['DEVICE_CLOUD']: 15 | timeout = 100 16 | return super().on_this_page(self.on_this_page_text_locator, timeout) 17 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/sending_information_securely.py: -------------------------------------------------------------------------------- 1 | from pageobjects.basepage import BasePage 2 | 3 | 4 | # These classes can inherit from a BasePage to do common setup and functions 5 | class SendingInformationSecurelyPage(BasePage): 6 | """Sending Proof Information Securely page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Sending the information securely" 10 | 11 | def on_this_page(self): 12 | #print(self.driver.page_source) 13 | return super().on_this_page(self.on_this_page_text_locator) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/plugins/screen-diff/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/plugins/screen-diff/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/plugins/screen-diff/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/plugins/screen-diff/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/export/influxDbData.txt: -------------------------------------------------------------------------------- 1 | launch_status failed=0 1608742821000000000 2 | launch_status broken=0 1608742821000000000 3 | launch_status passed=0 1608742821000000000 4 | launch_status skipped=0 1608742821000000000 5 | launch_status unknown=0 1608742821000000000 6 | launch_time duration=0 1608742821000000000 7 | launch_time min_duration=0 1608742821000000000 8 | launch_time max_duration=0 1608742821000000000 9 | launch_time sum_duration=0 1608742821000000000 10 | launch_retries retries=0 1608742821000000000 11 | launch_retries run=0 1608742821000000000 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/export/influxDbData.txt: -------------------------------------------------------------------------------- 1 | launch_status failed=0 1608752267000000000 2 | launch_status broken=0 1608752267000000000 3 | launch_status passed=0 1608752267000000000 4 | launch_status skipped=0 1608752267000000000 5 | launch_status unknown=0 1608752267000000000 6 | launch_time duration=0 1608752267000000000 7 | launch_time min_duration=0 1608752267000000000 8 | launch_time max_duration=0 1608752267000000000 9 | launch_time sum_duration=0 1608752267000000000 10 | launch_retries retries=0 1608752267000000000 11 | launch_retries run=0 1608752267000000000 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/export/influxDbData.txt: -------------------------------------------------------------------------------- 1 | launch_status failed=0 1608756802000000000 2 | launch_status broken=0 1608756802000000000 3 | launch_status passed=0 1608756802000000000 4 | launch_status skipped=0 1608756802000000000 5 | launch_status unknown=0 1608756802000000000 6 | launch_time duration=0 1608756802000000000 7 | launch_time min_duration=0 1608756802000000000 8 | launch_time max_duration=0 1608756802000000000 9 | launch_time sum_duration=0 1608756802000000000 10 | launch_retries retries=0 1608756802000000000 11 | launch_retries run=0 1608756802000000000 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/export/influxDbData.txt: -------------------------------------------------------------------------------- 1 | launch_status failed=0 1608756802000000000 2 | launch_status broken=0 1608756802000000000 3 | launch_status passed=0 1608756802000000000 4 | launch_status skipped=0 1608756802000000000 5 | launch_status unknown=0 1608756802000000000 6 | launch_time duration=0 1608756802000000000 7 | launch_time min_duration=0 1608756802000000000 8 | launch_time max_duration=0 1608756802000000000 9 | launch_time sum_duration=0 1608756802000000000 10 | launch_retries retries=0 1608756802000000000 11 | launch_retries run=0 1608756802000000000 12 | -------------------------------------------------------------------------------- /aries-mobile-tests/lt_android_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "lt:options": { 4 | "w3c": true, 5 | "deviceName": "Galaxy.*,Pixel.*,Nexus.*", 6 | "platformName": "Android", 7 | "platformVersion": "10", 8 | "build": "QCWallet-XXX", 9 | "name": "Sample Test Android - Python", 10 | "app": "lt://APP1016045801683122334603392", 11 | "autoGrantPermissions": true, 12 | "enableImageInjection": true, 13 | "media": "lt://MEDIA14a54efe064642f9a9cf39ab5d189751", 14 | "isRealMobile": true, 15 | "visual": true, 16 | "video": true 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /aries-mobile-tests/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "firstMatch": [ 4 | { 5 | "platformName": "iOS", 6 | "appium:options": { 7 | "app": "storage:filename=BCWallet-2230.ipa", 8 | "autoAcceptAlerts": true, 9 | "autoDismissAlerts": true, 10 | "automationName": "xcuitest", 11 | "platformVersion": "18|17.7|16.7|13.7|14.8|15.8" 12 | }, 13 | "sauce:options": { 14 | "appiumVersion": "latest", 15 | "sauceLabsImageInjectionEnabled": true, 16 | "sessionCreationRetry": "3" 17 | } 18 | } 19 | ] 20 | } 21 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 2, 11 | "reportUrl" : "../2/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "buildOrder" : 1, 19 | "reportUrl" : "../1/index.html", 20 | "reportName" : "default", 21 | "data" : { 22 | "run" : 0, 23 | "retry" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "run" : 0, 28 | "retry" : 0 29 | } 30 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 2, 11 | "reportUrl" : "../2/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "buildOrder" : 1, 19 | "reportUrl" : "../1/index.html", 20 | "reportName" : "default", 21 | "data" : { 22 | "run" : 0, 23 | "retry" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "run" : 0, 28 | "retry" : 0 29 | } 30 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 2, 11 | "reportUrl" : "../2/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "buildOrder" : 1, 19 | "reportUrl" : "../1/index.html", 20 | "reportName" : "default", 21 | "data" : { 22 | "run" : 0, 23 | "retry" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "run" : 0, 28 | "retry" : 0 29 | } 30 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "run" : 0, 7 | "retry" : 0 8 | } 9 | }, { 10 | "buildOrder" : 2, 11 | "reportUrl" : "../2/index.html", 12 | "reportName" : "default", 13 | "data" : { 14 | "run" : 0, 15 | "retry" : 0 16 | } 17 | }, { 18 | "buildOrder" : 1, 19 | "reportUrl" : "../1/index.html", 20 | "reportName" : "default", 21 | "data" : { 22 | "run" : 0, 23 | "retry" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "run" : 0, 28 | "retry" : 0 29 | } 30 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_photo_id_revokable_no_schema_restriction.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "photo_attrs": { 4 | "names": [ 5 | "name" 6 | ], 7 | "restrictions": [ 8 | { 9 | "schema_name": "photo_id_revokable", 10 | "schema_version": "1.0.0" 11 | }, 12 | { 13 | "schema_name": "photo_id", 14 | "schema_version": "1.0.0" 15 | } 16 | ] 17 | } 18 | }, 19 | "requested_predicates": {}, 20 | "version": "0.1.0", 21 | "name": "Sauce labs photo id no schema restriction", 22 | "nonce": "1234567890" 23 | } -------------------------------------------------------------------------------- /aries-mobile-tests/sl_android_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "firstMatch": [ 4 | { 5 | "platformName": "Android", 6 | "appium:options": { 7 | "app": "storage:filename=BCWallet-2175.aab", 8 | "autoGrantPermissions": true, 9 | "automationName": "UiAutomator2" 10 | }, 11 | "sauce:options": { 12 | "appiumVersion": "latest", 13 | "fullReset": true, 14 | "sauceLabsImageInjectionEnabled": true, 15 | "sessionCreationRetry": "3" 16 | } 17 | } 18 | ] 19 | } 20 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/multi_cred_proof.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "proof-request", 3 | "nonce": "1234567890", 4 | "version": "1.0", 5 | "requested_attributes": { 6 | "default_schema": { 7 | "names": [ 8 | "first_name", 9 | "last_name" 10 | ], 11 | "restrictions": [ 12 | { 13 | "schema_name": "sauce_labs_test" 14 | } 15 | ] 16 | }, 17 | "photo_id": { 18 | "names": [ 19 | "name" 20 | ], 21 | "restrictions": [ 22 | { 23 | "schema_name": "photo_id" 24 | } 25 | ] 26 | } 27 | }, 28 | "requested_predicates": {} 29 | } -------------------------------------------------------------------------------- /aries-mobile-tests/allure/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | allure: 5 | image: "frankescobar/allure-docker-service" 6 | environment: 7 | SECURITY_USER: "my_username" 8 | SECURITY_PASS: "my_password" 9 | SECURITY_ENABLED: 1 10 | MAKE_VIEWER_ENDPOINTS_PUBLIC: 1 11 | TLS: 1 12 | CHECK_RESULTS_EVERY_SECONDS: NONE 13 | KEEP_HISTORY: 1 14 | ports: 15 | - "5050:5050" 16 | volumes: 17 | - ${PWD}/projects:/projects 18 | 19 | allure-ui: 20 | image: "frankescobar/allure-docker-service-ui" 21 | environment: 22 | ALLURE_DOCKER_PUBLIC_API_URL: "http://localhost:5050" 23 | ALLURE_DOCKER_PUBLIC_API_URL_PREFIX: "" 24 | ports: 25 | - "5252:5252" 26 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 1, 15 | "reportUrl" : "../1/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "failed" : 0, 28 | "broken" : 0, 29 | "skipped" : 0, 30 | "passed" : 0, 31 | "unknown" : 0, 32 | "total" : 0 33 | } 34 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/widgets/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 1, 15 | "reportUrl" : "../1/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "failed" : 0, 28 | "broken" : 0, 29 | "skipped" : 0, 30 | "passed" : 0, 31 | "unknown" : 0, 32 | "total" : 0 33 | } 34 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/results/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 2, 3 | "reportUrl" : "../2/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 1, 15 | "reportUrl" : "../1/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "data" : { 27 | "failed" : 0, 28 | "broken" : 0, 29 | "skipped" : 0, 30 | "passed" : 0, 31 | "unknown" : 0, 32 | "total" : 0 33 | } 34 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/sl_ios_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "firstMatch": [ 4 | { 5 | "platformName": "iOS", 6 | "appium:options": { 7 | "app": "storage:filename=BCWallet-2225.ipa", 8 | "autoAcceptAlerts": true, 9 | "autoDismissAlerts": true, 10 | "automationName": "xcuitest", 11 | "platformVersion": "18|17.7|16.7|13.7|14.8|15.8" 12 | }, 13 | "sauce:options": { 14 | "appiumVersion": "latest", 15 | "sauceLabsImageInjectionEnabled": true, 16 | "sessionCreationRetry": "3" 17 | } 18 | } 19 | ] 20 | } 21 | } -------------------------------------------------------------------------------- /aries-mobile-tests/Dockerfile.harness: -------------------------------------------------------------------------------- 1 | FROM python:3.9-bullseye 2 | COPY ./aries-mobile-tests/requirements.txt /aries-mobile-test-harness/ 3 | WORKDIR /aries-mobile-test-harness 4 | RUN pip install -r requirements.txt 5 | 6 | RUN \ 7 | echo "==> Install stuff not in the requirements..." && \ 8 | pip install --upgrade pip && \ 9 | pip install --no-cache-dir \ 10 | aiohttp && \ 11 | pip install --no-cache-dir \ 12 | python-decouple 13 | 14 | RUN apt update && apt install -y chromium 15 | 16 | # workaround for chromium crash reports warning 17 | RUN mkdir -p "/root/.config/chromium/Crash Reports/pending" 18 | 19 | COPY . /aries-mobile-test-harness 20 | WORKDIR /aries-mobile-test-harness/aries-mobile-tests 21 | ENTRYPOINT ["behave"] 22 | #ENTRYPOINT ["bash"] 23 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/bc_wallet/give_feedback.feature: -------------------------------------------------------------------------------- 1 | # https://github.com/bcgov/bc-wallet-mobile/issues/1002 2 | @GiveFeedback @bc_wallet @Story_1002 @normal 3 | Feature: Give Feedback 4 | In order to communicate concerns, issues, and praise 5 | As a wallet user 6 | I want to be able to give feedback easily in the app 7 | 8 | 9 | @T001-GiveFeedback @AcceptanceTest 10 | Scenario Outline: Wallet user gives feedback 11 | Given the wallet user 12 | And they are on on the landing page 13 | When they select Give Feedback 14 | Then they are taken to the Feedback form 15 | 16 | Examples: 17 | | user_state | 18 | | has just onboarded | 19 | #| reopens the app | 20 | #| has just recieved a credential | 21 | #| has just completed a proof request | -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_photo_id.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "photo_attrs": { 4 | "names": [ 5 | "photo" 6 | ], 7 | "restrictions": [ 8 | { 9 | "schema_name": "photo_id", 10 | "schema_version": "1.0.0" 11 | } 12 | ] 13 | } 14 | }, 15 | "requested_predicates": { 16 | "age": { 17 | "name": "birth_dateint", 18 | "p_type": ">", 19 | "p_value": 19420116, 20 | "restrictions": [ 21 | { 22 | "schema_name": "photo_id", 23 | "schema_version": "1.0.0" 24 | } 25 | ] 26 | } 27 | }, 28 | "version": "0.1.0", 29 | "name": "Sauce labs default photo id proof", 30 | "nonce": "1234567890" 31 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/cred_data_unverified_person.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name": "unverified_person", 3 | "schema_version": "1.0.0", 4 | "attributes": [ 5 | { 6 | "name": "first_name", 7 | "value": "Betty" 8 | }, 9 | { 10 | "name": "last_name", 11 | "value": "Naroff" 12 | }, 13 | { 14 | "name": "street_address", 15 | "value": "159 Cedar Street, Sudbury, ON" 16 | }, 17 | { 18 | "name": "city", 19 | "value": "Sudbury" 20 | }, 21 | { 22 | "name": "province", 23 | "value": "ON" 24 | }, 25 | { 26 | "name": "postal_code", 27 | "value": "P3E 1B1" 28 | }, 29 | { 30 | "name": "date_of_birth", 31 | "value": "1942-01-17" 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_drivers_license.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "id_attrs": { 4 | "names": [ 5 | "id" 6 | ], 7 | "restrictions": [ 8 | { 9 | "schema_name": "drivers_license", 10 | "schema_version": "1.0.0" 11 | } 12 | ] 13 | } 14 | }, 15 | "requested_predicates": { 16 | "age": { 17 | "name": "birth_dateint", 18 | "p_type": ">", 19 | "p_value": 19420116, 20 | "restrictions": [ 21 | { 22 | "schema_name": "drivers_license", 23 | "schema_version": "1.0.0" 24 | } 25 | ] 26 | } 27 | }, 28 | "version": "0.1.0", 29 | "name": "Sauce labs drivers license proof", 30 | "nonce": "1234567890" 31 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_photo_id_revokable_no_schema_restriction_predicates.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "photo_attrs": { 4 | "names": [ 5 | "photo" 6 | ], 7 | "restrictions": [ 8 | { 9 | "schema_name": "photo_id_revokable", 10 | "schema_version": "1.0.0" 11 | }, 12 | { 13 | "schema_name": "photo_id", 14 | "schema_version": "1.0.0" 15 | } 16 | ] 17 | } 18 | }, 19 | "requested_predicates": { 20 | "age": { 21 | "name": "birth_dateint", 22 | "p_type": ">", 23 | "p_value": 19420116 24 | } 25 | }, 26 | "version": "0.1.0", 27 | "name": "Sauce labs photo id no schema restrictions", 28 | "nonce": "1234567890" 29 | } -------------------------------------------------------------------------------- /aries-mobile-tests/device_service_handler/device_service_handler_factory.py: -------------------------------------------------------------------------------- 1 | """ 2 | Factory class to create Device Service Handlers 3 | given the device service type passed in. 4 | """ 5 | from device_service_handler.device_service_map import device_service_map_dict 6 | from device_service_handler.device_service_handler_interface import DeviceServiceHandlerInterface 7 | from device_service_handler.sauce_labs_handler import SauceLabsHandler 8 | from device_service_handler.local_android_handler import LocalAndroidHandler 9 | 10 | class DeviceServiceHandlerFactory(): 11 | 12 | def create_device_service_handler(self, device_service_type:str, config_file_path:str) -> DeviceServiceHandlerInterface: 13 | """create an issuer agent interface object of the type given""" 14 | return device_service_map_dict[device_service_type](config_file_path) 15 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_photo_id_revokable.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "photo_attrs": { 4 | "names": [ 5 | "photo" 6 | ], 7 | "restrictions": [ 8 | { 9 | "schema_name": "photo_id_revokable", 10 | "schema_version": "1.0.0" 11 | } 12 | ] 13 | } 14 | }, 15 | "requested_predicates": { 16 | "age": { 17 | "name": "birth_dateint", 18 | "p_type": ">", 19 | "p_value": 19420116, 20 | "restrictions": [ 21 | { 22 | "schema_name": "photo_id_revokable", 23 | "schema_version": "1.0.0" 24 | } 25 | ] 26 | } 27 | }, 28 | "version": "0.1.0", 29 | "name": "Sauce labs revokable photo id proof", 30 | "nonce": "1234567890" 31 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/proof_drivers_license_sp_char.json: -------------------------------------------------------------------------------- 1 | { 2 | "requested_attributes": { 3 | "id_attrs": { 4 | "names": [ 5 | "name_😀" 6 | ], 7 | "restrictions": [ 8 | { 9 | "schema_name": "drivers_license_😀", 10 | "schema_version": "1.0.0" 11 | } 12 | ] 13 | } 14 | }, 15 | "requested_predicates": { 16 | "age": { 17 | "name": "#$%_birth_dateint", 18 | "p_type": ">", 19 | "p_value": 19420116, 20 | "restrictions": [ 21 | { 22 | "schema_name": "drivers_license_😀", 23 | "schema_version": "1.0.0" 24 | } 25 | ] 26 | } 27 | }, 28 | "name": "Sauce labs drivers license sp char proof", 29 | "nonce": "1234567890", 30 | "version": "0.1.0" 31 | } -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bifold/contacts.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.mobileby import MobileBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | 7 | class ContactsPage(BasePage): 8 | """Contacts page object""" 9 | 10 | # Locators 11 | title_locator = "Contacts" 12 | contact_locator = "hmmm" 13 | 14 | def select_contact(self): 15 | if self.on_the_right_page(self.title_locator): 16 | self.find_by_accessibility_id(self.contact_locator).click() 17 | 18 | # return a new page objectfor the Contacts page 19 | #return ContactPage(self.driver) 20 | else: 21 | raise Exception(f"App not on the {self.title_locator} page") 22 | #return ContactPage 23 | 24 | 25 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/pcft_connectionless_proof.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unverified-person", 3 | "version": "0.0.1", 4 | "requested_attributes": { 5 | "person_attrs": { 6 | "names": [ 7 | "given_names", 8 | "family_name", 9 | "birthdate", 10 | "street_address", 11 | "postal_code", 12 | "locality", 13 | "region", 14 | "country" 15 | ], 16 | "restrictions": [ 17 | { 18 | "schema_name": "unverified_person", 19 | "schema_version": "0.1.0" 20 | }, 21 | { 22 | "schema_name": "unverified_person", 23 | "schema_version": "0.2.0" 24 | } 25 | ] 26 | } 27 | }, 28 | "requested_predicates": {} 29 | } -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/toast_notification.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pageobjects.basepage import BasePage 3 | 4 | class ToastNotification(BasePage): 5 | """base class for the toast notification page object""" 6 | 7 | # Locators 8 | on_this_page_text_locator:str 9 | notification_locator:tuple 10 | 11 | def on_this_page(self): 12 | timeout = 50 13 | if "Local" in os.environ['DEVICE_CLOUD']: 14 | timeout = 100 15 | return super().on_this_page(self.on_this_page_text_locator, timeout) 16 | 17 | def dismiss_notification(self): 18 | if self.on_this_page(): 19 | self.find_by(self.notification_locator).click() 20 | # Not sure what is returned here yet 21 | # return CredentialOfferPage(self.driver) 22 | else: 23 | raise Exception(f"App not on the {type(self)} page") 24 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_vp/pageobjects/authcode_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | 5 | # These classes can inherit from a BasePage to do commone setup and functions 6 | class AuthCodePage(WebBasePage): 7 | """BC VP Issuer GitHub Auth Code page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Device verification" 11 | auth_code_locator = (By.ID, 'otp') 12 | 13 | def on_this_page(self): 14 | return super().on_this_page(self.on_this_page_text_locator) 15 | 16 | def enter_auth_code(self, auth_code): 17 | if self.on_this_page(): 18 | self.find_by(self.auth_code_locator).send_keys(auth_code) 19 | return True 20 | else: 21 | raise Exception(f"App not on the {type(self)} page") 22 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/credential_added.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.credentials import CredentialsPage 4 | 5 | 6 | # These classes can inherit from a BasePage to do common setup and functions 7 | class CredentialAddedPage(BasePage): 8 | """Credential Added page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Credential added to your wallet" 12 | on_this_page_locator = (AppiumBy.ID, "com.ariesbifold:id/CredentialAddedToYourWallet") 13 | done_locator = (AppiumBy.ID, "com.ariesbifold:id/Done") 14 | 15 | def on_this_page(self): 16 | return super().on_this_page(self.on_this_page_locator) 17 | 18 | def select_done(self): 19 | if self.on_this_page(): 20 | self.find_by(self.done_locator).click() 21 | return CredentialsPage(self.driver) 22 | else: 23 | raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/bc_services_card_credential_issued.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.information_sent_successfully import InformationSentSuccessfullyPage 4 | 5 | class BCServicesCardCredentialIssuedPage(BasePage): 6 | """BC Services Card Credential Issued page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Your Credential has been Issued!" 10 | close_and_go_to_wallet_locator = (AppiumBy.ACCESSIBILITY_ID, "Close and go to wallet") 11 | 12 | 13 | def on_this_page(self): 14 | return super().on_this_page(self.on_this_page_text_locator) 15 | 16 | 17 | def close_and_go_to_wallet(self): 18 | if self.on_this_page(): 19 | self.find_by(self.close_and_go_to_wallet_locator).click() 20 | return InformationSentSuccessfullyPage(self.driver) 21 | else: 22 | raise Exception(f"App not on the {type(self)} page") 23 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 2, 15 | "reportUrl" : "../2/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "buildOrder" : 1, 27 | "reportUrl" : "../1/index.html", 28 | "reportName" : "default", 29 | "data" : { 30 | "failed" : 0, 31 | "broken" : 0, 32 | "skipped" : 0, 33 | "passed" : 0, 34 | "unknown" : 0, 35 | "total" : 0 36 | } 37 | }, { 38 | "data" : { 39 | "failed" : 0, 40 | "broken" : 0, 41 | "skipped" : 0, 42 | "passed" : 0, 43 | "unknown" : 0, 44 | "total" : 0 45 | } 46 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/widgets/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 2, 15 | "reportUrl" : "../2/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "buildOrder" : 1, 27 | "reportUrl" : "../1/index.html", 28 | "reportName" : "default", 29 | "data" : { 30 | "failed" : 0, 31 | "broken" : 0, 32 | "skipped" : 0, 33 | "passed" : 0, 34 | "unknown" : 0, 35 | "total" : 0 36 | } 37 | }, { 38 | "data" : { 39 | "failed" : 0, 40 | "broken" : 0, 41 | "skipped" : 0, 42 | "passed" : 0, 43 | "unknown" : 0, 44 | "total" : 0 45 | } 46 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 2, 15 | "reportUrl" : "../2/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "buildOrder" : 1, 27 | "reportUrl" : "../1/index.html", 28 | "reportName" : "default", 29 | "data" : { 30 | "failed" : 0, 31 | "broken" : 0, 32 | "skipped" : 0, 33 | "passed" : 0, 34 | "unknown" : 0, 35 | "total" : 0 36 | } 37 | }, { 38 | "data" : { 39 | "failed" : 0, 40 | "broken" : 0, 41 | "skipped" : 0, 42 | "passed" : 0, 43 | "unknown" : 0, 44 | "total" : 0 45 | } 46 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/widgets/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "buildOrder" : 3, 3 | "reportUrl" : "../3/index.html", 4 | "reportName" : "default", 5 | "data" : { 6 | "failed" : 0, 7 | "broken" : 0, 8 | "skipped" : 0, 9 | "passed" : 0, 10 | "unknown" : 0, 11 | "total" : 0 12 | } 13 | }, { 14 | "buildOrder" : 2, 15 | "reportUrl" : "../2/index.html", 16 | "reportName" : "default", 17 | "data" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 0, 22 | "unknown" : 0, 23 | "total" : 0 24 | } 25 | }, { 26 | "buildOrder" : 1, 27 | "reportUrl" : "../1/index.html", 28 | "reportName" : "default", 29 | "data" : { 30 | "failed" : 0, 31 | "broken" : 0, 32 | "skipped" : 0, 33 | "passed" : 0, 34 | "unknown" : 0, 35 | "total" : 0 36 | } 37 | }, { 38 | "data" : { 39 | "failed" : 0, 40 | "broken" : 0, 41 | "skipped" : 0, 42 | "passed" : 0, 43 | "unknown" : 0, 44 | "total" : 0 45 | } 46 | } ] -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/information_approved.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | 4 | 5 | # These classes can inherit from a BasePage to do common setup and functions 6 | class InformationApprovedPage(BasePage): 7 | """Proof Information approved page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Information received" 11 | approval_locator = (AppiumBy.ID, "com.ariesbifold:id/SentProofRequest") 12 | done_locator = (AppiumBy.ID, "com.ariesbifold:id/Done") 13 | 14 | def on_this_page(self): 15 | #print(self.driver.page_source) 16 | return super().on_this_page(self.on_this_page_text_locator) 17 | 18 | def select_done(self): 19 | if self.on_this_page(): 20 | self.find_by(self.done_locator).click() 21 | from pageobjects.bc_wallet.home import HomePage 22 | return HomePage(self.driver) 23 | else: 24 | raise Exception(f"App not on the {type(self)} page") 25 | 26 | 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/verifier_agent_interface.py: -------------------------------------------------------------------------------- 1 | """ 2 | Absctact Base Class for actual verifier agent interfaces to implement 3 | """ 4 | 5 | from abc import ABC, abstractmethod 6 | 7 | 8 | class VerifierAgentInterface(ABC): 9 | 10 | def __init__(self, endpoint): 11 | self.endpoint = endpoint 12 | 13 | # Default schema and cred 14 | DEFAULT_PROOF_REQUEST = { 15 | "name": "Sauce labs default proof request", 16 | "nonce": "1234567890", 17 | "version": "1.0", 18 | "requested_attributes": { 19 | "attr_1": { 20 | "names": ["first_name"], 21 | "restrictions": [ 22 | { 23 | "schema_name": "sauce_labs_test" 24 | } 25 | ], 26 | } 27 | }, 28 | "requested_predicates": {} 29 | } 30 | 31 | @abstractmethod 32 | def get_issuer_type(self) -> str: 33 | """return the type of issuer you are ie 'AATHVerifier'""" 34 | 35 | @abstractmethod 36 | def send_proof_request(self): 37 | """do a proof request""" 38 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/proof_request_declined.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from selenium.webdriver.support.ui import WebDriverWait 3 | from selenium.webdriver.support import expected_conditions as EC 4 | from pageobjects.basepage import BasePage 5 | 6 | 7 | # These classes can inherit from a BasePage to do common setup and functions 8 | class ProofRequestDeclinedPage(BasePage): 9 | """Proof Request Declined page object""" 10 | """ DEPREICATED - Saving it incase this page comes back """ 11 | 12 | # Locators 13 | on_this_page_text_locator = "Proof request declined" 14 | done_locator = (AppiumBy.ID, "com.ariesbifold:id/Done") 15 | 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | 20 | def select_done(self): 21 | if self.on_this_page(): 22 | self.find_by(self.done_locator).click() 23 | from pageobjects.bc_wallet.home import HomePage 24 | return HomePage(self.driver) 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/create_bc_digital_id.py: -------------------------------------------------------------------------------- 1 | import os 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from pageobjects.basepage import BasePage 4 | from pageobjects.bc_wallet.bc_services_card_login import BCServicesCardLoginPage 5 | 6 | class CreateABCDigitalIDPage(BasePage): 7 | """Create a BC Digitial ID web(internal to the app) page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Create a Person credential" 11 | log_in_with_bc_services_card_locator = (AppiumBy.ACCESSIBILITY_ID, "Log in with BC Services Card") 12 | 13 | 14 | def on_this_page(self): 15 | timeout = 50 16 | if "Local" in os.environ['DEVICE_CLOUD']: 17 | timeout = 100 18 | return super().on_this_page(self.on_this_page_text_locator, timeout) 19 | 20 | 21 | def select_login_with_bc_services_card(self): 22 | if self.on_this_page(): 23 | self.find_by(self.log_in_with_bc_services_card_locator).click() 24 | return BCServicesCardLoginPage(self.driver) 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/cred_data_drivers_license.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name": "drivers_license", 3 | "schema_version": "1.0.0", 4 | "attributes": [ 5 | { 6 | "name": "name", 7 | "value": "Betty Naroff" 8 | }, 9 | { 10 | "name": "civic_address", 11 | "value": "159 Cedar Street, Sudbury, ON" 12 | }, 13 | { 14 | "name": "city", 15 | "value": "Sudbury" 16 | }, 17 | { 18 | "name": "province", 19 | "value": "ON" 20 | }, 21 | { 22 | "name": "country", 23 | "value": "Canada" 24 | }, 25 | { 26 | "name": "postal_code", 27 | "value": "P3E 1B1" 28 | }, 29 | { 30 | "name": "birth_dateint", 31 | "value": "19420117" 32 | }, 33 | { 34 | "name": "id", 35 | "value": "123456789" 36 | }, 37 | { 38 | "name": "issue_date", 39 | "value": "2022-04-04T13:32:55.455Z" 40 | }, 41 | { 42 | "name": "expiry_date", 43 | "value": "2027-04-04T13:32:55.455Z" 44 | } 45 | ] 46 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/data/cred_data_drivers_license_sp_char.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_name": "drivers_license_😀", 3 | "schema_version": "1.0.0", 4 | "attributes": [ 5 | { 6 | "name": "name_😀", 7 | "value": "Betty Naroff 😀" 8 | }, 9 | { 10 | "name": "civic_address_!@#", 11 | "value": "159 Cedar Street, Sudbury, ON" 12 | }, 13 | { 14 | "name": "city_$%^", 15 | "value": "Sudbury" 16 | }, 17 | { 18 | "name": "province_&*(", 19 | "value": "ON" 20 | }, 21 | { 22 | "name": ")_+_country", 23 | "value": "Canada" 24 | }, 25 | { 26 | "name": "~!@_postal_code", 27 | "value": "P3E 1B1" 28 | }, 29 | { 30 | "name": "#$%_birth_dateint", 31 | "value": "19420117" 32 | }, 33 | { 34 | "name": "^&*_id", 35 | "value": "123456789" 36 | }, 37 | { 38 | "name": "issue_()_date", 39 | "value": "2022-04-04T13:32:55.455Z" 40 | }, 41 | { 42 | "name": "expiry_/0_date", 43 | "value": "2027-04-04T13:32:55.455Z" 44 | } 45 | ] 46 | } -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/why_you_need_a_pin.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.pinsetup import PINSetupPage 4 | 5 | # These classes can inherit from a BasePage to do commone setup and functions 6 | class WhyYouNeedAPINPage(BasePage): 7 | """Secure your wallet Why you need a PIN Info page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Create a PIN" 11 | on_this_page_locator = (AppiumBy.NAME, "Create a PIN") 12 | continue_locator = ( 13 | AppiumBy.ID, "com.ariesbifold:id/ContinueCreatePIN") 14 | 15 | def on_this_page(self): 16 | if self.current_platform == "Android": 17 | return super().on_this_page(self.on_this_page_text_locator) 18 | return super().on_this_page(self.on_this_page_locator) 19 | 20 | def select_continue(self): 21 | # Remove the platform check when BC Wallet bug 2264 is fixed 22 | if self.current_platform == "Android": 23 | self.scroll_to_bottom() 24 | self.find_by(self.continue_locator).click() 25 | 26 | # return the wallet biometrics page 27 | return PINSetupPage(self.driver) -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/contact_details.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | from pageobjects.basepage import WaitCondition 7 | from pageobjects.bc_wallet.contact_remove_from_wallet import ContactRemoveFromWalletPage 8 | 9 | 10 | class ContactDetailsPage(BasePage): 11 | """Contact page object""" 12 | 13 | # Locator 14 | on_this_page_text_locator = "Contact Details" 15 | remove_contact_locator = (AppiumBy.ID, "com.ariesbifold:id/RemoveFromWallet") 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | 20 | def select_remove_from_wallet(self): 21 | if self.on_this_page(): 22 | self.find_by(self.remove_contact_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 23 | 24 | # return a new page object for the Remove from wallet page 25 | return ContactRemoveFromWalletPage(self.driver) 26 | else: 27 | raise Exception(f"App not on the {type(self)}") 28 | 29 | 30 | -------------------------------------------------------------------------------- /runTest.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # we store all the passwords in the local .env file 4 | echo -e '\n=> Exporting secrets' 5 | if [ -f .env ] 6 | then 7 | # export "$(cat .env | xargs)" 8 | source .env 9 | # echo $DEVICE_CLOUD_USERNAME 10 | else 11 | echo -e '\n=> No env file found abborting operation' 12 | echo "Missing .env file!" > logfile.log 13 | echo -e '\n=> Done' 14 | exit 125 15 | fi 16 | echo -e '\n=> Done' 17 | 18 | # echo -e '\n=> uploading the app' 19 | # ./upload_app_to_SL.sh $DEVICE_CLOUD_USERNAME $DEVICE_CLOUD_ACCESS_KEY /$APP_APK_LOCATION "Android Bifold ON App" api.us-west-1 20 | # echo -e '\n=> Done' 21 | 22 | echo -e '\n=> Removing all Dangling images' 23 | docker rmi "$(docker images --filter "dangling=true" -q --no-trunc)" 24 | echo -e '\n=> Done' 25 | 26 | echo -e '\n=> Clean build' 27 | ./manage build -w ODS -i acapy-main -v acapy-main 28 | echo -e '\n=> Done' 29 | 30 | # testing 31 | echo -e '\n=> Starting the saucy tests' 32 | LEDGER_URL_CONFIG=http://test.bcovrin.vonx.io REGION=us-west-1 ./manage run -d SauceLabs -u $DEVICE_CLOUD_USERNAME -k $DEVICE_CLOUD_ACCESS_KEY -p Android -a $APP_NAME.apk -i acapy-main -v acapy-main -t @connect 33 | # NOTE: replace @connect with your feature file 34 | echo -e '\n=> Done' 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bifold/pin.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.mobileby import MobileBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | from pageobjects.bifold.home import HomePage 7 | 8 | class PINPage(BasePage): 9 | """A sample test class to show how page object works""" 10 | 11 | # def __init__ (self, context): 12 | # #self.device = context.driver 13 | # self.context = context 14 | 15 | #def __init__ (self): 16 | 17 | def enter_pin(self, context, pin): 18 | search_element = WebDriverWait(context.driver, 10).until( 19 | EC.presence_of_element_located((MobileBy.ACCESSIBILITY_ID, "Search Wikipedia")) 20 | ) 21 | search_element.click() 22 | search_input = WebDriverWait(context.driver, 30).until( 23 | EC.element_to_be_clickable((MobileBy.ID, "org.wikipedia.alpha:id/search_src_text")) 24 | ) 25 | search_input.send_keys(keyword) 26 | time.sleep(5) 27 | 28 | def submit_pin(self, context: 29 | thisHomePage = context.driver.find_elements_by_class_name("android.widget.TextView") 30 | return thisHomePage -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/pin.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.initialization import InitializationPage 4 | 5 | class PINPage(BasePage): 6 | """PIN Entry page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Enter PIN" 10 | pin_locator = (AppiumBy.ID, "com.ariesbifold:id/EnterPIN") 11 | pin_visibility_locator = (AppiumBy.ID, "com.ariesbifold:id/Show") 12 | enter_button_locator = (AppiumBy.ID, "com.ariesbifold:id/Enter") 13 | 14 | def on_this_page(self): 15 | return super().on_this_page(self.on_this_page_text_locator, 50) 16 | 17 | def enter_pin(self, pin): 18 | if self.on_this_page(): 19 | self.find_by(self.pin_locator).send_keys(pin) 20 | return True 21 | else: 22 | raise Exception(f"App not on the {type(self)} page") 23 | 24 | def select_enter(self): 25 | if self.on_this_page(): 26 | self.find_by(self.enter_button_locator).click() 27 | 28 | # return the wallet initialization page 29 | return InitializationPage(self.driver) 30 | else: 31 | raise Exception(f"App not on the {type(self)} page") 32 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/pin_explainer.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage, WaitCondition 3 | from pageobjects.bc_wallet.pinsetup import PINSetupPage 4 | 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class PinExplainerPage(BasePage): 8 | """Pin Explainer page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Create a PIN" 12 | on_this_page_locator = (AppiumBy.NAME, "Create a PIN") 13 | continue_button_locator = (AppiumBy.ID, "com.ariesbifold:id/ContinueCreatePIN") 14 | continue_button_aid_locator = (AppiumBy.ACCESSIBILITY_ID, "Global.Continue") 15 | 16 | 17 | def on_this_page(self): 18 | if self.current_platform == "Android": 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | return super().on_this_page(self.on_this_page_locator) 21 | 22 | def select_continue(self): 23 | if self.on_this_page(): 24 | self.find_by(self.continue_button_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 25 | return PINSetupPage(self.driver) 26 | else: 27 | raise Exception(f"App not on the {type(self)} page") 28 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/holder_get_invite_interface/pageobjects/connect_with_issuer_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | import base64 5 | #from candy_uvp.pageobjects.connect_with_issuer_page import ConnectWithIssuerPage 6 | 7 | # These classes can inherit from a BasePage to do commone setup and functions 8 | class ConnectWithIssuerPage(WebBasePage): 9 | """CANdy UVP Issuer Connect with Issuer page object""" 10 | 11 | # Locators 12 | on_this_page_text_locator = "Connect with Issuer" 13 | qr_code_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/img') 14 | 15 | 16 | def on_this_page(self): 17 | return super().on_this_page(self.on_this_page_text_locator) 18 | 19 | def get_qr_code(self): 20 | if self.on_this_page(): 21 | qrcode_element = self.find_by(self.qr_code_locator) 22 | self.driver.save_screenshot("qrcode.png") 23 | #qrcode = Image.open("qrcode.png") 24 | qrcode = base64.b64encode(open("qrcode.png", "rb").read()) 25 | return qrcode.decode('utf-8') 26 | 27 | else: 28 | raise Exception(f"App not on the {type(self)} page") 29 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/bc_services_card_login_vt_pc.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | #from pageobjects.bc_wallet.bc_services_card_login_vt_pc import BCServicesCardLoginVTPCPage 4 | 5 | class BCServicesCardLoginVTPCPage(BasePage): 6 | """BC Services Card Login Virtual Testing passcode Entry page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Passcode" 10 | passcode_locator = (AppiumBy.ACCESSIBILITY_ID, "Passcode") 11 | continue_locator = (AppiumBy.ACCESSIBILITY_ID, "Continue") 12 | 13 | def on_this_page(self): 14 | return super().on_this_page(self.on_this_page_text_locator, 50) 15 | 16 | def enter_passcode(self, csn): 17 | if self.on_this_page(): 18 | self.find_by(self.passcode_locator).send_keys(csn) 19 | return True 20 | else: 21 | raise Exception(f"App not on the {type(self)} page") 22 | 23 | def select_continue(self): 24 | if self.on_this_page(): 25 | self.find_by(self.continue_locator).click() 26 | 27 | # return the passcode entry page 28 | #return BCServicesCardLoginVTPCPage(self.driver) 29 | else: 30 | raise Exception(f"App not on the {type(self)} page") 31 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/lets_get_started_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.install_bc_wallet_page import InstallBCWalletPage 7 | 8 | 9 | # These classes can inherit from a BasePage to do commone setup and functions 10 | class LetsGetStartedPage(WebBasePage): 11 | """BC Wallet Showcase Lets Get Started page object""" 12 | 13 | # Locators 14 | on_this_page_text_locator = "BC Wallet is a new app for storing and using credentials" 15 | next_locator = (By.XPATH, "//button[normalize-space()='NEXT']") 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | 22 | def select_next(self) -> InstallBCWalletPage: 23 | try: 24 | self.find_by(self.next_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 25 | except Exception as e: 26 | if not self.on_this_page(): 27 | raise Exception(f"App not on the {type(self)} page") 28 | else: 29 | raise e 30 | return InstallBCWalletPage(self.driver) -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/book_a_study_room_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.start_booking_the_room_page import StartBookingTheRoomPage 7 | 8 | 9 | # These classes can inherit from a BasePage to do commone setup and functions 10 | class BookAStudyRoomPage(WebBasePage): 11 | """BC Wallet Showcase Book a Study Room page object""" 12 | 13 | # Locators 14 | on_this_page_text_locator = "needs a study room for some peace and quiet" 15 | start_locator = (By.XPATH, "//button[normalize-space()='START']") 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | 20 | 21 | def select_start(self) -> StartBookingTheRoomPage: 22 | try: 23 | self.find_by(self.start_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 24 | except Exception as e: 25 | if not self.on_this_page(): 26 | raise Exception(f"App not on the {type(self)} page") 27 | else: 28 | raise e 29 | return StartBookingTheRoomPage(self.driver) 30 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/install_bc_wallet_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.connect_with_best_bc_college_page import ConnectWithBestBCCollegePage 7 | 8 | 9 | # These classes can inherit from a BasePage to do commone setup and functions 10 | class InstallBCWalletPage(WebBasePage): 11 | """BC Wallet Showcase Install BC Wallet page object""" 12 | 13 | # Locators 14 | on_this_page_text_locator = "install the BC Wallet app" 15 | skip_locator = (By.XPATH, "//button[normalize-space()='SKIP']") 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | 22 | def select_skip(self) -> ConnectWithBestBCCollegePage: 23 | try: 24 | self.find_by(self.skip_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 25 | except Exception as e: 26 | if not self.on_this_page(): 27 | raise Exception(f"App not on the {type(self)} page") 28 | else: 29 | raise e 30 | return ConnectWithBestBCCollegePage(self.driver) -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/youre_all_set_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.using_your_credentials_page import UsingYourCredentialsPage 7 | 8 | 9 | # These classes can inherit from a BasePage to do commone setup and functions 10 | class YoureAllSetPage(WebBasePage): 11 | """BC Wallet Showcase Your All Set page object""" 12 | 13 | # Locators 14 | on_this_page_text_locator = "you’ve just received your first digital credentials" 15 | finish_locator = (By.XPATH, "//button[normalize-space()='FINISH']") 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | 22 | def select_finish(self) -> UsingYourCredentialsPage: 23 | try: 24 | self.find_by(self.finish_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 25 | except Exception as e: 26 | if not self.on_this_page(): 27 | raise Exception(f"App not on the {type(self)} page") 28 | else: 29 | raise e 30 | return UsingYourCredentialsPage(self.driver) -------------------------------------------------------------------------------- /aries-mobile-tests/allure/cookiesFile: -------------------------------------------------------------------------------- 1 | # Netscape HTTP Cookie File 2 | # https://curl.haxx.se/docs/http-cookies.html 3 | # This file was generated by libcurl! Edit at your own risk. 4 | 5 | #HttpOnly_allure-von.apps.silver.devops.gov.bc.ca FALSE / TRUE 0 c4c8ad2ad6bbc67745fb94b3b309c257 e97b82e02a0b7a8cae122d13e0146081 6 | allure-von.apps.silver.devops.gov.bc.ca FALSE / FALSE 0 csrf_refresh_token 102b80de-2eaa-41f0-8257-bf720365c3ce 7 | #HttpOnly_allure-von.apps.silver.devops.gov.bc.ca FALSE / FALSE 0 refresh_token_cookie eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MTE4NjQwMTYsIm5iZiI6MTYxMTg2NDAxNiwianRpIjoiMWM2YTNlNmYtYmRlMS00NjRkLWEyM2QtY2JmNTIxYmUwNWJkIiwiaWRlbnRpdHkiOiJwY2N2ZGdtaGVzIiwidHlwZSI6InJlZnJlc2giLCJjc3JmIjoiMTAyYjgwZGUtMmVhYS00MWYwLTgyNTctYmY3MjAzNjVjM2NlIn0.YDnaEP56lU1llKrJP1VjvX3Sgb3E3dbBoheWhgDy4O8 8 | allure-von.apps.silver.devops.gov.bc.ca FALSE / FALSE 0 csrf_access_token 5f390c2d-c16e-49eb-8c00-c5fa9f416ecb 9 | #HttpOnly_allure-von.apps.silver.devops.gov.bc.ca FALSE / FALSE 0 access_token_cookie eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MTE4NjQwMTYsIm5iZiI6MTYxMTg2NDAxNiwianRpIjoiNjA3ZDgzYTktYjBiZi00ZDU0LTkyM2EtMzRkZjAyNGIxYTBkIiwiZXhwIjoxNjExODY0OTE2LCJpZGVudGl0eSI6InBjY3ZkZ21oZXMiLCJmcmVzaCI6ZmFsc2UsInR5cGUiOiJhY2Nlc3MiLCJjc3JmIjoiNWYzOTBjMmQtYzE2ZS00OWViLThjMDAtYzVmYTlmNDE2ZWNiIn0.4uZ7pu9mvpDw5MdaAGxGwXP5_r-AHUj1VlVSCQfuMCk 10 | -------------------------------------------------------------------------------- /.github/workflows/run-send-gen-test-results-secure/action.yml: -------------------------------------------------------------------------------- 1 | name: "Run Send Generate Test Results" 2 | description: "Run the send-results script to push raw test results to the Allure server" 3 | author: "sheldon.regular@gmail.com" 4 | inputs: 5 | RESULTS_LOCATION: 6 | description: "Location of the raw test results generated by Allure" 7 | required: true 8 | default: "allure-results" 9 | ALLURE_SERVER: 10 | description: "URL of the Allure Service" 11 | required: true 12 | default: "https://allure-mobile.vonx.io/api" 13 | REPORT_PROJECT: 14 | description: "Name of the project the Allure Service is using to store these results" 15 | required: true 16 | default: "acapy" 17 | ADMIN_USER: 18 | description: "Username of the Allure Adminstrator" 19 | required: true 20 | ADMIN_PW: 21 | description: "Password of the Allure Adminstrator" 22 | required: true 23 | runs: 24 | using: "composite" 25 | steps: 26 | - name: run-send-gen-test-results-secure 27 | #working-directory: aries-mobile-test-harness 28 | run: ./aries-mobile-tests/allure/send_results_secure.sh ${{ inputs.RESULTS_LOCATION }} ${{ inputs.ALLURE_SERVER }} -p ${{ inputs.REPORT_PROJECT }} ${{ inputs.ADMIN_USER }} ${{ inputs.ADMIN_PW }} 29 | shell: bash 30 | env: 31 | NO_TTY: "1" 32 | branding: 33 | icon: "mic" 34 | color: "purple" 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/getting_a_student_discount_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.start_proving_youre_a_student_page import StartProvingYoureAStudentPage 7 | 8 | 9 | # These classes can inherit from a BasePage to do commone setup and functions 10 | class GettingAStudentDiscountPage(WebBasePage): 11 | """BC Wallet Showcase Getting a Student Discount page object""" 12 | 13 | # Locators 14 | on_this_page_text_locator = "get a student discount on her online purchase" 15 | start_locator = (By.XPATH, "(//button[normalize-space()='START'])[1]") 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | 22 | def select_start(self) -> StartProvingYoureAStudentPage: 23 | try: 24 | self.find_by(self.start_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 25 | except Exception as e: 26 | if not self.on_this_page(): 27 | raise Exception(f"App not on the {type(self)} page") 28 | else: 29 | raise e 30 | return StartProvingYoureAStudentPage(self.driver) 31 | -------------------------------------------------------------------------------- /aries-mobile-tests/features/steps/bc_wallet/give_feedback.py: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------- 2 | # Behave Step Definitions for Wallet Users giving feedback 3 | # 4 | # ----------------------------------------------------------- 5 | 6 | from behave import given, when, then 7 | import json 8 | 9 | # Local Imports 10 | 11 | # import Page Objects needed 12 | 13 | 14 | @given('the wallet user has just onboarded') 15 | def step_impl(context): 16 | context.execute_steps(''' 17 | Given the User has completed on-boarding 18 | And the User has accepted the Terms and Conditions 19 | And a PIN has been set up with "369369" 20 | And the Holder has selected to use biometrics to unlock BC Wallet 21 | ''') 22 | 23 | 24 | @given('they are on on the landing page') 25 | def step_impl(context): 26 | context.execute_steps(''' 27 | Then they land on the Home screen 28 | ''') 29 | 30 | 31 | @when('they select Give Feedback') 32 | def step_impl(context): 33 | context.thisFeedbackPage = context.thisHomePage.select_give_feedback() 34 | 35 | 36 | @then('they are taken to the Feedback form') 37 | def step_impl(context): 38 | assert context.thisFeedbackPage.on_this_page() 39 | # select exit to go back to the home page 40 | context.thisFeedbackPage.select_exit() 41 | # assert we are back on the home page 42 | assert context.thisHomePage.on_this_page() 43 | 44 | -------------------------------------------------------------------------------- /aries-mobile-tests/local_ios_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "capabilities": { 3 | "project": "BC Wallet", 4 | "build": "build-1", 5 | "platformName": "iOS", 6 | "app":"storage:filename=AriesBifold-76.ipa", 7 | "deviceName":"iPhone.*", 8 | "platformVersion":"15.3", 9 | "sessionCreationRetry" : "3", 10 | "sauceLabsImageInjectionEnabled": true, 11 | "autoAcceptAlerts": true, 12 | "fullReset": true 13 | } 14 | } 15 | 16 | { 17 | "platformName": "iOS", 18 | "appium:app": "storage:filename=AriesBifold.ipa", 19 | "appium:deviceName": "iPhone_11_15_real_us", 20 | "appium:platformVersion": "15.0", 21 | "browserName": "", 22 | "appium:automationName": "XCUITest", 23 | "appium:appiumVersion": "1.22.0", 24 | "sauce:options": { 25 | "appium:privateDevicesOnly": true, 26 | "appium:phoneOnly": true 27 | } 28 | } 29 | 30 | { 31 | "platformName": "iOS", 32 | "appium:platformVersion": "15.0.2", 33 | "appium:deviceName": "iPhone 6s", 34 | "appium:udid": "auto", 35 | "appium:bundleId": "ca.bc.gov.BCWallet", 36 | "appium:xcodeOrgId": "L796QSLV3E", 37 | "appium:xcodeSigningId": "Apple Distribution: Her Majesty the Queen in right of the Province of British Columbia (L796QSLV3E)", 38 | "appium:updatedWDABundleId": "ca.bc.gov.*", 39 | "appium:automationName": "XCUITest", 40 | "fullReset": false 41 | } -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/holder_get_invite_interface/pageobjects/bc_vc_invitation_request_credential_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from pageobjects.bc_wallet.holder_get_invite_interface.pageobjects.bc_vc_invitation_review_page import BCVCInvitationReviewPage 4 | 5 | # These classes can inherit from a BasePage to do commone setup and functions 6 | class BCVCInvitationRequestCredentialPage(WebBasePage): 7 | """CANdy UVP Issuer Review and Confirm page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Request Credential" 11 | #i_agree_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[2]/div[1]/div/div/div/div[1]/div/div') 12 | 13 | request_credential_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/form/div[2]/div/div[2]/input[3]') 14 | #//*[@id="app"]/div/main/div/div/div/div[2]/div[2]/div/a 15 | #/html/body/div/div/main/div/div/div/div[2]/div[2]/div/a 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | def request_credential(self): 22 | if self.on_this_page(): 23 | self.find_by(self.request_credential_locator).click() 24 | return BCVCInvitationReviewPage(self.driver) 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/information_sent_successfully.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | 4 | 5 | # These classes can inherit from a BasePage to do common setup and functions 6 | class InformationSentSuccessfullyPage(BasePage): 7 | """Information Sent Successfully page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Information sent successfully" 11 | on_this_page_locator = (AppiumBy.ID, "com.ariesbifold:id/SentProofRequest") 12 | back_to_home_locator = (AppiumBy.ID, "com.ariesbifold:id/BackToHome") 13 | done_locator = (AppiumBy.ID, "com.ariesbifold:id/Done") 14 | 15 | def on_this_page(self): 16 | return super().on_this_page(self.on_this_page_locator) 17 | 18 | def select_back_to_home(self): 19 | if self.on_this_page(): 20 | self.find_by(self.back_to_home_locator).click() 21 | from pageobjects.bc_wallet.home import HomePage 22 | return HomePage(self.driver) 23 | else: 24 | raise Exception(f"App not on the {type(self)} page") 25 | 26 | def select_done(self): 27 | if self.on_this_page(): 28 | self.find_by(self.done_locator).click() 29 | from pageobjects.bc_wallet.home import HomePage 30 | return HomePage(self.driver) 31 | else: 32 | raise Exception(f"App not on the {type(self)} page") 33 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/contact_remove_from_wallet.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | from pageobjects.basepage import WaitCondition 7 | 8 | 9 | class ContactRemoveFromWalletPage(BasePage): 10 | """Remove Contact from wallet page object""" 11 | 12 | # Locator 13 | on_this_page_text_locator = "Remove this Contact" 14 | remove_contact_locator = (AppiumBy.ID, "com.ariesbifold:id/ConfirmRemoveButton") 15 | 16 | def on_this_page(self): 17 | return super().on_this_page(self.on_this_page_text_locator) 18 | 19 | def select_remove_from_wallet(self): 20 | if self.on_this_page(): 21 | self.find_by(self.remove_contact_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 22 | 23 | # return a new page object for the Remove from wallet page 24 | from pageobjects.bc_wallet.contacts import ContactsPage 25 | return ContactsPage(self.driver) 26 | else: 27 | raise Exception(f"App not on the {type(self)}") 28 | 29 | def get_details_text(self) -> str: 30 | if self.on_this_page(): 31 | return self.driver.page_source 32 | else: 33 | raise Exception(f"App not on the {type(self)}") 34 | 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/feedback.py: -------------------------------------------------------------------------------- 1 | import os 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from pageobjects.basepage import BasePage 4 | 5 | class FeedbackPage(BasePage): 6 | """Create a Give Feedback web(internal to the app) page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Give Feedback" 10 | next_locator = (AppiumBy.ACCESSIBILITY_ID, "Next") 11 | exit_locator = (AppiumBy.ACCESSIBILITY_ID, "EXIT") # Works on iOS 12 | exit_locator_android = (AppiumBy.XPATH, "//android.widget.Button[@text='EXIT']") 13 | 14 | 15 | def on_this_page(self): 16 | return super().on_this_page(self.on_this_page_text_locator) 17 | 18 | 19 | def select_next(self): 20 | if self.on_this_page(): 21 | self.find_by(self.next_locator).click() 22 | # pass for now, no need to text Survey Monkey 23 | pass 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | def select_exit(self): 28 | if self.on_this_page(): 29 | if self.current_platform == 'Android': 30 | self.find_by(self.exit_locator_android).click() 31 | else: 32 | self.find_by(self.exit_locator).click() 33 | from pageobjects.bc_wallet.home import HomePage 34 | return HomePage(self.driver) 35 | else: 36 | raise Exception(f"App not on the {type(self)} page") 37 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/candy_uvp/pageobjects/issuing_credential_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | 5 | # These classes can inherit from a BasePage to do commone setup and functions 6 | class IssuingCredentialPage(WebBasePage): 7 | """CANdy UVP Issuer Issuing Credential page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Issuing Credential" 11 | on_this_page_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[1]') 12 | connected_text_locator = "Connected to the Issuer Agent" 13 | connected_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[2]/div[1]/div') 14 | accepted_credential_text_locator = "You accepted the Credential Offer" 15 | credential_issued_text_locator = "Your Credential has been Issued" 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_locator, timeout=20) 20 | 21 | def connected(self): 22 | if self.on_this_page(): 23 | return super().on_this_page(self.connected_locator) 24 | 25 | def credential_accepted(self): 26 | if self.on_this_page(): 27 | return super().on_this_page(self.accepted_credential_text_locator) 28 | 29 | def credential_issued(self): 30 | if self.on_this_page(): 31 | return super().on_this_page(self.credential_issued_text_locator) -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/proof_request_details.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | 7 | 8 | # These classes can inherit from a BasePage to do common setup and functions 9 | class ProofRequestDetailsPage(BasePage): 10 | """Proof Request Details page object""" 11 | 12 | # Locators 13 | on_this_page_text_locator = "which you can provide from:" 14 | back_locator = (AppiumBy.ID, "com.ariesbifold:id/back") 15 | credential_locator = (AppiumBy.ID, "com.ariesbifold:id/AttributeName") 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | def select_back(self): 22 | if self.on_this_page(): 23 | self.find_by(self.back_locator).click() 24 | from pageobjects.bc_wallet.proof_request import ProofRequestPage 25 | return ProofRequestPage(self.driver) 26 | else: 27 | raise Exception(f"App not on the {type(self)} page") 28 | 29 | def get_first_credential_details(self): 30 | if self.on_this_page(): 31 | credential_elements = self.find_multiple_by(self.credential_locator) 32 | return credential_elements[0].text 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/bc_services_card_review.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.bc_services_card_credential_issued import BCServicesCardCredentialIssuedPage 4 | from pageobjects.bc_wallet.information_sent_successfully import InformationSentSuccessfullyPage 5 | 6 | class BCServicesCardReviewPage(BasePage): 7 | """BC Services Card Login with Username and Password page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Review" 11 | i_agree_locator = (AppiumBy.ACCESSIBILITY_ID, "I agree to the above terms") 12 | send_credential_locator = (AppiumBy.ACCESSIBILITY_ID, "Send Credential") 13 | 14 | 15 | def on_this_page(self): 16 | return super().on_this_page(self.on_this_page_text_locator) 17 | 18 | def i_agree(self): 19 | if self.on_this_page(): 20 | #self.scroll_to_element(self.continue_locator[1]) 21 | self.find_by(self.i_agree_locator).click() 22 | return True 23 | else: 24 | raise Exception(f"App not on the {type(self)} page") 25 | 26 | 27 | def send_credential(self): 28 | if self.on_this_page(): 29 | self.find_by(self.send_credential_locator).click() 30 | #return BCServicesCardCredentialIssuedPage(self.driver) 31 | return InformationSentSuccessfullyPage(self.driver) 32 | else: 33 | raise Exception(f"App not on the {type(self)} page") 34 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/bc_wallet_showcase_main_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from pageobjects.basepage import WaitCondition 4 | from agent_factory.bc_showcase.pageobjects.who_do_you_want_to_be_page import WhoDoYouWantToBePage 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class BCWalletShowcaseMainPage(WebBasePage): 8 | """BC Wallet Showcase Main Entry page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "BC Wallet Showcase" 12 | #on_this_page_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[1]/div/div/h3[1]/strong') 13 | #get_started_locator = (By.XPATH, '//button[@class='bg-bcgov-blue dark:bg-bcgov-white text-bcgov-white dark:text-bcgov-black py-3 px-5 rounded-lg font-semibold shadow-sm dark:shadow-none select-none ']') 14 | get_started_locator = (By.CLASS_NAME, "bg-bcgov-blue") 15 | 16 | 17 | def on_this_page(self): 18 | #return super().on_this_page(self.on_this_page_locator, timeout=20) 19 | return super().on_this_page(self.on_this_page_text_locator, timeout=20) 20 | 21 | def select_get_started(self) -> WhoDoYouWantToBePage: 22 | if self.on_this_page(): 23 | self.find_by(self.get_started_locator).click() 24 | return WhoDoYouWantToBePage(self.driver) 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | 28 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/bc_services_card_login_vt_csn.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.bc_services_card_login_vt_pc import BCServicesCardLoginVTPCPage 4 | 5 | class BCServicesCardLoginVTCSNPage(BasePage): 6 | """BC Services Card Login Virtual Testing Card Serial Number Entry page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Card Serial Number" 10 | csn_locator = (AppiumBy.ACCESSIBILITY_ID, "Card Serial Number") 11 | #csn_locator = (AppiumBy.NAME, "Card Serial Number") 12 | continue_locator = (AppiumBy.ACCESSIBILITY_ID, "Continue") 13 | 14 | def on_this_page(self): 15 | return super().on_this_page(self.on_this_page_text_locator, 50) 16 | 17 | def enter_card_serial_number(self, csn): 18 | if self.on_this_page(): 19 | elements = self.find_multiple_by(self.csn_locator) 20 | #element = self.find_by(self.csn_locator) 21 | self.find_by(self.csn_locator).send_keys(csn) 22 | 23 | return True 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | def select_continue(self): 28 | if self.on_this_page(): 29 | self.find_by(self.continue_locator).click() 30 | 31 | # return the passcode entry page 32 | return BCServicesCardLoginVTPCPage(self.driver) 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/decline_credential_offer.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from selenium.webdriver.support.ui import WebDriverWait 3 | from selenium.webdriver.support import expected_conditions as EC 4 | from pageobjects.basepage import BasePage 5 | 6 | 7 | # These classes can inherit from a BasePage to do common setup and functions 8 | class DeclineCredentialOfferPage(BasePage): 9 | """Comfirm the decline of a Credential Offer page object""" 10 | 11 | # Locators 12 | on_this_page_text_locator = "Decline credential offer?" 13 | no_go_back_locator = (AppiumBy.ID, "com.ariesbifold:id/CancelDeclineButton") 14 | confirm_locator = (AppiumBy.ID, "com.ariesbifold:id/ConfirmDeclineButton") 15 | 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | 20 | def select_decline(self): 21 | if self.on_this_page(): 22 | self.find_by(self.confirm_locator).click() 23 | from pageobjects.bc_wallet.home import HomePage 24 | return HomePage(self.driver) 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | 28 | def select_no_go_back(self): 29 | if self.on_this_page(): 30 | self.find_by(self.no_go_back_locator).click() 31 | from pageobjects.bc_wallet.credential_offer import CredentialOfferPage 32 | return CredentialOfferPage(self.driver) 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | 36 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/get_person_credential.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.basepage import WaitCondition 4 | 5 | 6 | 7 | # These classes can inherit from a BasePage to do common setup and functions 8 | class GetPersonCredentialPage(BasePage): 9 | """Get Person Credential page object""" 10 | 11 | # Locators 12 | on_this_page_text_locator = "Person Credential" 13 | #get_your_person_credential_locator = (AppiumBy.ACCESSIBILITY_ID, "Get your Person credential") 14 | get_your_person_credential_locator = (AppiumBy.ID, "com.ariesbifold:id/GetYourPersonCredential") 15 | #get_this_later_locator = (AppiumBy.ACCESSIBILITY_ID, "Get this later") 16 | get_this_later_locator = (AppiumBy.ID, "com.ariesbifold:id/GetThisLater") 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | def select_get_your_person_credential(self, scroll=False): 22 | if self.on_this_page(): 23 | self.find_by(self.get_your_person_credential_locator).click() 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | def select_decline(self): 28 | if self.on_this_page(): 29 | self.find_by(self.get_this_later_locator).click() 30 | from pageobjects.bc_wallet.home import HomePage 31 | return HomePage(self.driver) 32 | else: 33 | raise Exception(f"App not on the {type(self)} page") 34 | 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bifold/pinsetup.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.mobileby import MobileBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | from pageobjects.bifold.home import HomePage 7 | 8 | class PINSetupPage(BasePage): 9 | """PIN Setup page object""" 10 | 11 | # Locators 12 | title_locator = "PIN" 13 | first_pin_locator = "Enter Pin" 14 | second_pin_locator = "Re-Enter Pin" 15 | create_pin_button_locator = "Create" 16 | 17 | def enter_pin(self, pin): 18 | if self.on_the_right_page(self.title_locator): 19 | self.find_by_accessibility_id(self.first_pin_locator).send_keys(pin) 20 | return True 21 | else: 22 | raise Exception(f"App not on the {self.title_locator} page") 23 | 24 | def enter_second_pin(self, pin): 25 | if self.on_the_right_page(self.title_locator): 26 | self.find_by_accessibility_id(self.second_pin_locator).send_keys(pin) 27 | return True 28 | else: 29 | raise Exception(f"App not on the {self.title_locator} page") 30 | 31 | def create_pin(self): 32 | if self.on_the_right_page(self.title_locator): 33 | self.find_by_accessibility_id(self.create_pin_button_locator).click() 34 | 35 | # return a new page object? The Home page. 36 | return HomePage(self.driver) 37 | else: 38 | raise Exception(f"App not on the {self.title_locator} page") 39 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/candy_uvp/pageobjects/review_and_confirm_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from pageobjects.basepage import WaitCondition 4 | from agent_factory.candy_uvp.pageobjects.connect_with_issuer_page import ConnectWithIssuerPage 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class ReviewAndConfirmPage(WebBasePage): 8 | """CANdy UVP Issuer Review and Confirm page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Review and Confirm" 12 | i_confirm_locator = (By.CLASS_NAME, "v-input--selection-controls__ripple") 13 | #proceed_button_locator = (By.CLASS_NAME, "v-btn__content") 14 | proceed_button_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[3]/div[2]/div[2]/a/span') 15 | 16 | 17 | def on_this_page(self): 18 | #print(self.driver.page_source) 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | 21 | def select_i_confirm(self): 22 | # if self.on_this_page(): 23 | self.find_by(self.i_confirm_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 24 | return True 25 | # else: 26 | # raise Exception(f"App not on the {type(self)} page") 27 | 28 | 29 | def proceed(self): 30 | if self.on_this_page(): 31 | self.find_by(self.proceed_button_locator).click() 32 | return ConnectWithIssuerPage(self.driver) 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/scan.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from pageobjects.basepage import BasePage 4 | from pageobjects.basepage import WaitCondition 5 | 6 | 7 | # These classes can inherit from a BasePage to do common setup and functions 8 | class ScanPage(BasePage): 9 | """Camera Scan page object""" 10 | 11 | # Locators 12 | close_locator = (AppiumBy.ID, "com.ariesbifold:id/ScanClose") 13 | flash_locator = (AppiumBy.ID, "com.ariesbifold:id/ScanTorch") 14 | error_locator = (AppiumBy.ID, "com.ariesbifold:id/ErrorText") 15 | 16 | def on_this_page(self): 17 | return super().on_this_page(self.close_locator) 18 | 19 | def get_error(self) -> str: 20 | return self.find_by(self.error_locator).text 21 | 22 | def select_close(self): 23 | if self.on_this_page(): 24 | try: 25 | self.find_by(self.close_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 26 | except: 27 | logging.warning("Soft Assert: Could not select close button on scan page. Assuming scan was successful and is connecting.") 28 | # This goes to the page that called it could be one of may app pages. Let the test handle it. 29 | else: 30 | # we may have already moved on from this page. 31 | logging.warning(f"Soft Assert: App not on the {type(self)} page. Assuming scan was successful and is connecting.") 32 | 33 | def select_flash(self): 34 | self.find_by(self.flash_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 35 | 36 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/are_you_sure_decline_proof_request.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | 7 | 8 | # These classes can inherit from a BasePage to do common setup and functions 9 | class AreYouSureDeclineProofRequestPage(BasePage): 10 | """Comfirm the decline of Proof Request page object""" 11 | 12 | # Locators 13 | on_this_page_text_locator = "Are you sure you want to decline this proof request" 14 | no_go_back_locator = (AppiumBy.ID, "com.ariesbifold:id/AbortDeclineButton") 15 | confirm_locator = (AppiumBy.ID, "com.ariesbifold:id/ConfirmDeclineButton") 16 | 17 | 18 | def on_this_page(self): 19 | #print(self.driver.page_source) 20 | return super().on_this_page(self.on_this_page_text_locator) 21 | 22 | def select_confirm(self): 23 | if self.on_this_page(): 24 | self.find_by(self.confirm_locator).click() 25 | from pageobjects.bc_wallet.home import HomePage 26 | return HomePage(self.driver) 27 | else: 28 | raise Exception(f"App not on the {type(self)} page") 29 | 30 | def select_no_go_back(self): 31 | if self.on_this_page(): 32 | self.find_by(self.no_go_back_locator).click() 33 | from pageobjects.bc_wallet.proof_request import ProofRequestPage 34 | return ProofRequestPage(self.driver) 35 | else: 36 | raise Exception(f"App not on the {type(self)} page") 37 | 38 | -------------------------------------------------------------------------------- /aries-mobile-tests/Dockerfile.dev-harness: -------------------------------------------------------------------------------- 1 | FROM python:3.9-bullseye AS base 2 | 3 | ARG TARGETARCH 4 | 5 | # Install sudo 6 | RUN apt-get update && \ 7 | apt-get install -y sudo chromium wget unzip openjdk-11-jdk && \ 8 | apt-get clean && \ 9 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 10 | 11 | FROM base 12 | 13 | # workaround for chromium crash reports warning 14 | RUN mkdir -p "/root/.config/chromium/Crash Reports/pending" 15 | 16 | # Set JAVA_HOME environment variable 17 | ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-${TARGETARCH} 18 | ENV PATH=$PATH:$JAVA_HOME/bin 19 | 20 | # Download and unzip Android SDK command line tools 21 | RUN mkdir -p /usr/local/android-sdk && \ 22 | wget -q https://dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip && \ 23 | unzip commandlinetools-linux-7302050_latest.zip -d /usr/local/android-sdk && \ 24 | rm commandlinetools-linux-7302050_latest.zip 25 | 26 | # Move unzipped "cmdline-tools" directory to "cmdline-tools/latest" 27 | RUN mv /usr/local/android-sdk/cmdline-tools /usr/local/android-sdk/cmdline-tools-temp && \ 28 | mkdir -p /usr/local/android-sdk/cmdline-tools/latest && \ 29 | mv /usr/local/android-sdk/cmdline-tools-temp/* /usr/local/android-sdk/cmdline-tools/latest && \ 30 | rm -r /usr/local/android-sdk/cmdline-tools-temp 31 | 32 | # Set environment variable 33 | ENV ANDROID_HOME=/usr/local/android-sdk 34 | ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools 35 | 36 | # Accept Android SDK licenses 37 | RUN yes | sdkmanager --licenses && \ 38 | sdkmanager "platform-tools" && \ 39 | yes | sdkmanager --install "build-tools;30.0.3" 40 | 41 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/bc_services_card_login.py: -------------------------------------------------------------------------------- 1 | import os 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from pageobjects.basepage import BasePage 4 | from pageobjects.bc_wallet.bc_services_card_login_vt_csn import BCServicesCardLoginVTCSNPage 5 | from pageobjects.bc_wallet.bc_services_card_login_unpw import BCServicesCardLoginUNPWPage 6 | 7 | class BCServicesCardLoginPage(BasePage): 8 | """Create a BC Digitial ID web(internal to the app) page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "BC Services Card Login" 12 | login_with_virtual_testing_locator = (AppiumBy.ACCESSIBILITY_ID, "Log in with Virtual testing") 13 | test_with_username_and_password_locator = (AppiumBy.ACCESSIBILITY_ID, "Log in with Test with username and password") 14 | 15 | 16 | def on_this_page(self): 17 | timeout = 50 18 | if "Local" in os.environ['DEVICE_CLOUD']: 19 | timeout = 100 20 | return super().on_this_page(self.on_this_page_text_locator, timeout) 21 | 22 | 23 | def select_virtual_testing(self): 24 | if self.on_this_page(): 25 | self.find_by(self.login_with_virtual_testing_locator).click() 26 | return BCServicesCardLoginVTCSNPage(self.driver) 27 | else: 28 | raise Exception(f"App not on the {type(self)} page") 29 | 30 | def select_test_with_username_password(self): 31 | if self.on_this_page(): 32 | self.find_by(self.test_with_username_and_password_locator).click() 33 | return BCServicesCardLoginUNPWPage(self.driver) 34 | else: 35 | raise Exception(f"App not on the {type(self)} page") 36 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/onboarding_biometrics.py: -------------------------------------------------------------------------------- 1 | import os 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from pageobjects.basepage import BasePage 4 | from pageobjects.bc_wallet.enable_notifications import EnableNotificationsPage 5 | 6 | class OnboardingBiometricsPage(BasePage): 7 | """Onboarding Biometrics page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Use biometrics to unlock wallet" 11 | on_this_page_locator = (AppiumBy.ID, "com.ariesbifold:id/ToggleBiometrics") 12 | use_biometrics_toggle_locator = (AppiumBy.ID, "com.ariesbifold:id/ToggleBiometrics") 13 | continue_button_locator = (AppiumBy.ID, "com.ariesbifold:id/Continue") 14 | 15 | 16 | def on_this_page(self): 17 | timeout = 50 18 | if "Local" in os.environ['DEVICE_CLOUD']: 19 | timeout = 100 20 | return super().on_this_page(self.on_this_page_locator, timeout) 21 | 22 | # this no longer exists in build 305 but leaving it in as it is uncertain if it will come back. 23 | def select_biometrics(self): 24 | if self.on_this_page(): 25 | self.find_by(self.use_biometrics_toggle_locator).click() 26 | return True 27 | else: 28 | raise Exception(f"App not on the {type(self)} page") 29 | 30 | 31 | def select_continue(self): 32 | if self.on_this_page(): 33 | self.find_by(self.continue_button_locator).click() 34 | 35 | # return the wallet enable notifications page 36 | return EnableNotificationsPage(self.driver) 37 | 38 | else: 39 | raise Exception(f"App not on the {type(self)} page") 40 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_vp/pageobjects/authenticate_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from agent_factory.bc_vp.pageobjects.invites_page import InvitesPage 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class AuthenticatePage(WebBasePage): 8 | """BC VP Issuer GitHub Authenticate page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Sign in to GitHub" 12 | username_locator = (By.ID, 'login_field') 13 | password_locator = (By.ID, 'password') 14 | #sign_in_locator = (By.CLASS_NAME, 'btn btn-primary btn-block js-sign-in-button') 15 | sign_in_locator = (By.XPATH, '//*[@id="login"]/div[3]/form/div/input[11]') 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | 20 | def enter_username(self, username): 21 | if self.on_this_page(): 22 | self.find_by(self.username_locator).send_keys(username) 23 | return True 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | def enter_password(self, password): 28 | if self.on_this_page(): 29 | self.find_by(self.password_locator).send_keys(password) 30 | return True 31 | else: 32 | raise Exception(f"App not on the {type(self)} page") 33 | 34 | def sign_in(self): 35 | if self.on_this_page(): 36 | self.find_by(self.sign_in_locator).click() 37 | return InvitesPage(self.driver) 38 | else: 39 | raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/contacts.py: -------------------------------------------------------------------------------- 1 | import time 2 | from appium.webdriver.common.appiumby import AppiumBy 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from pageobjects.basepage import BasePage 6 | from pageobjects.bc_wallet.contact import ContactPage 7 | 8 | 9 | class ContactsPage(BasePage): 10 | """Contacts page object""" 11 | 12 | # Locators 13 | on_this_page_text_locator = "Contacts" 14 | contact_locator = (AppiumBy.ID, "com.ariesbifold:id/Contact") 15 | 16 | def on_this_page(self): 17 | return super().on_this_page(self.on_this_page_text_locator) 18 | 19 | def select_contact(self, name:str): 20 | if self.on_this_page(): 21 | contacts = self.find_multiple_by(self.contact_locator) 22 | # click the first contact for now since the UI will get reworked and will get the contact.text at that time. 23 | contacts[0].click() 24 | # for contact in contacts: 25 | # if contact.text == name: 26 | # contact.click() 27 | # return a new page object for the Contacts page 28 | return ContactPage(self.driver) 29 | # return True 30 | # raise Exception(f"Contact {name} not found") 31 | else: 32 | raise Exception(f"App not on the {type(self)}") 33 | 34 | def is_contact_present(self, name) -> bool: 35 | if self.on_this_page(): 36 | if name in self.driver.page_source: 37 | return True 38 | else: 39 | return False 40 | else: 41 | raise Exception(f"App not on the {type(self)}") 42 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/holder_get_invite_interface/pageobjects/bc_vc_invitation_agree_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from pageobjects.bc_wallet.holder_get_invite_interface.pageobjects.bc_vc_invitation_request_credential_page import BCVCInvitationRequestCredentialPage 4 | 5 | # These classes can inherit from a BasePage to do commone setup and functions 6 | class BCVCInvitationAgreePage(WebBasePage): 7 | """CANdy UVP Issuer Review and Confirm page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Person credential invitation" 11 | #i_agree_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[2]/div[1]/div/div/div/div[1]/div/div') 12 | i_agree_locator = (By.XPATH, '//div[@class="v-input--selection-controls__ripple"]') 13 | 14 | #agree_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[2]/div[2]/div/a') 15 | agree_locator = (By.XPATH, '//a[@class="v-btn v-btn--outlined v-btn--router theme--light v-size--default success--text"]') 16 | 17 | 18 | def on_this_page(self): 19 | return super().on_this_page(self.on_this_page_text_locator, timeout=1000) 20 | 21 | def i_agree(self): 22 | if self.on_this_page(): 23 | self.find_by(self.i_agree_locator).click() 24 | return True 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | 28 | 29 | def agree(self): 30 | if self.on_this_page(): 31 | self.find_by(self.agree_locator).click() 32 | return BCVCInvitationRequestCredentialPage(self.driver) 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/candy_uvp/pageobjects/connect_with_issuer_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | #from candy_uvp.pageobjects.connect_with_issuer_page import ConnectWithIssuerPage 7 | 8 | # These classes can inherit from a BasePage to do commone setup and functions 9 | class ConnectWithIssuerPage(WebBasePage): 10 | """CANdy UVP Issuer Connect with Issuer page object""" 11 | 12 | # Locators 13 | on_this_page_text_locator = "Connect with Issuer" 14 | qr_code_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/img') 15 | 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | 20 | # def get_qr_code(self): 21 | # # if self.on_this_page(): 22 | # qrcode_element = self.find_by(self.qr_code_locator, wait_condition=WaitCondition.VISIBILITY_OF_ELEMENT_LOCATED) 23 | # self.driver.save_screenshot("qrcode.png") 24 | # #qrcode = Image.open("qrcode.png") 25 | # qrcode = base64.b64encode(open("qrcode.png", "rb").read()) 26 | # return qrcode.decode('utf-8') 27 | 28 | # # else: 29 | # # raise Exception(f"App not on the {type(self)} page") 30 | 31 | def get_qr_code(self): 32 | try: 33 | qr_code = self.find_by(self.qr_code_locator, wait_condition=WaitCondition.VISIBILITY_OF_ELEMENT_LOCATED) 34 | except Exception as e: 35 | if not self.on_this_page(): 36 | raise Exception(f"App not on the {type(self)} page") 37 | else: 38 | raise e 39 | return qr_code 40 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/welcome_to_bc_wallet.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.basepage import WaitCondition 4 | from pageobjects.bc_wallet.connecting import ConnectingPage 5 | from pageobjects.bc_wallet.settings import SettingsPage 6 | from pageobjects.bc_wallet.credential_offer import CredentialOfferPage 7 | from pageobjects.bc_wallet.proof_request import ProofRequestPage 8 | from pageobjects.bc_wallet.get_person_credential import GetPersonCredentialPage 9 | from pageobjects.bc_wallet.credential_details import CredentialDetailsPage 10 | from time import sleep 11 | 12 | 13 | class WelcomeToBCWalletModal(BasePage): 14 | """Welcome to BC Wallet Modal page object""" 15 | 16 | # Locators 17 | on_this_page_text_locator = "Welcome to BC Wallet" 18 | dismiss_button_locator = (AppiumBy.ID, "com.ariesbifold:id/Dismiss") 19 | use_app_guides_button_locator = (AppiumBy.ID, "com.ariesbifold:id/Primary") 20 | dont_use_app_guides_button_locator = (AppiumBy.ID, "com.ariesbifold:id/Secondary") 21 | 22 | def on_this_page(self): 23 | return super().on_this_page(self.on_this_page_text_locator) 24 | 25 | def is_displayed(self): 26 | return self.on_this_page() 27 | 28 | def select_dismiss(self): 29 | self.find_by(self.dismiss_button_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 30 | 31 | def select_use_app_guides(self): 32 | self.find_by(self.use_app_guides_button_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 33 | 34 | def select_dont_use_app_guides(self): 35 | self.find_by(self.dont_use_app_guides_button_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/candy_uvp/pageobjects/terms_of_service_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from pageobjects.basepage import WaitCondition 4 | from agent_factory.candy_uvp.pageobjects.request_credential_page import RequestCredentialPage 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class TermsOfServicePage(WebBasePage): 8 | """CANdy UVP Issuer Terms of Service page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Terms of Service" 12 | on_this_page_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[1]/div/div/h3[1]/strong') 13 | i_agree_locator = (By.CLASS_NAME, 'v-input--selection-controls__ripple') 14 | agree_button_locator = (By.CLASS_NAME, "v-btn__content") 15 | 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_locator, timeout=20) 19 | #return super().on_this_page(self.on_this_page_text_locator, timeout=20) 20 | 21 | def select_i_agree(self): 22 | if self.on_this_page(): 23 | self.find_by(self.i_agree_locator).click() 24 | return True 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | 28 | 29 | def agree(self): 30 | if self.on_this_page(): 31 | self.find_by(self.agree_button_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 32 | 33 | # Maybe should check if it is checked or let the test call is_accept_checked()? 34 | # return a new page object? The Pin Setup page. 35 | return RequestCredentialPage(self.driver) 36 | else: 37 | raise Exception(f"App not on the {type(self)} page") 38 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/onboarding_a_different_smart_wallet.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.onboarding_digital_credentials import OnboardingDigitalCredentialsPage 4 | from pageobjects.bc_wallet.termsandconditions import TermsAndConditionsPage 5 | 6 | # These classes can inherit from a BasePage to do common setup and functions 7 | class OnboardingADifferentSmartWalletPage(BasePage): 8 | """Onboarding A Different Smart Wallet Screen page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "A different smart wallet" 12 | on_this_page_locator = (AppiumBy.NAME, "A different smart wallet") 13 | #skip_locator = (AppiumBy.ID, "com.ariesbifold:id/Skip") 14 | next_locator = (AppiumBy.ID, "com.ariesbifold:id/Next") 15 | 16 | def on_this_page(self): 17 | if self.current_platform == "Android": 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | return super().on_this_page(self.on_this_page_locator) 20 | 21 | def get_onboarding_text(self): 22 | if self.on_this_page(): 23 | pass 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | def select_next(self): 28 | if self.on_this_page(): 29 | self.find_by(self.next_locator).click() 30 | return OnboardingDigitalCredentialsPage(self.driver) 31 | else: 32 | raise Exception(f"App not on the {type(self)} page") 33 | 34 | # def select_skip(self): 35 | # if self.on_this_page(): 36 | # self.find_by(self.skip_locator).click() 37 | # return TermsAndConditionsPage(self.driver) 38 | # else: 39 | # raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/holder_get_invite_interface/pageobjects/bc_vc_invitation_review_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from pageobjects.bc_wallet.holder_get_invite_interface.pageobjects.connect_with_issuer_page import ConnectWithIssuerPage 4 | 5 | # These classes can inherit from a BasePage to do commone setup and functions 6 | class BCVCInvitationReviewPage(WebBasePage): 7 | """CANdy UVP Issuer Review and Confirm page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Review and Confirm" 11 | #i_agree_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[2]/div[1]/div/div/div/div[1]/div/div') 12 | i_confirm_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[3]/div[1]/div[2]/div/div/div[1]/div/div') 13 | #self.find_by((By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[2]/div[1]/div/div/div/div[1]/div/div')).click() 14 | 15 | proceed_locator = (By.XPATH, '//*[@id="app"]/div/main/div/div/div/div[3]/div[2]/div[2]/a') 16 | #//*[@id="app"]/div/main/div/div/div/div[2]/div[2]/div/a 17 | #/html/body/div/div/main/div/div/div/div[2]/div[2]/div/a 18 | 19 | 20 | def on_this_page(self): 21 | return super().on_this_page(self.on_this_page_text_locator) 22 | 23 | def i_confirm(self): 24 | if self.on_this_page(): 25 | self.find_by(self.i_confirm_locator).click() 26 | return True 27 | else: 28 | raise Exception(f"App not on the {type(self)} page") 29 | 30 | 31 | def proceed(self): 32 | if self.on_this_page(): 33 | self.find_by(self.proceed_locator).click() 34 | return ConnectWithIssuerPage(self.driver) 35 | else: 36 | raise Exception(f"App not on the {type(self)} page") 37 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/onboarding_private_confidential.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.termsandconditions import TermsAndConditionsPage 4 | 5 | # These classes can inherit from a BasePage to do common setup and functions 6 | class OnboardingPrivateConfidentialPage(BasePage): 7 | """Onboarding Private and Confidential Screen page object""" 8 | 9 | # Locators 10 | on_this_page_text_locator = "Private and confidential" 11 | on_this_page_locator = (AppiumBy.NAME, "Private and confidential") 12 | back_locator = (AppiumBy.ID, "com.ariesbifold:id/Back") 13 | get_started_locator = (AppiumBy.ID, "com.ariesbifold:id/GetStarted") 14 | 15 | 16 | def on_this_page(self): 17 | if self.current_platform == "Android": 18 | return super().on_this_page(self.on_this_page_text_locator) 19 | return super().on_this_page(self.on_this_page_locator) 20 | 21 | def get_onboarding_text(self): 22 | if self.on_this_page(): 23 | pass 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | 28 | def select_back(self): 29 | if self.on_this_page(): 30 | self.find_by(self.back_locator).click() 31 | from pageobjects.bc_wallet.onboarding_digital_credentials import OnboardingDigitalCredentialsPage 32 | return OnboardingDigitalCredentialsPage(self.driver) 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | 36 | def select_get_started(self): 37 | if self.on_this_page(): 38 | self.find_by(self.get_started_locator).click() 39 | return TermsAndConditionsPage(self.driver) 40 | else: 41 | raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/issuer_agent_interface.py: -------------------------------------------------------------------------------- 1 | """ 2 | Absctact Base Class for actual issuer agent interfaces to implement 3 | """ 4 | 5 | from abc import ABC, abstractmethod 6 | 7 | class IssuerAgentInterface(ABC): 8 | 9 | def __init__(self, endpoint): 10 | self.endpoint = endpoint 11 | 12 | # Default schema and cred 13 | DEFAULT_SCHEMA_TEMPLATE = { 14 | "schema_name": "test_schema.", 15 | "schema_version": "1.0.0", 16 | "attributes": ["attr_1", "attr_2", "attr_3"], 17 | } 18 | 19 | DEFAULT_CRED_DEF_TEMPLATE = { 20 | "support_revocation": False, 21 | "schema_id": "", 22 | #"tag": str(randint(1, 10000)), 23 | "tag": "Default AATH Issuer Credential Definition", 24 | } 25 | 26 | DEFAULT_CREDENTIAL_ATTR_TEMPLATE = [ 27 | {"name": "attr_1", "value": "value_1"}, 28 | {"name": "attr_2", "value": "value_2"}, 29 | {"name": "attr_3", "value": "value_3"}, 30 | ] 31 | 32 | @abstractmethod 33 | def get_issuer_type(self) -> str: 34 | """return the type of issuer you are ie 'AATHIssuer' or 'CANdyWebIssuer'""" 35 | 36 | @abstractmethod 37 | def create_invitation(self, oob: bool = False, print_qrcode: bool = False, save_qrcode: bool = False): 38 | """create an invitation and return the json back to the caller """ 39 | # Should we return the actual QR code as an image here? Would make the tests easier 40 | 41 | @abstractmethod 42 | def connected(self) -> bool: 43 | """return True/False indicating if this issuer is connected to the wallet holder """ 44 | 45 | @abstractmethod 46 | def send_credential(self, version: int = 1, credential_data=None, revokable: bool = False): 47 | """create an invitation and return the json back to the caller """ 48 | 49 | @abstractmethod 50 | def revoke_credential(self): 51 | """revoke a credential""" -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Start Aries Agents", 8 | "type": "shell", 9 | "command": "cd ~/Projects/BC.gov/aries-agent-test-harness && LEDGER_URL_CONFIG=http://test.bcovrin.vonx.io TAILS_SERVER_URL_CONFIG=https://tails.vonx.io AGENT_CONFIG_FILE=/aries-backchannels/acapy/auto_issuer_config.yaml ./manage start -a acapy-main -b acapy-main -n" 10 | }, 11 | { 12 | "label": "Stop Aries Agents", 13 | "type": "shell", 14 | "command": "cd ~/Projects/BC.gov/aries-agent-test-harness && ./manage stop" 15 | }, 16 | { 17 | "label": "Start Appium Server in Dev Container", 18 | "type": "shell", 19 | "command": "appium --base-path /wd/hub --allow-cors", 20 | "isBackground": true, 21 | "problemMatcher": { 22 | "owner": "custom", 23 | "pattern": { 24 | "regexp": ".*" 25 | }, 26 | "background": { 27 | "activeOnStart": true, 28 | "beginsPattern": "^\\[Appium\\] Welcome to Appium v.*", 29 | "endsPattern": "^\\[Appium\\] Appium REST http interface listener started on 0.0.0.0:4723" 30 | } 31 | }, 32 | "presentation": { 33 | "reveal": "always", 34 | "panel": "new" 35 | } 36 | }, 37 | { 38 | "label": "Stop Appium Server", 39 | "type": "shell", 40 | "command": "pkill -2 -f appium", 41 | "presentation": { 42 | "reveal": "always", 43 | "panel": "new" 44 | } 45 | } 46 | ] 47 | } -------------------------------------------------------------------------------- /aries-mobile-tests/features/bc_wallet/change_language.feature: -------------------------------------------------------------------------------- 1 | # https://app.zenhub.com/workspaces/bc-wallet-6148e7423fe04b001444e2bd/issues/bcgov/bc-wallet-mobile/74 2 | @Language @bc_wallet @Story_74 @normal 3 | Feature: Language 4 | In order to use the app in my preferred language 5 | As a holder 6 | I want to be able to change the language of the app 7 | 8 | 9 | @T001-Language @wip @AcceptanceTest 10 | Scenario Outline: Existing holder changes language 11 | Given the holder has initially selected as the language 12 | And the holder is in the language settings 13 | When the ID holder selects 14 | Then the language changes automatically to 15 | 16 | Examples: 17 | | language | different language | 18 | | English | French | 19 | | French | English | 20 | 21 | 22 | @T002-Language @wip @FunctionalTest 23 | Scenario Outline: Holder quits app after changing language 24 | Given the holder has initially selected as the language 25 | And the holder is in the language settings 26 | And they have selected a 27 | When they quit the app 28 | And they reopen the app 29 | Then the language is set to 30 | 31 | Examples: 32 | | language | different language | 33 | | English | French | 34 | | French | English | 35 | 36 | 37 | 38 | # @T00X-Language @wip @OutOfScope 39 | # Scenario Outline: New User sets intial language 40 | # Given the new user has opened the app for the first time 41 | # And they are in the initial select language screen 42 | # When the new user selects 43 | # Then the new user is brought to the onboarding screen in the they selected 44 | 45 | # Examples: 46 | # | language | 47 | # | English | 48 | # | French | -------------------------------------------------------------------------------- /aries-mobile-tests/features/bc_wallet/terms.feature: -------------------------------------------------------------------------------- 1 | # https://app.zenhub.com/workspaces/bc-wallet-6148e7423fe04b001444e2bd/issues/hyperledger/aries-mobile-agent-react-native/148 2 | @TermsAndConditions @bc_wallet @Story_148 @normal 3 | Feature: Terms and Conditions 4 | In order to understand my legal obligations when using the app 5 | As a new holder 6 | I want to review the terms and conditions 7 | 8 | @T001-TandC @AcceptanceTest @normal 9 | Scenario: New User Accepts Terms and Conditions 10 | Given the User has completed on-boarding 11 | And the User is on the Terms and Conditions screen 12 | When the users accepts the Terms and Conditions 13 | And the User continues from reviewing Secure your Wallet 14 | Then the user transitions to the PIN creation screen 15 | 16 | @T002-TandC @AcceptanceTest @normal @depricated @wip 17 | Scenario: New User Rejects Terms and Conditions 18 | Given the User has completed on-boarding 19 | And the User is on the Terms and Conditions screen 20 | When the User presses the back button 21 | Then the User goes back to the last on-boarding screen they viewed 22 | 23 | @T003-TandC @FunctionalTest @low 24 | Scenario: New User Rejects Terms and Conditions and returns to app to accept 25 | Given the User has completed on-boarding 26 | And the User was on the Terms and Conditions screen 27 | When they have closed the app 28 | And they relaunch the app 29 | Then they can accept the Terms and conditions 30 | 31 | # This is a content test, may be worth while autoamting once the text solidifies but would be fragile otherwise. 32 | # @T004-TandC @wip @AcceptanceTest @low @Story_118 @content 33 | # Given the User has completed on-boarding 34 | # When the User is on the Terms and Conditions Screen 35 | # Then the Holder is presented with content that matches exactly the terms and conditions within the following document: 36 | # https://app.zenhub.com/files/429950091/85f29998-e55e-417e-a8c0-b00531b3caba/download -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/bc_services_card_login_unpw.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.bc_services_card_review import BCServicesCardReviewPage 4 | 5 | class BCServicesCardLoginUNPWPage(BasePage): 6 | """BC Services Card Login with Username and Password page object""" 7 | 8 | # Locators 9 | on_this_page_text_locator = "Email or username" 10 | username_locator = (AppiumBy.ACCESSIBILITY_ID, "Email or username") 11 | #username_locator = (AppiumBy.CLASS_NAME, "XCUIElementTypeTextField") 12 | #(AppiumBy.XPATH, "//[contains('XCUIElementTypeTextField')]") 13 | password_locator = (AppiumBy.ACCESSIBILITY_ID, "Password") 14 | #password_locator = (AppiumBy.CLASS_NAME, "XCUIElementTypeSecureTextField") 15 | continue_locator = (AppiumBy.ACCESSIBILITY_ID, "Continue") 16 | 17 | def on_this_page(self): 18 | return super().on_this_page(self.on_this_page_text_locator, 50) 19 | 20 | def enter_username(self, username): 21 | if self.on_this_page(): 22 | self.find_by(self.username_locator).send_keys(username) 23 | return True 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | def enter_password(self, password): 28 | if self.on_this_page(): 29 | self.find_by(self.password_locator).send_keys(password) 30 | return True 31 | else: 32 | raise Exception(f"App not on the {type(self)} page") 33 | 34 | def select_continue(self): 35 | if self.on_this_page(): 36 | self.find_by(self.continue_locator).click() 37 | 38 | # return the BC Services Card Card Account Review Credential details page 39 | return BCServicesCardReviewPage(self.driver) 40 | else: 41 | raise Exception(f"App not on the {type(self)} page") 42 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/termsandconditions.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage, WaitCondition 3 | from pageobjects.bc_wallet.why_you_need_a_pin import WhyYouNeedAPINPage 4 | 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class TermsAndConditionsPage(BasePage): 8 | """Terms and Conditions page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Terms of Use" 12 | on_this_page_locator = (AppiumBy.NAME, "Terms of Use") 13 | accept_button_locator = (AppiumBy.ID, "com.ariesbifold:id/Accept") 14 | accept_button_aid_locator = (AppiumBy.ACCESSIBILITY_ID, "Accept") 15 | 16 | 17 | def on_this_page(self): 18 | if self.current_platform == "Android": 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | return super().on_this_page(self.on_this_page_locator) 21 | 22 | def select_accept(self): 23 | if self.on_this_page(): 24 | # As of 2024-03-21 the app no longer needs to scroll to get to the accept button. BC Wallet Build 1603 25 | # Leaving this code here just in case it is needed in the future, and for reference on scrolling. 26 | # try: 27 | # self.scroll_to_element(self.back_aid_locator[1]) 28 | # except: 29 | # # Sometimes it seems that scrolling may try to access the element by accessibility id before it appears 30 | # # if we get this failure then just sleep and try again. 31 | # sleep(5) 32 | # self.scroll_to_element(self.back_aid_locator[1]) 33 | self.find_by(self.accept_button_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 34 | return WhyYouNeedAPINPage(self.driver) 35 | else: 36 | raise Exception(f"App not on the {type(self)} page") 37 | -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/allownotifications.py: -------------------------------------------------------------------------------- 1 | from pageobjects.basepage import BasePage 2 | from pageobjects.bc_wallet.home import HomePage 3 | 4 | # These classes can inherit from a BasePage to do commone setup and functions 5 | class AllowNotificationsPage(BasePage): 6 | """Allow Notifications page object""" 7 | 8 | # Locators 9 | # TODO: We could create a locator module that has all the locators. Given a specific app we could load the locators for that app. 10 | # not sure this would be a use case that would be common. Leaving locators with the page objects for now. 11 | title_locator = "Allow notifications" 12 | continue_button_locator = "Continue" 13 | skip_for_now_button_locator = "Skip for now" 14 | back_locator = "Back" 15 | 16 | 17 | def select_continue(self): 18 | if self.on_the_right_page(self.title_locator): 19 | self.find_by_accessibility_id(self.continue_button_locator).click() 20 | return HomePage(self.driver) 21 | else: 22 | raise Exception(f"App not on the {type(self)} page") 23 | 24 | 25 | def select_skip_for_now(self): 26 | if self.on_the_right_page(self.title_locator): 27 | self.find_by_accessibility_id(self.skip_for_now_button_locator).click() 28 | 29 | # Maybe should check if it is checked or let the test call is_accept_checked()? 30 | # return a new page object? The Pin Setup page. 31 | return HomePage(self.driver) 32 | else: 33 | raise Exception(f"App not on the {type(self)} page") 34 | 35 | 36 | def select_back(self): 37 | if self.on_the_right_page(self.title_locator): 38 | self.find_by_accessibility_id(self.back_locator).click() 39 | from pageobjects.bc_wallet.secure import SecurePage 40 | return SecurePage(self.driver) 41 | else: 42 | raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/navbar.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.connecting import ConnectingPage 4 | from pageobjects.bc_wallet.settings import SettingsPage 5 | from pageobjects.bc_wallet.home import HomePage 6 | from pageobjects.bc_wallet.credentials import CredentialsPage 7 | 8 | class NavBar(BasePage): 9 | """Nav Bar Footer object""" 10 | 11 | # Locators 12 | scan_locator = (AppiumBy.ID, "com.ariesbifold:id/Scan") 13 | notifications_locator = (AppiumBy.ID, "com.ariesbifold:id/Notifications") 14 | credentials_locator = (AppiumBy.ID, "com.ariesbifold:id/Credentials") 15 | settings_locator = (AppiumBy.ID, "com.ariesbifold:id/Settings") 16 | notification_locator = (AppiumBy.ID, "com.ariesbifold:id/Notification") 17 | 18 | 19 | def select_home(self): 20 | self.find_by(self.notifications_locator).click() 21 | return HomePage(self.driver) 22 | 23 | def select_scan(self): 24 | self.find_by(self.scan_locator).click() 25 | 26 | # return a new page object? The scan page. 27 | return ConnectingPage(self.driver) 28 | 29 | def select_credentials(self): 30 | self.find_by(self.credentials_locator).click() 31 | return CredentialsPage(self.driver) 32 | 33 | def select_settings(self): 34 | self.find_by(self.settings_locator).click() 35 | 36 | # return a new page objectfor the settings page 37 | return SettingsPage(self.driver) 38 | 39 | def has_notification(self): 40 | try: 41 | # get the home element and check for the word notifications on the element text. 42 | notifications_element = self.find_by(self.notifications_locator) 43 | if "0 Notifications" in notifications_element.text: 44 | return False 45 | else: 46 | return True 47 | except: 48 | return False -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/1/plugins/packages/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('he', { 36 | tab: { 37 | packages: { 38 | name: 'חבילות' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('br', { 44 | tab: { 45 | packages: { 46 | name: 'Pacotes' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTranslation('ja', { 52 | tab: { 53 | packages: { 54 | name: 'パッケージ' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('es', { 60 | tab: { 61 | packages: { 62 | name: 'Paquetes' 63 | } 64 | } 65 | }); 66 | 67 | allure.api.addTranslation('kr', { 68 | tab: { 69 | packages: { 70 | name: '패키지' 71 | } 72 | } 73 | }); 74 | 75 | allure.api.addTab('packages', { 76 | title: 'tab.packages.name', icon: 'fa fa-align-left', 77 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 78 | onEnter: (function (testGroup, testResult, testResultTab) { 79 | return new allure.components.TreeLayout({ 80 | testGroup: testGroup, 81 | testResult: testResult, 82 | testResultTab: testResultTab, 83 | tabName: 'tab.packages.name', 84 | baseUrl: 'packages', 85 | url: 'data/packages.json' 86 | }); 87 | }) 88 | }); 89 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/2/plugins/packages/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('he', { 36 | tab: { 37 | packages: { 38 | name: 'חבילות' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('br', { 44 | tab: { 45 | packages: { 46 | name: 'Pacotes' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTranslation('ja', { 52 | tab: { 53 | packages: { 54 | name: 'パッケージ' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('es', { 60 | tab: { 61 | packages: { 62 | name: 'Paquetes' 63 | } 64 | } 65 | }); 66 | 67 | allure.api.addTranslation('kr', { 68 | tab: { 69 | packages: { 70 | name: '패키지' 71 | } 72 | } 73 | }); 74 | 75 | allure.api.addTab('packages', { 76 | title: 'tab.packages.name', icon: 'fa fa-align-left', 77 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 78 | onEnter: (function (testGroup, testResult, testResultTab) { 79 | return new allure.components.TreeLayout({ 80 | testGroup: testGroup, 81 | testResult: testResult, 82 | testResultTab: testResultTab, 83 | tabName: 'tab.packages.name', 84 | baseUrl: 'packages', 85 | url: 'data/packages.json' 86 | }); 87 | }) 88 | }); 89 | -------------------------------------------------------------------------------- /CONTRIBUTING: -------------------------------------------------------------------------------- 1 | ## Contributor's Guide TODO: 2 | 3 | Thanks for your interest in the project! We welcome pull requests from 4 | developers of all skill levels. 5 | 6 | If you would like to contribute but don't already have something in mind, 7 | we invite you to take a look at our roadmap list. If you see one you'd like 8 | to work on, please leave a quick comment so that we don't end up with 9 | duplicated effort. Thanks in advance! 10 | 11 | Please note that all contributors and maintainers of this project are subject to our [Code of Conduct][coc]. 12 | 13 | ### Pull Requests 14 | 15 | Before submitting a pull request, please ensure you have added or updated tests as appropriate, and that all existing tests still pass with your changes. Please also ensure that your coding style is consistent with existing code in the project. A checklist is included in the PR template as a friendly reminder. 16 | 17 | ### Commit Messages 18 | 19 | We require all contributors to agree to the [DCO](https://developercertificate.org/). Every commit must contain a DCO `Signed-off-by` line. To automatically add this line, simply include the `-s` flag when executing `git commit`. 20 | 21 | ### Test coverage 22 | 23 | Pull requests must maintain 100% test coverage of all code branches. This helps ensure the quality of the project. To check coverage before submitting a pull request: 24 | 25 | ### Coding Style 26 | 27 | One of the easiest ways to ensure your contributions adhere to the project's coding style is to use [Prettier](https://prettier.io/) (included as a dev dependency). 28 | 29 | To have Prettier monitor your files and make changes as you do, open a terminal window to the project folder and type `npm run style-watch`.
30 | To check your files, you can type `npm run style-check"`
31 | To have Prettier format all your files, type `npm run style-format`
32 | 33 | More Prettier CLI options can be found here: [https://prettier.io/docs/en/cli.html](https://prettier.io/docs/en/cli.html) 34 | 35 | [coc]: ./CODE_OF_CONDUCT.md 36 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_vp/pageobjects/authenticate_with_page.py: -------------------------------------------------------------------------------- 1 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 2 | from selenium.webdriver.common.by import By 3 | from agent_factory.bc_vp.pageobjects.authenticate_page import AuthenticatePage 4 | from agent_factory.bc_vp.pageobjects.invites_page import InvitesPage 5 | 6 | # These classes can inherit from a BasePage to do commone setup and functions 7 | class AuthenticateWithPage(WebBasePage): 8 | """BC VP Issuer Authenticate With page object""" 9 | 10 | # Locators 11 | #on_this_page_text_locator = "Authenticate with" 12 | on_this_page_text_locator = "Sign in to your account" 13 | idir_locator = (By.ID, 'social-idir') 14 | github_locator = (By.ID, 'social-github') 15 | username_locator = (By.ID, 'username') 16 | password_locator = (By.ID, 'password') 17 | sign_in_locator = (By.ID, 'kc-login') 18 | 19 | def on_this_page(self): 20 | return super().on_this_page(self.on_this_page_text_locator, timeout=1000) 21 | 22 | def github(self): 23 | if self.on_this_page(): 24 | self.find_by(self.github_locator).click() 25 | return AuthenticatePage(self.driver) 26 | else: 27 | raise Exception(f"App not on the {type(self)} page") 28 | 29 | def enter_username(self, username): 30 | if self.on_this_page(): 31 | self.find_by(self.username_locator).send_keys(username) 32 | return True 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | 36 | def enter_password(self, password): 37 | if self.on_this_page(): 38 | self.find_by(self.password_locator).send_keys(password) 39 | return True 40 | else: 41 | raise Exception(f"App not on the {type(self)} page") 42 | 43 | def sign_in(self): 44 | if self.on_this_page(): 45 | self.find_by(self.sign_in_locator).click() 46 | return InvitesPage(self.driver) 47 | else: 48 | raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/secure.py: -------------------------------------------------------------------------------- 1 | from pageobjects.basepage import BasePage 2 | from pageobjects.bc_wallet.allownotifications import AllowNotificationsPage 3 | 4 | # These classes can inherit from a BasePage to do commone setup and functions 5 | class SecurePage(BasePage): 6 | """Secure your wallet page object""" 7 | 8 | # Locators 9 | # TODO: We could create a locator module that has all the locators. Given a specific app we could load the locators for that app. 10 | # not sure this would be a use case that would be common. Leaving locators with the page objects for now. 11 | on_this_page_text_locator = "Secure your Wallet" 12 | device_security_settings_link_locator = "device security settings" 13 | use_device_security_button_locator = "Submit" 14 | back_locator = "Back" 15 | 16 | def on_this_page(self): 17 | return super().on_this_page(self.on_this_page_text_locator) 18 | 19 | def select_device_security_settings(self): 20 | if self.on_the_right_page(self.title_locator): 21 | self.find_by_accessibility_id(self.device_security_settings_link_locator).click() 22 | # Not yet sure what to do here. 23 | return True 24 | else: 25 | raise Exception(f"App not on the {type(self)} page") 26 | 27 | 28 | def select_use_device_security(self): 29 | if self.on_the_right_page(self.title_locator): 30 | self.find_by_accessibility_id(self.use_device_security_button_locator).click() 31 | 32 | # Maybe should check if it is checked or let the test call is_accept_checked()? 33 | # return a new page object? The Pin Setup page. 34 | return AllowNotificationsPage(self.driver) 35 | else: 36 | raise Exception(f"App not on the {type(self)} page") 37 | 38 | 39 | def select_back(self): 40 | if self.on_the_right_page(self.title_locator): 41 | self.find_by_accessibility_id(self.back_locator).click() 42 | return TermsAndConditionsPage(self.driver) 43 | else: 44 | raise Exception(f"App not on the {self.title_locator} page") -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/3/plugins/packages/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('nl', { 36 | tab: { 37 | packages: { 38 | name: 'Packages' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('he', { 44 | tab: { 45 | packages: { 46 | name: 'חבילות' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTranslation('br', { 52 | tab: { 53 | packages: { 54 | name: 'Pacotes' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('ja', { 60 | tab: { 61 | packages: { 62 | name: 'パッケージ' 63 | } 64 | } 65 | }); 66 | 67 | allure.api.addTranslation('es', { 68 | tab: { 69 | packages: { 70 | name: 'Paquetes' 71 | } 72 | } 73 | }); 74 | 75 | allure.api.addTranslation('kr', { 76 | tab: { 77 | packages: { 78 | name: '패키지' 79 | } 80 | } 81 | }); 82 | 83 | allure.api.addTab('packages', { 84 | title: 'tab.packages.name', icon: 'fa fa-align-left', 85 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 86 | onEnter: (function (testGroup, testResult, testResultTab) { 87 | return new allure.components.TreeLayout({ 88 | testGroup: testGroup, 89 | testResult: testResult, 90 | testResultTab: testResultTab, 91 | tabName: 'tab.packages.name', 92 | baseUrl: 'packages', 93 | url: 'data/packages.json' 94 | }); 95 | }) 96 | }); 97 | -------------------------------------------------------------------------------- /aries-mobile-tests/allure/projects/default/reports/latest/plugins/packages/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('nl', { 36 | tab: { 37 | packages: { 38 | name: 'Packages' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('he', { 44 | tab: { 45 | packages: { 46 | name: 'חבילות' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTranslation('br', { 52 | tab: { 53 | packages: { 54 | name: 'Pacotes' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('ja', { 60 | tab: { 61 | packages: { 62 | name: 'パッケージ' 63 | } 64 | } 65 | }); 66 | 67 | allure.api.addTranslation('es', { 68 | tab: { 69 | packages: { 70 | name: 'Paquetes' 71 | } 72 | } 73 | }); 74 | 75 | allure.api.addTranslation('kr', { 76 | tab: { 77 | packages: { 78 | name: '패키지' 79 | } 80 | } 81 | }); 82 | 83 | allure.api.addTab('packages', { 84 | title: 'tab.packages.name', icon: 'fa fa-align-left', 85 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 86 | onEnter: (function (testGroup, testResult, testResultTab) { 87 | return new allure.components.TreeLayout({ 88 | testGroup: testGroup, 89 | testResult: testResult, 90 | testResultTab: testResultTab, 91 | tabName: 'tab.packages.name', 92 | baseUrl: 'packages', 93 | url: 'data/packages.json' 94 | }); 95 | }) 96 | }); 97 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/connect_with_best_bc_college_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.youre_all_set_page import YoureAllSetPage 7 | 8 | 9 | # These classes can inherit from a BasePage to do commone setup and functions 10 | class ConnectWithBestBCCollegePage(WebBasePage): 11 | """BC Wallet Showcase Connect With Best BC College page object""" 12 | 13 | # Locators 14 | on_this_page_text_locator = "Use your BC Wallet to scan the QR code from the website" 15 | qr_code_locator = (By.XPATH, "//div[@class='relative bg-none']//canvas") 16 | i_already_have_my_credential_locator = (By.XPATH, "//button[normalize-space()='I Already Have my Credential']") 17 | next_locator = (By.XPATH, "//button[normalize-space()='NEXT']") 18 | 19 | 20 | def on_this_page(self): 21 | self.wait_for_page_load_complete() 22 | return super().on_this_page(self.on_this_page_text_locator) 23 | 24 | def get_qr_code(self): 25 | try: 26 | qr_code = self.find_by(self.qr_code_locator, wait_condition=WaitCondition.VISIBILITY_OF_ELEMENT_LOCATED) 27 | except Exception as e: 28 | if not self.on_this_page(): 29 | raise Exception(f"App not on the {type(self)} page") 30 | else: 31 | raise e 32 | return qr_code 33 | 34 | def select_i_already_have_my_credential(self): 35 | if self.on_this_page(): 36 | self.find_by(self.i_already_have_my_credential_locator).click() 37 | return YoureAllSetPage(self.driver) 38 | else: 39 | raise Exception(f"App not on the {type(self)} page") 40 | 41 | def select_next(self): #-> ConnectWithBestBCCollegePage: 42 | if self.on_this_page(): 43 | self.find_by(self.next_locator).click() 44 | #return ConnectWithBestBCCollegePage(self.driver) 45 | else: 46 | raise Exception(f"App not on the {type(self)} page") 47 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/traction/traction_verifier_agent_interface.py: -------------------------------------------------------------------------------- 1 | from agent_factory.verifier_agent_interface import VerifierAgentInterface 2 | from agent_factory.traction.traction_agent_interface import TractionAgentInterface 3 | import requests 4 | 5 | class TractionVerifierAgentInterface(VerifierAgentInterface, TractionAgentInterface): 6 | 7 | proof_request_json = {} 8 | 9 | def __init__(self, endpoint): 10 | super().__init__(endpoint) 11 | 12 | def get_issuer_type(self) -> str: 13 | """return the type of issuer as a string TractionVerifier""" 14 | return "TractionVerifier" 15 | 16 | def create_invitation(self, oob=False, print_qrcode=False, save_qrcode=False, qr_code_border=40): 17 | return self.create_invitation_util(oob, print_qrcode, save_qrcode, qr_code_border) 18 | 19 | def connected(self): 20 | return self.connected_util() 21 | 22 | def send_proof_request(self, version=1, request_for_proof=None, connectionless=False): 23 | """create a proof request """ 24 | self._fetch_token() 25 | 26 | if connectionless: 27 | raise Exception("Connectionless proof requets are not supported yet") 28 | 29 | if request_for_proof == None: 30 | request_for_proof = self.DEFAULT_PROOF_REQUEST.copy() 31 | 32 | presentation_request = { 33 | "connection_id": self._connection_id, 34 | "auto_verify": False, 35 | "trace": False, 36 | "comment": f"proof request from {self.get_issuer_type()} {self.endpoint}", 37 | "presentation_request": { 38 | "indy": request_for_proof, 39 | } 40 | } 41 | 42 | proof_endpoint = f"{self.endpoint}/present-proof-2.0/send-request" 43 | proof_sent_response = requests.post(proof_endpoint, json=presentation_request, headers=self._build_headers()) 44 | 45 | if proof_sent_response.status_code != 200: 46 | raise Exception( 47 | f"Call to send proof request failed: {proof_sent_response.status_code}; {proof_sent_response.text}" 48 | ) 49 | self.proof_request_json = proof_sent_response.json() -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/onboarding_digital_credentials.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.onboarding_private_confidential import OnboardingPrivateConfidentialPage 4 | from pageobjects.bc_wallet.termsandconditions import TermsAndConditionsPage 5 | 6 | # These classes can inherit from a BasePage to do common setup and functions 7 | class OnboardingDigitalCredentialsPage(BasePage): 8 | """Onboarding Digital Credentials Screen page object""" 9 | 10 | # Locators 11 | on_this_page_text_locator = "Digital credentials" 12 | on_this_page_locator = (AppiumBy.NAME, "Digital credentials") 13 | #skip_locator = (AppiumBy.ID, "com.ariesbifold:id/Skip") 14 | back_locator = (AppiumBy.ID, "com.ariesbifold:id/Back") 15 | next_locator = (AppiumBy.ID, "com.ariesbifold:id/Next") 16 | 17 | def on_this_page(self): 18 | if self.current_platform == "Android": 19 | return super().on_this_page(self.on_this_page_text_locator) 20 | return super().on_this_page(self.on_this_page_locator) 21 | 22 | def get_onboarding_text(self): 23 | if self.on_this_page(): 24 | pass 25 | else: 26 | raise Exception(f"App not on the {type(self)} page") 27 | 28 | def select_next(self): 29 | if self.on_this_page(): 30 | self.find_by(self.next_locator).click() 31 | return OnboardingPrivateConfidentialPage(self.driver) 32 | else: 33 | raise Exception(f"App not on the {type(self)} page") 34 | 35 | def select_back(self): 36 | if self.on_this_page(): 37 | self.find_by(self.back_locator).click() 38 | from pageobjects.bc_wallet.onboarding_a_different_smart_wallet import OnboardingADifferentSmartWalletPage 39 | return OnboardingADifferentSmartWalletPage(self.driver) 40 | else: 41 | raise Exception(f"App not on the {type(self)} page") 42 | 43 | # def select_skip(self): 44 | # if self.on_this_page(): 45 | # self.find_by(self.skip_locator).click() 46 | # return TermsAndConditionsPage(self.driver) 47 | # else: 48 | # raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | To create an open and welcoming environment, we, both contributors and maintainers, commit to ensuring that participation in our project and community is free from harassment for everyone. 6 | 7 | ## Our Standards 8 | 9 | This project operates in accordance with the [Linux Foundation Code of Conduct](code-of-conduct). 10 | 11 | ## Our Responsibilities 12 | 13 | Project maintainers set the standards for acceptable behavior and must respond fairly and appropriately to any unacceptable actions. 14 | 15 | They have the authority and duty to delete, change, or refuse comments, code changes, documentation edits, problem reports, and other contributions that don't follow the [Code of Conduct](code-of-conduct). They can also temporarily or permanently ban any contributor for behaviors they consider inappropriate, threatening, offensive, or harmful. 16 | 17 | ## Scope 18 | 19 | This Code of Conduct must be followed in project areas and in public when someone represents the project or its community. Examples of representation include using a project's official email, posting on official social media accounts, or being a designated representative at events, online or offline. Project maintainers may further specify what counts as representing the project. 20 | 21 | ## Enforcement 22 | 23 | If you experience or witness abusive, harassing, or otherwise unacceptable behavior, you can report it by emailing the project team at ken@indicio.tech. We will review and investigate all complaints, leading to a necessary and appropriate response based on the situation. The project team will keep the reporter’s identity confidential. We may publish more details on our enforcement policies separately. 24 | 25 | Project maintainers who fail to uphold or enforce the [Code of Conduct](code-of-conduct) properly may be subject to temporary or permanent consequences, as decided by the project’s leadership. 26 | 27 | ## Attribution 28 | 29 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], [version 1.4](version). 30 | 31 | [homepage]: http://contributor-covenant.org 32 | [version]: http://contributor-covenant.org/version/1/4/ 33 | [code-of-conduct]: https://docs.linuxfoundation.org/lfx/mentorship/mentor-guide/code-of-conduct 34 | -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/using_your_credentials_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | from agent_factory.bc_showcase.pageobjects.getting_a_student_discount_page import GettingAStudentDiscountPage 7 | from agent_factory.bc_showcase.pageobjects.book_a_study_room_page import BookAStudyRoomPage 8 | 9 | 10 | # These classes can inherit from a BasePage to do commone setup and functions 11 | class UsingYourCredentialsPage(WebBasePage): 12 | """BC Wallet Showcase Using Your Credentials page object""" 13 | 14 | # Locators 15 | on_this_page_text_locator = "You'll be asked to share" 16 | cool_clothes_online_start_locator = (By.XPATH, "(//button[@class='text-sm bg-bcgov-blue dark:bg-bcgov-white text-white dark:text-black w-24 h-8 py-1.5 px-4 rounded font-semibold shadow-sm opacity-100'][normalize-space()='START'])[1]") 17 | bestbc_online_start_locator = (By.XPATH, "(//button[@class='text-sm bg-bcgov-blue dark:bg-bcgov-white text-white dark:text-black w-24 h-8 py-1.5 px-4 rounded font-semibold shadow-sm opacity-100'][normalize-space()='START'])[2]") 18 | 19 | def on_this_page(self): 20 | return super().on_this_page(self.on_this_page_text_locator) 21 | 22 | 23 | def select_cool_clothes_online_start(self) -> GettingAStudentDiscountPage: 24 | try: 25 | self.find_by(self.cool_clothes_online_start_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 26 | except Exception as e: 27 | if not self.on_this_page(): 28 | raise Exception(f"App not on the {type(self)} page") 29 | else: 30 | raise e 31 | return GettingAStudentDiscountPage(self.driver) 32 | 33 | 34 | def select_bestbc_college_start(self) -> BookAStudyRoomPage: 35 | try: 36 | self.find_by(self.bestbc_online_start_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 37 | except Exception as e: 38 | if not self.on_this_page(): 39 | raise Exception(f"App not on the {type(self)} page") 40 | else: 41 | raise e 42 | return BookAStudyRoomPage(self.driver) -------------------------------------------------------------------------------- /aries-mobile-tests/agent_factory/bc_showcase/pageobjects/start_booking_the_room_page.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | from agent_factory.candy_uvp.pageobjects.webbasepage import WebBasePage 3 | from selenium.webdriver.common.by import By 4 | from pageobjects.basepage import WaitCondition 5 | import base64 6 | 7 | 8 | # These classes can inherit from a BasePage to do commone setup and functions 9 | class StartBookingTheRoomPage(WebBasePage): 10 | """BC Wallet Showcase Start Booking the Room page object""" 11 | 12 | # Locators 13 | on_this_page_text_locator = "Imagine you're on the room booking page for BestBC College" 14 | qr_code_locator = (By.XPATH, "//div[@class='relative bg-none']//canvas") 15 | next_locator = (By.XPATH, "//button[normalize-space()='NEXT']") 16 | proof_success_locator = (By.XPATH, "(//p[normalize-space()='Success! You can continue.'])[1]") 17 | complete_locator = (By.XPATH, "(//button[contains(@class,'cursor-pointer dark:text-white')])[1]") 18 | 19 | 20 | def on_this_page(self): 21 | return super().on_this_page(self.on_this_page_text_locator) 22 | 23 | def get_qr_code(self): 24 | try: 25 | qr_code = self.find_by(self.qr_code_locator, wait_condition=WaitCondition.VISIBILITY_OF_ELEMENT_LOCATED) 26 | except Exception as e: 27 | if not self.on_this_page(): 28 | raise Exception(f"App not on the {type(self)} page") 29 | else: 30 | raise e 31 | return qr_code 32 | 33 | 34 | def select_next(self): #-> ConnectWithBestBCCollegePage: 35 | try: 36 | self.find_by(self.next_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 37 | except Exception as e: 38 | if not self.on_this_page(): 39 | raise Exception(f"App not on the {type(self)} page") 40 | else: 41 | raise e 42 | #return ConnectWithBestBCCollegePage(self.driver) 43 | 44 | def proof_success(self) -> bool: 45 | try: 46 | self.find_by(self.proof_success_locator, wait_condition=WaitCondition.VISIBILITY_OF_ELEMENT_LOCATED) 47 | self.select_next() 48 | self.find_by(self.complete_locator, wait_condition=WaitCondition.ELEMENT_TO_BE_CLICKABLE).click() 49 | return True 50 | except Exception as e: 51 | return False -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/onboarding_is_this_app_for_you.py: -------------------------------------------------------------------------------- 1 | from appium.webdriver.common.appiumby import AppiumBy 2 | from pageobjects.basepage import BasePage 3 | from pageobjects.bc_wallet.onboarding_a_different_smart_wallet import OnboardingADifferentSmartWalletPage 4 | import os 5 | 6 | # These classes can inherit from a BasePage to do common setup and functions 7 | class OnboardingIsThisAppForYouPage(BasePage): 8 | """Onboarding Is This App For You page object""" 9 | 10 | # Locators 11 | # TODO: If Ontario/BC or other wallets are closely alligned and only locators are different, 12 | # we could create a locator module that has all the locators. Given a specific app we could load the locators for that app. 13 | # not sure this would be a use case that would be common. Leaving locators with the page objects for now. 14 | on_this_page_text_locator = "Is this app for you?" 15 | on_this_page_locator = (AppiumBy.ID, "com.ariesbifold:id/DeveloperCounter") 16 | confirm_locator = (AppiumBy.ID, "com.ariesbifold:id/IAgree") 17 | continue_locator = (AppiumBy.ID, "com.ariesbifold:id/Continue") 18 | 19 | def on_this_page(self): 20 | # Sometimes (especially when running with a local emulator ) where the app is not loaded yet. 21 | # Appium doesn't seem to let this happen when using Sauce Labs. 22 | timeout = 10 23 | if "Local" in os.environ['DEVICE_CLOUD']: 24 | timeout = 100 25 | if self.current_platform == "Android": 26 | return super().on_this_page(self.on_this_page_text_locator, timeout) 27 | return super().on_this_page(self.on_this_page_locator, timeout) 28 | 29 | def get_onboarding_text(self): 30 | if self.on_this_page(): 31 | pass 32 | else: 33 | raise Exception(f"App not on the {self.on_this_page_text_locator} page") 34 | 35 | def select_confirm(self): 36 | if self.on_this_page(): 37 | self.find_by(self.confirm_locator).click() 38 | else: 39 | raise Exception(f"App not on the {type(self)} page") 40 | 41 | def select_continue(self): 42 | if self.on_this_page(): 43 | self.find_by(self.continue_locator).click() 44 | return OnboardingADifferentSmartWalletPage(self.driver) 45 | else: 46 | raise Exception(f"App not on the {type(self)} page") -------------------------------------------------------------------------------- /aries-mobile-tests/pageobjects/bc_wallet/connecting.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | from appium.webdriver.common.appiumby import AppiumBy 4 | from selenium.webdriver.support.ui import WebDriverWait 5 | from selenium.webdriver.support import expected_conditions as EC 6 | from pageobjects.basepage import BasePage 7 | import logging 8 | from selenium.common.exceptions import TimeoutException 9 | from pageobjects.basepage import WaitCondition 10 | 11 | 12 | # These classes can inherit from a BasePage to do common setup and functions 13 | class ConnectingPage(BasePage): 14 | """Connecting to an Agent Screen page object""" 15 | 16 | # Locators 17 | on_this_page_text_locator = "Just a moment" 18 | on_this_page_locator = (AppiumBy.ID, "com.ariesbifold:id/CredentialOnTheWay") 19 | taking_too_long_locator = (AppiumBy.ID, "com.ariesbifold:id/TakingTooLong") 20 | back_to_home_locator = (AppiumBy.ID, "com.ariesbifold:id/BackToHome") 21 | 22 | def on_this_page(self): 23 | timeout = 20 24 | if "Local" in os.environ['DEVICE_CLOUD']: 25 | timeout = 50 26 | return super().on_this_page(self.on_this_page_locator, timeout) 27 | 28 | def select_go_back_to_home(self): 29 | if self.on_this_page(): 30 | self.find_by(self.back_to_home_locator).click() 31 | from pageobjects.bc_wallet.home import HomePage 32 | return HomePage(self.driver) 33 | else: 34 | raise Exception(f"App not on the {type(self)} page") 35 | 36 | def is_connecting_taking_too_long(self): 37 | if self.find_by(self.taking_too_long_locator, timeout=60, wait_condition=WaitCondition.VISIBILITY_OF_ELEMENT_LOCATED): 38 | return True 39 | else: 40 | return False 41 | 42 | def wait_for_connection(self, timeout=300): 43 | # Set up logging 44 | logger = logging.getLogger(__name__) 45 | 46 | # Wait for the Connection indicator to disappear 47 | try: 48 | self.find_by(self.on_this_page_locator, timeout, WaitCondition.INVISIBILITY_OF_ELEMENT_LOCATED) 49 | logger.debug("Connecting indicator disappeared") 50 | except TimeoutException: 51 | logger.error(f"Connecting taking longer than expected. Timing out at {timeout} seconds.") 52 | raise 53 | 54 | # Return the True if done connecting 55 | return True --------------------------------------------------------------------------------