End-to-end test suite for the Amsterdam app, implemented with Maestro flows.
The repository contains scenario-based tests for key app modules such as parking, profile, contact, survey, waste guide, and burning guide. Tests are organized as reusable flow fragments plus runnable entry flows.
- Maestro test flows under
maestro/ - Shared reusable flows under
maestro/shared/and module-specificutils/orshared/folders - Entry flows (the files that are executed directly) ending in
.entry.yaml - JavaScript helper scripts used by Maestro (credentials, timeouts, generated values)
- Azure DevOps pipeline definitions under
pipelines/
Runnable flows include, among others:
maestro/parking/entry/*.entry.yamlmaestro/contact/*.entry.yamlmaestro/profile/**/*.entry.yamlmaestro/survey/*.entry.yamlmaestro/waste-guide/entry/*.entry.yamlmaestro/burning-guide/*.entry.yaml
Each entry flow composes shared helpers with runFlow and can set per-scenario environment variables (for example module button IDs or environment selectors).
Common actions are centralized in shared flows, for example:
- opening a module from a fresh app state
- closing onboarding/surveys
- entering access codes
- generic UI helpers (toggle, close keyboard, handle deep links)
The suite uses Maestro JavaScript scripts for dynamic values and secrets:
-
maestro/scripts/credentials.js(gitignored): create locally for parking login flows -
maestro/scripts/credentials.ci.js: CI placeholders that are replaced in pipelines -
maestro/parking/scripts/generateRandomLicensePlate.js: creates random license plates
To run tests locally:
- Install Maestro CLI
- Install and run a supported iOS or Android simulator/emulator
- Have a dev/test app build where testIDs used in the flows are available
To run in CI:
- Azure DevOps pipeline access
- BrowserStack App Automate credentials
- Pipeline variable group
aapp_testing_e2econfigured with required secrets
Run a single entry flow from the repository root:
maestro test maestro/parking/entry/visitor.entry.yamlRun a module entry folder:
maestro test maestro/parking/entryRun another scenario:
maestro test maestro/contact/contact.entry.yamlNotes:
- Parking scenarios depend on report code and pin values from
maestro/scripts/credentials.js(gitignored; create it locally, e.g. by copyingmaestro/scripts/credentials.ci.js).
Pipelines:
pipelines/android-pipeline.ymlpipelines/ios-pipeline.yml- shared logic in
pipelines/templates/shared.yml
CI flow summary:
- Rename
credentials.ci.jstocredentials.js - Inject secret values from Azure DevOps variables
- Zip and upload Maestro tests to BrowserStack
- Upload app artifact (or reuse provided app ID)
- Start BrowserStack Maestro build for discovered entry flows
Both platform pipelines support optional parameters for reusing existing BrowserStack app and test suite IDs.
- For local execution, create
maestro/scripts/credentials.js(it is gitignored), e.g. by copyingmaestro/scripts/credentials.ci.js, then fill in non-production test accounts. - For CI, keep placeholders in
maestro/scripts/credentials.ci.jsand let the pipeline inject secret values.
When adding or updating tests:
- Prefer small reusable helpers in module
shared/orutils/folders - Keep entry flows focused on user-visible scenarios
- Reuse existing shared flows before creating new duplicates
- Validate new flows locally with Maestro before opening a PR
Licensed under the EUPL v1.2. See LICENSE.