name: Run unit tests

on:
    push:
        branches:
            - master
            - release
            - 'spring*'
            - 'summer*'
            - 'winter*'
    pull_request:
        branches:
            - master
            - release
            - 'spring*'
            - 'summer*'
            - 'winter*'

env:
    PUPPETEER_SKIP_DOWNLOAD: 'true' # only needed for @best/runner-local, unused here

jobs:
    run-unit-tests:
        runs-on: ubuntu-22.04
        steps:
            - name: Checkout repository
              uses: actions/checkout@v4

            - name: Setup Node
              uses: actions/setup-node@v4
              with:
                  node-version: '20.18.1'
                  cache: 'yarn'

            # Needed for perf smoke tests, matches the chromedriver version installed by tachometer (https://github.com/google/tachometer/blob/main/README.md#on-demand-dependencies)
            # chrome-version documentation can be found here: https://github.com/browser-actions/setup-chrome?tab=readme-ov-file#usage
            - name: Setup chrome
              uses: browser-actions/setup-chrome@v1
              with:
                  chrome-version: 130
              id: setup-chrome

            - name: Install dependencies
              run: yarn install --frozen-lockfile

            # Pin chromedriver to the same version as Chrome above, so Tachometer uses this version.
            # See: https://github.com/google/tachometer#on-demand-dependencies
            - name: Install chromedriver
              run: yarn add -W chromedriver@^130

            - name: Check package.json integrity
              run: node ./scripts/tasks/check-and-rewrite-package-json.js --test
            - name: Check licenses are up to date
              run: node ./scripts/tasks/generate-license-files.js --test
            - name: Verify @lwc/shared is tree-shakable
              run: node ./scripts/tasks/verify-treeshakable.js ./packages/@lwc/shared/dist/index.js
            - name: Verify that dependencies are declared
              run: node ./scripts/tasks/check-imports-are-declared-dependencies.js
            - name: Check formatting
              run: yarn prettier --check '{packages,scripts}/**/*.{js,ts,json,md}'
            - name: Run linter
              run: yarn lint
            - name: Check the size of the LWC bundle
              run: yarn bundlesize
            - name: Check types
              run: yarn test:types
            - name: Run unit tests
              run: yarn test:ci
            # TODO [#4815]: enable all SSR v2 tests
            - name: Run experimental SSR fixture tests
              run: TEST_SSR_COMPILER=1 yarn test packages/@lwc/ssr-compiler/src/__tests__/fixtures.spec.ts
            - name: Upload unit test coverage report
              uses: actions/upload-artifact@v4
              with:
                  name: test-coverage-report
                  path: coverage/
            - name: Run benchmark smoke tests
              run: CHROME_BINARY=${{ steps.setup-chrome.outputs.chrome-path }} BENCHMARK_SMOKE_TEST=1 yarn test:performance
            - name: Add step summary
              # 1. Remove leading/trailing "border" lines from output
              # 2. Wrap file names in backticks
              # 3. Convert leading whitespace to non-breaking to approximate plaintext output
              run: sed -E '$d;1d;4,$s/^(  ?)([^ ]+)/\1`\2`/g;4,$s/^  /\ \ /g' coverage/coverage.txt >> "$GITHUB_STEP_SUMMARY"