name: (DevTools) Regression Tests

on:
  schedule:
    - cron: 0 0 * * *
  workflow_dispatch:
    inputs:
      commit_sha:
        required: false
        type: string

env:
  TZ: /usr/share/zoneinfo/America/Los_Angeles
  # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout
  SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1

jobs:
  download_build:
    name: Download base build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
          cache: yarn
          cache-dependency-path: yarn.lock
      - name: Restore cached node_modules
        uses: actions/cache@v4
        id: node_modules
        with:
          path: "**/node_modules"
          key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }}
      - run: yarn install --frozen-lockfile
      - run: yarn install --frozen-lockfile
        working-directory: scripts/release
      - name: Download react-devtools artifacts for base revision
        run: |
          git fetch origin main
          GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build.js --commit=${{ inputs.commit_sha || '$(git rev-parse origin/main)' }}
      - name: Display structure of build
        run: ls -R build
      - name: Archive build
        uses: actions/upload-artifact@v4
        with:
          name: build
          path: build

  build_devtools_and_process_artifacts:
    name: Build DevTools and process artifacts
    needs: download_build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
          cache: yarn
          cache-dependency-path: yarn.lock
      - name: Restore cached node_modules
        uses: actions/cache@v4
        id: node_modules
        with:
          path: "**/node_modules"
          key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }}
      - run: yarn install --frozen-lockfile
      - name: Restore archived build
        uses: actions/download-artifact@v4
        with:
          name: build
          path: build
      - run: ./scripts/ci/pack_and_store_devtools_artifacts.sh
        env:
          RELEASE_CHANNEL: experimental
      - name: Display structure of build
        run: ls -R build
      - name: Archive devtools build
        uses: actions/upload-artifact@v4
        with:
          name: react-devtools
          path: build/devtools.tgz
      # Simplifies getting the extension for local testing
      - name: Archive chrome extension
        uses: actions/upload-artifact@v4
        with:
          name: react-devtools-chrome-extension
          path: build/devtools/chrome-extension.zip
      - name: Archive firefox extension
        uses: actions/upload-artifact@v4
        with:
          name: react-devtools-firefox-extension
          path: build/devtools/firefox-extension.zip

  run_devtools_tests_for_versions:
    name: Run DevTools tests for versions
    needs: build_devtools_and_process_artifacts
    runs-on: ubuntu-latest
    strategy:
      matrix:
        version:
          - "16.0"
          - "16.5" # schedule package
          - "16.8" # hooks
          - "17.0"
          - "18.0"
    continue-on-error: true
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
          cache: yarn
          cache-dependency-path: yarn.lock
      - name: Restore cached node_modules
        uses: actions/cache@v4
        id: node_modules
        with:
          path: "**/node_modules"
          key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }}
      - run: yarn install --frozen-lockfile
      - name: Restore all archived build artifacts
        uses: actions/download-artifact@v4
      - name: Display structure of build
        run: ls -R build
      - run: ./scripts/ci/download_devtools_regression_build.js ${{ matrix.version }} --replaceBuild
      - run: node ./scripts/jest/jest-cli.js --build --project devtools --release-channel=experimental --reactVersion ${{ matrix.version }} --ci

  run_devtools_e2e_tests_for_versions:
    name: Run DevTools e2e tests for versions
    needs: build_devtools_and_process_artifacts
    runs-on: ubuntu-latest
    strategy:
      matrix:
        version:
          - "16.0"
          - "16.5" # schedule package
          - "16.8" # hooks
          - "17.0"
          - "18.0"
    continue-on-error: true
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
          cache: yarn
          cache-dependency-path: yarn.lock
      - name: Restore cached node_modules
        uses: actions/cache@v4
        id: node_modules
        with:
          path: "**/node_modules"
          key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }}
      - run: yarn install --frozen-lockfile
      - name: Restore all archived build artifacts
        uses: actions/download-artifact@v4
      - name: Display structure of build
        run: ls -R build
      - name: Playwright install deps
        run: |
          npx playwright install
          sudo npx playwright install-deps
      - run: ./scripts/ci/download_devtools_regression_build.js ${{ matrix.version }}
      - run: ls -R build-regression
      - run: ./scripts/ci/run_devtools_e2e_tests.js ${{ matrix.version }}
        env:
          RELEASE_CHANNEL: experimental
      - name: Cleanup build regression folder
        run: rm -r ./build-regression
      - uses: actions/upload-artifact@v4
        with:
          name: screenshots
          path: ./tmp/screenshots