Skip to content
Open
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
5e7e4a1
chore: add blank app fixture runner and appium tests
descorp Jan 12, 2026
843d90c
chore: correct typo
descorp Jan 12, 2026
0c870bf
chore: add fixes
descorp Jan 12, 2026
a6da3ae
chore: correct title
descorp Jan 12, 2026
6f32c5b
chore: applying fixes
descorp Jan 12, 2026
4c813a6
chore: add missing IDs
descorp Jan 12, 2026
88d1b87
chore: add proper Android runner
descorp Jan 12, 2026
0fce238
chore: add permisions
descorp Jan 12, 2026
ec936f7
chore: fix github bug
descorp Jan 12, 2026
c5c7730
chore: change ENV to output
descorp Jan 12, 2026
0d8fe95
fix: script by touching yarn.lock
descorp Jan 12, 2026
979cc44
chore: fix appium version
descorp Jan 12, 2026
0754f1b
chore: fix sed command
descorp Jan 13, 2026
931225f
chore: fix pathes
descorp Jan 13, 2026
d264646
chore: improving native scripts
descorp Jan 13, 2026
d99eb47
choer: lint Appium tests source
descorp Jan 13, 2026
ade5037
chore: checking dependenciess
descorp Jan 13, 2026
ee9e250
chore: point to iso simulator
descorp Jan 13, 2026
c310fe7
chore: improve appium tests
descorp Jan 13, 2026
a3651fe
chore: reuse Android emulator
descorp Jan 13, 2026
af3d5a4
chore: improving android + more logs
descorp Jan 13, 2026
6774a44
chore: solving slow iOS issue
descorp Jan 13, 2026
779fc06
temp: validating..
descorp Jan 13, 2026
3b3bcac
Merge branch 'develop' into ci-blank-tests
descorp Jan 13, 2026
ff8ac63
chore: remove auto run on CI
descorp Jan 13, 2026
930feb6
Merge branch 'develop' into ci-blank-tests
descorp Jan 19, 2026
4743103
chore: remove duplicated code
descorp Jan 21, 2026
ee86444
chore: simplify scripts
descorp Jan 21, 2026
1d614ff
chore: prevent checkout on platform run
descorp Jan 21, 2026
74ec150
chore: reuse android setup as an action
descorp Jan 21, 2026
789a927
change: improve appium runner structure
descorp Jan 22, 2026
265111c
chore: ignore e2e on tests
descorp Jan 22, 2026
737e03f
fix: unnececery param
descorp Jan 22, 2026
02a447f
chore: fix missing MainActivity
descorp Jan 22, 2026
5b479c5
chore: remove unnececery || true checks
descorp Jan 22, 2026
b0120b7
temp: validate expo..
descorp Jan 22, 2026
9470e7a
Merge branch 'develop' into ci-blank-tests
descorp Feb 11, 2026
13835ec
chore: update setup script to handle Expo platform
descorp Feb 11, 2026
8bf9ae7
chore: apply expo plugin and secrets
descorp Feb 12, 2026
175f0b7
chore: revert hiding ios header
descorp Feb 12, 2026
120c6bf
chore: add xcpretty
descorp Feb 12, 2026
028223b
chore: correct scheme for expo
descorp Feb 12, 2026
ee9b1d4
chore: fix podspec
descorp Feb 12, 2026
147ab6b
chore: rework pipeline so it is triggered on demand
descorp Feb 12, 2026
260f1d1
Merge branch 'develop' into ci-blank-tests
descorp Feb 12, 2026
1a4c485
chore: make unique artifacts
descorp Feb 18, 2026
0ca83cf
chore: use custom ios simulator script
descorp Feb 19, 2026
1ac2f57
chore: add xcode logs
descorp Feb 19, 2026
2252601
Merge branch 'develop' into ci-blank-tests
descorp Feb 19, 2026
eae0e23
chore: correct bundle ID for Expo and React
descorp Feb 19, 2026
e93d936
chore: add swiftlint
descorp Feb 19, 2026
5ab365a
chore: cleanup
descorp Feb 20, 2026
d26cf77
chore: reuse build_lib
descorp Feb 20, 2026
4009fe0
fix: add checkout step to android e2e test job
descorp Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
318 changes: 318 additions & 0 deletions .github/workflows/blank_test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,318 @@
name: Test Blank React Native app

on:
push:
branches:
- develop

workflow_dispatch:
inputs:
platform:
description: 'Project Type'
required: true
type: choice
options:
- 'React Native'
- 'Expo'
default: 'React Native'
version:
description: 'Version (RN e.g. 0.80.2 OR Expo SDK e.g. 52.0.0)'
required: true
default: '0.80.2'
run_ios:
description: 'Test iOS'
type: boolean
default: true
run_android:
description: 'Test Android'
type: boolean
default: true

permissions:
contents: read

env:
NODE_VERSION: 20
ANDROID_API_LEVEL: 35
IOS_DEVICE_NAME: "iPhone 17"
IOS_VERSION: "26.1"
APP_DIR: "tested_app"

jobs:
# ====================================================
# JOB 1: Setup Fixture
# ====================================================
setup:
name: Setup Fixture
runs-on: ubuntu-latest
outputs:
platform: ${{ steps.vars.outputs.platform }}
version: ${{ steps.vars.outputs.version }}
run_ios: ${{ steps.vars.outputs.run_ios }}
run_android: ${{ steps.vars.outputs.run_android }}
steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Resolve Inputs
id: vars
shell: bash
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
PLATFORM="${{ github.event.inputs.platform }}"
VERSION="${{ github.event.inputs.version }}"
RUN_IOS="${{ github.event.inputs.run_ios }}"
RUN_ANDROID="${{ github.event.inputs.run_android }}"
else
PLATFORM="React Native"
VERSION="0.80.2"
RUN_IOS="true"
RUN_ANDROID="true"
fi

echo "platform=$PLATFORM" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "run_ios=$RUN_IOS" >> "$GITHUB_OUTPUT"
echo "run_android=$RUN_ANDROID" >> "$GITHUB_OUTPUT"

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'

- name: Build Library
run: |
yarn
yarn prepare
rm -f adyen-react-native-*.tgz
npm pack
mv adyen-react-native-*.tgz adyen-react-native.tgz

- name: Generate Fixture
run: |
if [ "${{ steps.vars.outputs.platform }}" == "Expo" ]; then
FLAG="-e"
else
FLAG="-r"
fi
bash ./scripts/fixture_setup.sh $FLAG "${{ steps.vars.outputs.version }}"

- name: Upload Fixture
uses: actions/upload-artifact@v4
with:
name: fixture
path: ${{ env.APP_DIR }}
retention-days: 1

# ====================================================
# JOB 2: iOS Build & Test
# ====================================================
ios-test:
name: iOS Test
needs: setup
if: ${{ needs.setup.outputs.run_ios == 'true' }}
runs-on: macos-15
timeout-minutes: 45
env:
ADYEN_CLIENT_KEY: ${{ secrets.ADYEN_CLIENT_KEY }}
ADYEN_PUBLIC_KEY: ${{ secrets.ADYEN_PUBLIC_KEY }}

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'

- name: Setup Ruby & Cocoapods
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true

- name: Download Fixture
uses: actions/download-artifact@v4
with:
name: fixture
path: ${{ env.APP_DIR }}

- name: Install Dependencies
working-directory: ${{ env.APP_DIR }}
run: |
yarn install

- name: Setup Appium
run: |
npm i -g appium
appium driver install xcuitest

- name: Start Appium
run: |
appium --port 4723 --log-level error &
for i in {1..90}; do
if curl -sf http://127.0.0.1:4723/status >/dev/null; then
Copy link

@atmamont atmamont Jan 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this waiting for a server to start up and be ready?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct. On Ubuntu it happens pretty fast, but on Mac it take some significant time.

exit 0
fi
sleep 1
done
exit 1

- name: Inject Secrets
if: ${{ env.ADYEN_CLIENT_KEY != '' && env.ADYEN_PUBLIC_KEY != '' }}
run: |
bash ./scripts/inject_secrets.sh "$APP_DIR"

- name: Run iOS Test
run: |
bash ./scripts/fixture_ios.sh "$APP_DIR" "${{ needs.setup.outputs.platform }}" "${{ env.IOS_DEVICE_NAME }}" "${{ env.IOS_VERSION }}"

- name: Upload Appium Failure Screenshot (iOS)
if: always()
uses: actions/upload-artifact@v4
with:
name: appium_failure_ios
path: ${{ env.APP_DIR }}/appium_failure.png
if-no-files-found: ignore
retention-days: 1

- name: Upload Appium Page Source (iOS)
if: always()
uses: actions/upload-artifact@v4
with:
name: appium_page_source_ios
path: ${{ env.APP_DIR }}/appium_page_source.xml
if-no-files-found: ignore
retention-days: 1

# ====================================================
# JOB 3: Android Build & Test
# ====================================================
android-test:
name: Android Test
needs: setup
if: ${{ needs.setup.outputs.run_android == 'true' }}
runs-on: ubuntu-24.04
timeout-minutes: 45
env:
ADYEN_CLIENT_KEY: ${{ secrets.ADYEN_CLIENT_KEY }}
ADYEN_PUBLIC_KEY: ${{ secrets.ADYEN_PUBLIC_KEY }}
target: google_apis
arch: x86_64

steps:
- name: Provide more disk space
run: |
sudo rm -rf /opt/hostedtoolcache
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc /opt/cabal /opt/stack
sudo rm -rf /usr/local/.ghcup
sudo rm -rf "/usr/local/share/boost"
sudo apt-get remove -y 'php.*'
sudo docker image prune --all --force

- name: Checkout Code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: Gradle cache
uses: gradle/actions/setup-gradle@v5

- name: Enable KVM (Linux Acceleration)
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: AVD cache
uses: actions/cache@v5
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-${{ env.ANDROID_API_LEVEL }}

- name: Create AVD and generate snapshot for caching
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.ANDROID_API_LEVEL }}
target: ${{ env.target }}
arch: ${{ env.arch }}
force-avd-creation: false
emulator-boot-timeout: 300
script: echo "Generated AVD snapshot for caching."

- name: Download Fixture
uses: actions/download-artifact@v4
with:
name: fixture
path: ${{ env.APP_DIR }}

- name: Install Dependencies
working-directory: ${{ env.APP_DIR }}
run: |
yarn install

- name: Setup Appium
run: |
npm i -g appium
appium driver install uiautomator2

- name: Start Appium
run: |
appium --port 4723 --log-level error &
for i in {1..30}; do
nc -z 127.0.0.1 4723 && exit 0
sleep 1
done
exit 1

- name: Inject Secrets
if: ${{ env.ADYEN_CLIENT_KEY != '' && env.ADYEN_PUBLIC_KEY != '' }}
run: |
bash ./scripts/inject_secrets.sh "$APP_DIR"

- name: Run Android Test
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.ANDROID_API_LEVEL }}
target: ${{ env.target }}
arch: ${{ env.arch }}
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
script: |
bash ./scripts/fixture_android.sh "$APP_DIR" "${{ needs.setup.outputs.platform }}" "${{ env.ANDROID_API_LEVEL }}"

- name: Upload Appium Failure Screenshot (Android)
if: always()
uses: actions/upload-artifact@v4
with:
name: appium_failure_android
path: ${{ env.APP_DIR }}/appium_failure.png
if-no-files-found: ignore
retention-days: 1

- name: Upload Appium Page Source (Android)
if: always()
uses: actions/upload-artifact@v4
with:
name: appium_page_source_android
path: ${{ env.APP_DIR }}/appium_page_source.xml
if-no-files-found: ignore
retention-days: 1
Loading