name: Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test-rust:
name: Rust Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- uses: taiki-e/install-action@cargo-llvm-cov
- name: Run tests with coverage
run: cargo llvm-cov --all-features --lcov --output-path coverage.lcov
- name: Upload coverage to Codecov
if: ${{ github.actor != 'dependabot[bot]' }}
uses: codecov/codecov-action@v6
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: coverage.lcov
flags: rust
name: rust-coverage
test-js:
name: JavaScript/TypeScript Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
- name: Install pnpm
uses: pnpm/action-setup@v6
- name: Install dependencies
run: pnpm install
- name: Run tests with coverage
run: pnpm test:coverage
- name: Upload coverage to Codecov
if: ${{ github.actor != 'dependabot[bot]' }}
uses: codecov/codecov-action@v6
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: ./coverage/coverage-final.json
flags: javascript
name: javascript-coverage
- name: Upload coverage reports
uses: actions/upload-artifact@v7
if: always()
with:
name: js-coverage
path: coverage/
test-android:
name: Android Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android
- name: Build Android bindings
run: cargo build --target aarch64-linux-android
- name: Grant execute permission for gradlew
run: chmod +x android/gradlew
- name: Run Android unit tests with coverage
run: |
cd android
./gradlew clean testDebugUnitTest jacocoTestReport --stacktrace --no-daemon
- name: Upload coverage to Codecov
if: ${{ github.actor != 'dependabot[bot]' }}
uses: codecov/codecov-action@v6
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: ./android/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml
flags: android
name: android-coverage
- name: Upload test results
uses: actions/upload-artifact@v7
if: always()
with:
name: android-test-results
path: android/build/test-results/
- name: Upload coverage reports
uses: actions/upload-artifact@v7
if: always()
with:
name: android-coverage
path: android/build/reports/jacoco/
test-android-instrumented:
name: Android Instrumented Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android
- name: Build Android bindings
run: cargo build --target aarch64-linux-android
- name: Grant execute permission for gradlew
run: chmod +x android/gradlew
- name: Enable KVM group perms
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: Run instrumented tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 30
target: google_apis
arch: x86_64
profile: pixel_6
disable-animations: true
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
script: cd android && ./gradlew clean connectedDebugAndroidTest --stacktrace --no-daemon
- name: Upload instrumented test results
uses: actions/upload-artifact@v7
if: always()
with:
name: android-instrumented-test-results
path: android/build/outputs/androidTest-results/
test-ios:
name: iOS Unit Tests
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-ios
- name: Build iOS bindings
run: cargo build --target aarch64-apple-ios
- name: Run iOS unit tests
run: |
cd ios
xcodebuild test \
-scheme tauri-plugin-notifications \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=latest' \
-enableCodeCoverage YES \
-resultBundlePath TestResults.xcresult
- name: Generate coverage report
run: |
cd ios
xcrun xccov view --report --json TestResults.xcresult > coverage.json
- name: Upload coverage to Codecov
if: ${{ github.actor != 'dependabot[bot]' }}
uses: codecov/codecov-action@v6
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: ./ios/coverage.json
flags: ios
name: ios-coverage
- name: Upload test results
uses: actions/upload-artifact@v7
if: always()
with:
name: ios-test-results
path: ios/TestResults.xcresult
- name: Upload coverage reports
uses: actions/upload-artifact@v7
if: always()
with:
name: ios-coverage
path: ios/coverage.json
test-macos:
name: macOS Unit Tests
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin
- name: Build macOS bindings
run: cargo build --target aarch64-apple-darwin
- name: Run macOS unit tests
run: |
cd macos
xcodebuild test \
-scheme tauri-plugin-notifications \
-destination 'platform=macOS' \
-enableCodeCoverage YES \
-resultBundlePath TestResults.xcresult
- name: Generate coverage report
run: |
cd macos
xcrun xccov view --report --json TestResults.xcresult > coverage.json
- name: Upload coverage to Codecov
if: ${{ github.actor != 'dependabot[bot]' }}
uses: codecov/codecov-action@v6
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
with:
files: ./macos/coverage.json
flags: macos
name: macos-coverage
- name: Upload test results
uses: actions/upload-artifact@v7
if: always()
with:
name: macos-test-results
path: macos/TestResults.xcresult
- name: Upload coverage reports
uses: actions/upload-artifact@v7
if: always()
with:
name: macos-coverage
path: macos/coverage.json