🏡 index : quine-global-boneyard/electron-builder.git

name: Test

on:
  push:
    branches:
      master
  pull_request:
  workflow_dispatch: # Allows you to run this workflow manually from the Actions tab
    inputs:
      rebuild-docker-images:
        description: 'Rebuild all Docker images'
        default: false
        type: 'boolean'
  workflow_call: # Allow this workflow to be called from other workflows
    inputs:
      rebuild-docker-images-call:
        description: 'Rebuild all Docker images'
        required: true
        type: boolean

permissions:
  contents: read

env:
  TEST_IMAGE_NODE_MAJOR_VERSION: 22

jobs:
  check-if-docker-build:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    outputs:
      force-docker-build: ${{ steps.changes.outputs.docker == 'true' || steps.changes.outputs.workflow == 'true' }}
    steps:
      - name: Checkout code repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
        with:
          fetch-depth: 0

      - name: Determine if Dockerfiles changed
        uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
        id: changes
        with:
          filters: |
            docker:
              - 'docker/**'
            workflow:
              - '.github/workflows/docker*'

  run-docker-build:
    needs: check-if-docker-build
    if: |
      always() &&
      (needs.check-if-docker-build.outputs.force-docker-build == 'true' ||
      inputs.rebuild-docker-images == 'true' || inputs.rebuild-docker-images == true ||
      inputs.rebuild-docker-images-call == 'true' || inputs.rebuild-docker-images-call == true)
    uses: ./.github/workflows/docker-build.yml

  test-linux:
    runs-on: ubuntu-22.04
    timeout-minutes: 20
    needs: [check-if-docker-build, run-docker-build]
    # Wonky if-conditional to allow this step to run AFTER docker images are rebuilt OR if the build stage skipped and we want to use dockerhub registry for images
    if: |
      always() &&
      needs.check-if-docker-build.result == 'success' &&
      (needs.run-docker-build.result == 'success' || needs.run-docker-build.result == 'skipped')
    strategy:
      fail-fast: false
      matrix:
        testFiles:
          - ArtifactPublisherTest,BuildTest,ExtraBuildTest,RepoSlugTest,binDownloadTest,configurationValidationTest,filenameUtilTest,filesTest,globTest,ignoreTest,macroExpanderTest,mainEntryTest,urlUtilTest,extraMetadataTest,linuxArchiveTest,linuxPackagerTest,HoistedNodeModuleTest,MemoLazyTest,HoistTest
          - snapTest,debTest,fpmTest,protonTest
          - winPackagerTest,winCodeSignTest,webInstallerTest
          - oneClickInstallerTest,assistedInstallerTest
          - concurrentBuildsTest
    steps:
      - name: Checkout code repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
        with:
          fetch-depth: 2

      - name: Setup Tests
        uses: ./.github/actions/pretest
        with:
          cache-path: ~/.cache/electron
          cache-key: v-23.3.10-linux-electron

      - name: Download test-runner if exists
        if: needs.run-docker-build.result == 'success'
        id: download-test-runner-image
        uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4
        with:
          name: electron-builder-all-${{ env.TEST_IMAGE_NODE_MAJOR_VERSION }}
          path: ${{ runner.temp }}

      - name: Load test runner image if needed
        if: needs.run-docker-build.result == 'success'
        run: |
          docker image load --input ${{ runner.temp }}/electron-builder-all-${{ env.TEST_IMAGE_NODE_MAJOR_VERSION }}.tar
          docker image ls -a

      - name: Lint
        run: pnpm pretest

      - name: Run tests in docker image
        run: |
          echo $TEST_RUNNER_IMAGE_TAG
          pnpm test-linux
        env:
          CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
          TEST_FILES: ${{ matrix.testFiles }}
          FORCE_COLOR: 1
          TEST_RUNNER_IMAGE_TAG: electronuserland/builder:${{ env.TEST_IMAGE_NODE_MAJOR_VERSION }}-wine-mono

  # Need to separate from other tests because logic is specific to when TOKEN env vars are set
  test-updater:
    runs-on: ubuntu-22.04
    timeout-minutes: 20
    needs: [check-if-docker-build, run-docker-build]
    # Wonky if-conditional to allow this step to run AFTER docker images are rebuilt OR if the build stage skipped and we want to use dockerhub registry for images
    if: |
      always() &&
      needs.check-if-docker-build.result == 'success' &&
      (needs.run-docker-build.result == 'success' || needs.run-docker-build.result == 'skipped')
    steps:
      - name: Checkout code repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

      - name: Setup Tests
        uses: ./.github/actions/pretest
        with:
          cache-path: ~/.cache/electron
          cache-key: v-23.3.10-update-electron

      - name: Download test-runner if exists
        if: needs.run-docker-build.result == 'success'
        uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4
        with:
          name: electron-builder-all-${{ env.TEST_IMAGE_NODE_MAJOR_VERSION }}
          path: ${{ runner.temp }}

      - name: Load test runner image if needed
        if: needs.run-docker-build.result == 'success'
        run: |
          docker image load --input ${{ runner.temp }}/electron-builder-all-${{ env.TEST_IMAGE_NODE_MAJOR_VERSION }}.tar
          docker image ls -a

      - name: Test
        run: |
          echo $TEST_RUNNER_IMAGE_TAG
          pnpm test-linux
        env:
          TEST_FILES: nsisUpdaterTest,linuxUpdaterTest,PublishManagerTest,differentialUpdateTest
          KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
          BITBUCKET_TOKEN: ${{ secrets.BITBUCKET_TOKEN }}
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          FORCE_COLOR: 1
          TEST_RUNNER_IMAGE_TAG: electronuserland/builder:${{ env.TEST_IMAGE_NODE_MAJOR_VERSION }}-wine-mono

      - name: Verify Docs Generation
        run: pnpm generate-all

  test-windows:
    runs-on: windows-latest
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        testFiles:
          - winCodeSignTest,differentialUpdateTest,squirrelWindowsTest
          - appxTest,msiTest,portableTest,assistedInstallerTest,protonTest
          - BuildTest,oneClickInstallerTest,winPackagerTest,nsisUpdaterTest,webInstallerTest
          - concurrentBuildsTest
    steps:
      - name: Checkout code repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

      - name: Setup Tests
        uses: ./.github/actions/pretest
        with:
          cache-key: v-23.3.10-windows-electron
          cache-path: ~\AppData\Local\electron\Cache

      - name: Test
        run: pnpm ci:test
        env:
          CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
          TEST_FILES: ${{ matrix.testFiles }}
          FORCE_COLOR: 1

  test-mac:
    runs-on: macos-latest
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        testFiles:
          - oneClickInstallerTest,assistedInstallerTest
          - winPackagerTest,winCodeSignTest,webInstallerTest
          - masTest,dmgTest,filesTest,macPackagerTest,differentialUpdateTest,macArchiveTest
          - concurrentBuildsTest
    steps:
      - name: Checkout code repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

      - name: Setup Tests
        uses: ./.github/actions/pretest
        with:
          cache-path: ~/Library/Caches/electron
          cache-key: v-23.3.10-macos-electron

      - name: Install toolset via brew
        run: |
          brew install powershell/tap/powershell
          brew install --cask wine-stable
          brew install rpm

      - name: Test
        run: pnpm ci:test
        env:
          TEST_FILES: ${{ matrix.testFiles }}
          FORCE_COLOR: 1