├── 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
--------------------------------------------------------------------------------