name: Run unit tests
on:
  workflow_call:
    inputs:
      build-cmd:
        description: Build command, run once
        required: true
        type: string
      test-cmd:
        description: Test command, run once per chunk
        required: true
        type: string
      serialize:
        description: If true, allow only one concurrent chunk (see note on concurrency below)
        required: false
        type: boolean
    outputs:
      wdir:
        description: Cache key for the working directory after running tests
        value: ${{ jobs.chunk-4.outputs.wdir }}
    secrets:
      BROWSERSTACK_USER_NAME:
        description: "Browserstack user name"
      BROWSERSTACK_ACCESS_KEY:
        description: "Browserstack access key"

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Set up Node.js
        uses: actions/setup-node@v5
        with:
          node-version: '20'

      - name: Fetch source
        uses: actions/cache/restore@v4
        with:
          path: .
          key: source-${{ github.run_id }}
          fail-on-cache-miss: true

      - name: Build
        run: ${{ inputs.build-cmd }}

      - name: Cache build output
        uses: actions/cache/save@v4
        with:
          path: .
          key: build-${{ inputs.build-cmd }}-${{ github.run_id }}

      - name: Verify cache
        uses: actions/cache/restore@v4
        with:
          path: .
          key: build-${{ inputs.build-cmd }}-${{ github.run_id }}
          lookup-only: true
          fail-on-cache-miss: true

  chunk-1:
    needs: build
    name: Run tests (chunk 1 of 4)
    uses: ./.github/workflows/test-chunk.yml
    with:
      chunk-no: 1
      wdir: build-${{ inputs.build-cmd }}-${{ github.run_id }}
      cmd: ${{ inputs.test-cmd }}
      serialize: ${{ inputs.serialize }}
    secrets:
      BROWSERSTACK_USER_NAME: ${{ secrets.BROWSERSTACK_USER_NAME }}
      BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
  chunk-2:
    name: Run tests (chunk 2 of 4)
    needs: chunk-1
    uses: ./.github/workflows/test-chunk.yml
    with:
      chunk-no: 2
      wdir: ${{ needs.chunk-1.outputs.wdir }}
      cmd: ${{ inputs.test-cmd }}
      serialize: ${{ inputs.serialize }}
    secrets:
      BROWSERSTACK_USER_NAME: ${{ secrets.BROWSERSTACK_USER_NAME }}
      BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
  chunk-3:
    name: Run tests (chunk 3 of 4)
    needs: chunk-2
    uses: ./.github/workflows/test-chunk.yml
    with:
      chunk-no: 3
      wdir: ${{ needs.chunk-2.outputs.wdir }}
      cmd: ${{ inputs.test-cmd }}
      serialize: ${{ inputs.serialize }}
    secrets:
      BROWSERSTACK_USER_NAME: ${{ secrets.BROWSERSTACK_USER_NAME }}
      BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
  chunk-4:
    name: Run tests (chunk 4 of 4)
    needs: chunk-3
    uses: ./.github/workflows/test-chunk.yml
    with:
      chunk-no: 4
      wdir: ${{ needs.chunk-3.outputs.wdir }}
      cmd: ${{ inputs.test-cmd }}
      serialize: ${{ inputs.serialize }}
    secrets:
      BROWSERSTACK_USER_NAME: ${{ secrets.BROWSERSTACK_USER_NAME }}
      BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
