# facuestigarribia/swaglabs-mobile-qa architecture

> Architecture diagram of the GitHub repository facuestigarribia/swaglabs-mobile-qa, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/facuestigarribia/swaglabs-mobile-qa
- Repository: https://github.com/facuestigarribia/swaglabs-mobile-qa

## Overview

This repository is cross-platform UI test automation for the Swag Labs mobile app, not the app itself. Its principal workflow exercises login, product discovery and cart operations, then the staged checkout through completion on Android or iOS. Services orchestrate page transitions and assert that expected pages open; shared page abstractions and platform-specific pages implement UI interactions. User leasing, retry handling, and Allure reporting are supporting runtime capabilities. The README documents broader feature suites, but their test classes are not present in the supplied tree, so their links to these runtime components are not shown.

Main entry points: [`src/main/java/com/mobile/swaglabs/qa/pages/common/ProductsPage.java`](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/ProductsPage.java) (Products page), [`src/main/java/com/mobile/swaglabs/qa/service/CheckoutService.java`](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/CheckoutService.java) (Checkout service), [`src/main/java/com/mobile/swaglabs/qa/pages/common/CartPage.java`](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CartPage.java) (Cart page), [`src/main/java/com/mobile/swaglabs/qa/service/LoginService.java`](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/LoginService.java) (Login service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Test workflow"]
  node_base["Suite setup"]
  node_login_service["Login service<br/>[LoginService.java]"]
  node_checkout_service["Checkout service"]
end

subgraph group_ui["Mobile UI"]
  node_login_page["Login page<br/>[LoginPage.java]"]
  node_products_page["Products page<br/>[ProductsPage.java]"]
  node_product_card["Product card<br/>[ProductCard.java]"]
  node_product_details["Product details"]
  node_cart_page["Cart page<br/>[CartPage.java]"]
  node_cart_item["Cart item<br/>[CartItem.java]"]
  node_checkout_info["Checkout information"]
  node_checkout_overview["Checkout overview"]
  node_checkout_complete["Checkout complete"]
  node_android_pages["Android UI pages"]
  node_ios_pages["iOS UI pages"]
end

subgraph group_data["Test data"]
  node_users["User pool<br/>[UsersPool.java]"]
  node_user_data["User data<br/>[UserData.java]"]
  node_user_provider["User provider<br/>[UserProvider.java]"]
  node_sort_options["Sort options<br/>[SortOption.java]"]
end

subgraph group_ops["Run support"]
  node_retry_listener["Retry listener"]
  node_retry_analyzer["Retry analyzer"]
  node_allure_listener["Allure adapter"]
  node_screenshot_listener["Failure screenshots"]
end

node_runner(("Test runner"))
node_appium(("Appium device"))
node_allure_report["Allure results"]

node_runner -->|"starts suite"| node_base
node_base -->|"configures session"| node_appium
node_base -->|"leases users"| node_users
node_login_service -->|"gets credentials"| node_user_provider
node_user_provider -->|"provides user"| node_user_data
node_login_service -->|"opens page"| node_login_page
node_login_page -->|"submits login"| node_products_page
node_login_service -->|"returns page"| node_products_page
node_products_page -->|"reads cards"| node_product_card
node_products_page -->|"opens details"| node_product_details
node_products_page -->|"opens cart"| node_cart_page
node_products_page -->|"uses ordering"| node_sort_options
node_cart_page -->|"reads items"| node_cart_item
node_checkout_service -->|"opens cart"| node_cart_page
node_checkout_service -->|"starts checkout"| node_checkout_info
node_checkout_service -->|"submits information"| node_checkout_overview
node_checkout_service -->|"finishes checkout"| node_checkout_complete
node_cart_page -->|"taps checkout"| node_checkout_info
node_checkout_info -->|"submits details"| node_checkout_overview
node_checkout_overview -->|"finishes order"| node_checkout_complete
node_android_pages -->|"drives Android"| node_appium
node_ios_pages -->|"drives iOS"| node_appium
node_retry_listener -->|"attaches analyzer"| node_retry_analyzer
node_allure_listener -->|"adds metadata"| node_allure_report
node_screenshot_listener -->|"captures failures"| node_allure_report

click node_base "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/SwagLabsBaseTest.java"
click node_login_service "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/LoginService.java"
click node_checkout_service "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/CheckoutService.java"
click node_login_page "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/LoginPage.java"
click node_products_page "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/ProductsPage.java"
click node_product_card "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/components/common/ProductCard.java"
click node_product_details "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/ProductDetailsPage.java"
click node_cart_page "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CartPage.java"
click node_cart_item "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/components/common/CartItem.java"
click node_checkout_info "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutInformationPage.java"
click node_checkout_overview "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutOverviewPage.java"
click node_checkout_complete "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutCompletePage.java"
click node_android_pages "https://github.com/facuestigarribia/swaglabs-mobile-qa/tree/master/src/main/java/com/mobile/swaglabs/qa/pages/android"
click node_ios_pages "https://github.com/facuestigarribia/swaglabs-mobile-qa/tree/master/src/main/java/com/mobile/swaglabs/qa/pages/ios"
click node_users "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/UsersPool.java"
click node_user_data "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/data/UserData.java"
click node_user_provider "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/data/UserProvider.java"
click node_sort_options "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/enums/SortOption.java"
click node_retry_listener "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/retry/RetryAnalyzerListener.java"
click node_retry_analyzer "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/retry/RetryCountAnalyzer.java"
click node_allure_listener "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/listener/AllureAdapterListener.java"
click node_screenshot_listener "https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/listener/ScreenshotOnFailureListener.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_base,node_login_service,node_checkout_service toneBlue
class node_login_page,node_products_page,node_product_card,node_product_details,node_cart_page,node_cart_item,node_checkout_info,node_checkout_overview,node_checkout_complete,node_android_pages,node_ios_pages toneAmber
class node_users,node_user_data,node_user_provider,node_sort_options toneMint
class node_retry_listener,node_retry_analyzer,node_allure_listener,node_screenshot_listener toneRose
class node_runner,node_appium,node_allure_report toneIndigo
```

## Components

### Test workflow

- [Suite setup](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/SwagLabsBaseTest.java): `src/main/java/com/mobile/swaglabs/qa/SwagLabsBaseTest.java`
- [Login service](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/LoginService.java): `src/main/java/com/mobile/swaglabs/qa/service/LoginService.java`
- [Checkout service](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/CheckoutService.java): `src/main/java/com/mobile/swaglabs/qa/service/CheckoutService.java`

### Mobile UI

- [Login page](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/LoginPage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/LoginPage.java`
- [Products page](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/ProductsPage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/ProductsPage.java`
- [Product card](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/components/common/ProductCard.java): `src/main/java/com/mobile/swaglabs/qa/components/common/ProductCard.java`
- [Product details](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/ProductDetailsPage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/ProductDetailsPage.java`
- [Cart page](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CartPage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/CartPage.java`
- [Cart item](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/components/common/CartItem.java): `src/main/java/com/mobile/swaglabs/qa/components/common/CartItem.java`
- [Checkout information](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutInformationPage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutInformationPage.java`
- [Checkout overview](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutOverviewPage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutOverviewPage.java`
- [Checkout complete](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutCompletePage.java): `src/main/java/com/mobile/swaglabs/qa/pages/common/CheckoutCompletePage.java`
- [Android UI pages](https://github.com/facuestigarribia/swaglabs-mobile-qa/tree/master/src/main/java/com/mobile/swaglabs/qa/pages/android): `src/main/java/com/mobile/swaglabs/qa/pages/android`
- [iOS UI pages](https://github.com/facuestigarribia/swaglabs-mobile-qa/tree/master/src/main/java/com/mobile/swaglabs/qa/pages/ios): `src/main/java/com/mobile/swaglabs/qa/pages/ios`

### Test data

- [User pool](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/service/UsersPool.java): `src/main/java/com/mobile/swaglabs/qa/service/UsersPool.java`
- [User data](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/data/UserData.java): `src/main/java/com/mobile/swaglabs/qa/data/UserData.java`
- [User provider](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/data/UserProvider.java): `src/main/java/com/mobile/swaglabs/qa/data/UserProvider.java`
- [Sort options](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/enums/SortOption.java): `src/main/java/com/mobile/swaglabs/qa/enums/SortOption.java`

### Run support

- [Retry listener](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/retry/RetryAnalyzerListener.java): `src/main/java/com/mobile/swaglabs/qa/retry/RetryAnalyzerListener.java`
- [Retry analyzer](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/retry/RetryCountAnalyzer.java): `src/main/java/com/mobile/swaglabs/qa/retry/RetryCountAnalyzer.java`
- [Allure adapter](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/listener/AllureAdapterListener.java): `src/main/java/com/mobile/swaglabs/qa/listener/AllureAdapterListener.java`
- [Failure screenshots](https://github.com/facuestigarribia/swaglabs-mobile-qa/blob/master/src/main/java/com/mobile/swaglabs/qa/listener/ScreenshotOnFailureListener.java): `src/main/java/com/mobile/swaglabs/qa/listener/ScreenshotOnFailureListener.java`

### Other components

- **Test runner**
- **Appium device**
- **Allure results**

## Connections

- Test runner → Suite setup: starts suite
- Suite setup → Appium device: configures session
- Suite setup → User pool: leases users
- Login service → User provider: gets credentials
- User provider → User data: provides user
- Login service → Login page: opens page
- Login page → Products page: submits login
- Login service → Products page: returns page
- Products page → Product card: reads cards
- Products page → Product details: opens details
- Products page → Cart page: opens cart
- Products page → Sort options: uses ordering
- Cart page → Cart item: reads items
- Checkout service → Cart page: opens cart
- Checkout service → Checkout information: starts checkout
- Checkout service → Checkout overview: submits information
- Checkout service → Checkout complete: finishes checkout
- Cart page → Checkout information: taps checkout
- Checkout information → Checkout overview: submits details
- Checkout overview → Checkout complete: finishes order
- Android UI pages → Appium device: drives Android
- iOS UI pages → Appium device: drives iOS
- Retry listener → Retry analyzer: attaches analyzer
- Allure adapter → Allure results: adds metadata
- Failure screenshots → Allure results: captures failures
