name: Run Tests

on:
  workflow_call:
  pull_request:
    types:
      - opened
      - synchronize
  merge_group:
  workflow_dispatch:

defaults:
  run:
    shell: bash

jobs:
  test:
    name: Tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:13.18
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: data_collector
        ports:
          - 5432:5432
        # Needed because the Postgres container does not provide a health check
        # tmpfs makes database faster by using RAM
        options: >-
          --mount type=tmpfs,destination=/var/lib/postgresql/data
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      RAILS_ENV: test
      GEMFILE_RUBY_VERSION: 3.1.1
      DB_HOST: localhost
      DB_DATABASE: data_collector
      DB_USERNAME: postgres
      DB_PASSWORD: password
      RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
      PARALLEL_TEST_PROCESSORS: 4

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      # This is temporary to fix flaky parallel tests due to `secret_key_base` being read before it's set
      - name: Create local secret
        run: |
          echo $(ruby -e "require 'securerandom'; puts SecureRandom.hex(64)") > tmp/local_secret.txt

      - name: Create database
        run: |
          bundle exec rake parallel:setup

      - name: Compile assets
        run: |
          bundle exec rake assets:precompile

      - name: Run tests
        run: |
          bundle exec rake parallel:spec['spec\/(?!features|models|requests|services)']

  feature_test:
    name: Feature Tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:13.18
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: data_collector
        ports:
          - 5432:5432
        # Needed because the Postgres container does not provide a health check
        # tmpfs makes database faster by using RAM
        options: >-
          --mount type=tmpfs,destination=/var/lib/postgresql/data
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      RAILS_ENV: test
      GEMFILE_RUBY_VERSION: 3.1.1
      DB_HOST: localhost
      DB_DATABASE: data_collector
      DB_USERNAME: postgres
      DB_PASSWORD: password
      RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      - name: Create database
        run: |
          bundle exec rake db:prepare

      - name: Compile assets
        run: |
          bundle exec rake assets:precompile

      - name: Run tests
        run: |
          bundle exec rspec spec/features --fail-fast --exclude-pattern "spec/features/accessibility_spec.rb"

  model_test:
    name: Model tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:13.18
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: data_collector
        ports:
          - 5432:5432
        # Needed because the Postgres container does not provide a health check
        # tmpfs makes database faster by using RAM
        options: >-
          --mount type=tmpfs,destination=/var/lib/postgresql/data
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      RAILS_ENV: test
      GEMFILE_RUBY_VERSION: 3.1.1
      DB_HOST: localhost
      DB_DATABASE: data_collector
      DB_USERNAME: postgres
      DB_PASSWORD: password
      RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      - name: Create database
        run: |
          bundle exec rake db:prepare

      - name: Compile assets
        run: |
          bundle exec rake assets:precompile

      - name: Run tests
        run: |
          bundle exec rspec spec/models --fail-fast

  requests_test:
    name: Requests tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:13.18
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: data_collector
        ports:
          - 5432:5432
        # Needed because the Postgres container does not provide a health check
        # tmpfs makes database faster by using RAM
        options: >-
          --mount type=tmpfs,destination=/var/lib/postgresql/data
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      RAILS_ENV: test
      GEMFILE_RUBY_VERSION: 3.1.1
      DB_HOST: localhost
      DB_DATABASE: data_collector
      DB_USERNAME: postgres
      DB_PASSWORD: password
      RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
      PARALLEL_TEST_PROCESSORS: 4

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      - name: Create local secret
        run: |
          echo $(ruby -e "require 'securerandom'; puts SecureRandom.hex(64)") > tmp/local_secret.txt

      - name: Create database
        run: |
          bundle exec rake parallel:setup

      - name: Compile assets
        run: |
          bundle exec rake assets:precompile

      - name: Run tests
        run: |
          bundle exec rake parallel:spec['spec/requests']

  services_test:
    name: Services Tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:13.18
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: data_collector
        ports:
          - 5432:5432
        # Needed because the Postgres container does not provide a health check
        # tmpfs makes database faster by using RAM
        options: >-
          --mount type=tmpfs,destination=/var/lib/postgresql/data
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      RAILS_ENV: test
      GEMFILE_RUBY_VERSION: 3.1.1
      DB_HOST: localhost
      DB_DATABASE: data_collector
      DB_USERNAME: postgres
      DB_PASSWORD: password
      RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
      PARALLEL_TEST_PROCESSORS: 4

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      - name: Create local secret
        run: |
          echo $(ruby -e "require 'securerandom'; puts SecureRandom.hex(64)") > tmp/local_secret.txt

      - name: Create database
        run: |
          bundle exec rake parallel:setup

      - name: Compile assets
        run: |
          bundle exec rake assets:precompile

      - name: Run tests
        run: |
          bundle exec rake parallel:spec['spec\/services']

  accessibility_test:
    name: Accessibility tests
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:13.18
        env:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: data_collector
        ports:
          - 5432:5432
        # Needed because the Postgres container does not provide a health check
        # tmpfs makes database faster by using RAM
        options: >-
          --mount type=tmpfs,destination=/var/lib/postgresql/data
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      RAILS_ENV: test
      GEMFILE_RUBY_VERSION: 3.1.1
      DB_HOST: localhost
      DB_DATABASE: data_collector
      DB_USERNAME: postgres
      DB_PASSWORD: password
      RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
      PARALLEL_TEST_PROCESSORS: 4

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      - name: Create database
        run: |
          bundle exec rake db:prepare

      - name: Compile assets
        run: |
          bundle exec rake assets:precompile

      - name: Run tests
        run: |
          bundle exec rspec spec/features/accessibility_spec.rb --fail-fast

  lint:
    name: Lint
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          cache: yarn
          node-version: 20

      - name: Install packages and symlink local dependencies
        run: |
          yarn install --immutable --immutable-cache --check-cache

      - name: Lint
        run: |
          bundle exec rake lint

  audit:
    name: Audit dependencies
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Audit
        run: |
          bundle exec bundler-audit