name: Tests CI

on:
  # Triggers the workflow on any pull request and push to develop
  push:
    branches: [ develop ]
  pull_request:

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  # Make the git branch for a PR available to our Fastfile
  MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}

jobs:
  tests:
    name: Tests
    runs-on: macos-15
    
    concurrency:
      # When running on develop, use the sha to allow all runs of this workflow to run concurrently.
      # Otherwise only allow a single run of this workflow on each branch, automatically cancelling older runs.
      group: ${{ github.ref == 'refs/heads/develop' && format('tests-develop-{0}', github.sha) || format('tests-{0}', github.ref) }}
      cancel-in-progress: true

    steps:
      - uses: actions/checkout@v4
        with:
            submodules: 'true'

      # Common cache
      # Note: GH actions do not support yaml anchor yet. We need to duplicate this for every job
      - uses: actions/cache@v4
        with:
          path: Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - uses: actions/cache@v4
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gems-

      # Make sure we use the latest version of MatrixSDK
      - name: Reset MatrixSDK pod
        run: rm -rf Pods/MatrixSDK

      # Common setup
      # Note: GH actions do not support yaml anchor yet. We need to duplicate this for every job
      - name: Brew bundle
        run: brew bundle
      - name: Bundle install
        run: |
          bundle config path vendor/bundle
          bundle install --jobs 4 --retry 3
          
      - name: Xcodegen
        run: mint run yonaskolb/XcodeGen@2.39.0

      # Main step
      - name: Unit tests
        run: bundle exec fastlane test
      
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          flags: unittests
