name: Tests

on:
  push:
    # We intentionally don't run push on feature branches. See PR for rational.
    branches: [unstable, stable]
  pull_request:
  workflow_dispatch:

jobs:
  tests-main:
    name: Tests
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        node: [18]
    steps:
      # <common-build> - Uses YAML anchors in the future
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: ${{matrix.node}}
      - name: Node.js version
        id: node
        run: echo "v8CppApiVersion=$(node --print "process.versions.modules")" >> $GITHUB_OUTPUT
      - name: Restore dependencies
        uses: actions/cache@master
        id: cache-deps
        with:
          path: |
            node_modules
            packages/*/node_modules
          key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
      - name: Install & build
        if: steps.cache-deps.outputs.cache-hit != 'true'
        run: yarn install --frozen-lockfile --ignore-optional && yarn build
      - name: Build
        run: yarn build
        if: steps.cache-deps.outputs.cache-hit == 'true'
      # </common-build>

      # Only install c-kzg if required. See https://github.com/ChainSafe/lodestar/pull/4888
      # Install in workspace root, else there are weird type errors with NodeJS types
      - run: yarn add --ignore-workspace-root-check c-kzg

      # Cache validator slashing protection data tests
      - name: Restore spec tests cache
        uses: actions/cache@master
        with:
          path: packages/validator/spec-tests
          key: spec-test-data-${{ hashFiles('packages/validator/test/spec/params.ts') }}

      # Misc sanity checks
      - name: Lint Grafana dashboards
        run: node scripts/validate-grafana-dashboard.mjs ./dashboards
      - name: Test root binary exists
        run: ./lodestar --version
      - name: Reject yarn.lock changes
        run: .github/workflows/scripts/reject_yarn_lock_changes.sh
        # Run only on forks
        if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository }}
      - name: Assert ESM module exports
        run: node scripts/assert_exports.mjs

      - name: Check Types
        run: yarn run check-types
      # Test docs generation, even if not published
      - name: Build docs
        run: yarn build:docs

      - name: README check
        run: yarn run check-readme

      - name: Lint
        run: yarn lint
      - name: Check Build
        run: yarn check-build
      - name: Unit tests
        run: yarn test:unit
      - name: Upload coverage data
        run: yarn coverage
