name: CI Suite
on:
  - pull_request

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: 3.4
        bundler-cache: true
    - run: bundle exec rake rubocop
  system_tests:
    runs-on: ubuntu-latest
    steps:
    - uses: shogo82148/actions-setup-redis@v1
      with:
        redis-version: "7.x"
    - run: redis-cli ping
    - uses: actions/checkout@v6
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: 3.4
        bundler-cache: true
      env:
        BUNDLE_GEMS__GRAPHQL__PRO: ${{ secrets.BUNDLE_GEMS__GRAPHQL__PRO }}
        BUNDLE_GEMFILE: gemfiles/rails_master.gemfile
    - run: bin/rails test:all
      working-directory: ./spec/dummy
      env:
        BUNDLE_GEMS__GRAPHQL__PRO: ${{ secrets.BUNDLE_GEMS__GRAPHQL__PRO }}
        BUNDLE_GEMFILE: ../../gemfiles/rails_master.gemfile
  # Some coverage goals of these tests:
  # - Test once without Rails at all
  # - Test postgres, to make sure that the ActiveRecord
  #   stuff works on that (as well as the default sqlite)
  # - Test mongoid -- and several versions, since they're quite different
  # - Run the JS unit tests once
  # - Test each major version of Rails we support
  # - Test the min/max minor Ruby version we support (and others?)
  test:
    strategy:
      fail-fast: false
      matrix:
        include:
          - gemfile: Gemfile
            ruby: head
          - gemfile: Gemfile
            ruby: 2.7 # lowest supported version
          - gemfile: gemfiles/rails_8.0.gemfile
            ruby: 3.3
            graphql_reject_numbers_followed_by_names: 1
          - gemfile: gemfiles/rails_8.1.gemfile
            ruby: 4.0
            graphql_reject_numbers_followed_by_names: 1
            redis: 1
          - gemfile: gemfiles/rails_master.gemfile
            ruby: 3.4
            graphql_reject_numbers_followed_by_names: 1
            isolation_level_fiber: 1
            redis: 1
    runs-on: ubuntu-latest
    steps:
    - run: echo BUNDLE_GEMFILE=${{ matrix.gemfile }} > $GITHUB_ENV
    - run: echo GRAPHQL_REJECT_NUMBERS_FOLLOWED_BY_NAMES=1 > $GITHUB_ENV
      if: ${{ !!matrix.graphql_reject_numbers_followed_by_names }}
    - run: echo ISOLATION_LEVEL_FIBER=1 > $GITHUB_ENV
      if: ${{ !!matrix.isolation_level_fiber }}
    - uses: shogo82148/actions-setup-redis@v1
      with:
        redis-version: "7.x"
      if: ${{ !!matrix.redis }}
    - run: redis-cli ping
      if: ${{ !!matrix.redis }}
    - uses: actions/checkout@v6
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby }}
        bundler-cache: true
    - run: bundle exec rake compile
    - run: bundle exec rake test
  javascript_test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
    - uses: actions/setup-node@v6
      with:
        node-version: '21'
    - run: npm ci
      working-directory: ./javascript_client
    - run: npm test
      working-directory: ./javascript_client
  postgres_test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
        - gemfile: gemfiles/rails_master.gemfile
          ruby: 3.3
          isolation_level_fiber: 1
        - gemfile: gemfiles/rails_7.2_postgresql.gemfile
          ruby: 3.3
    services:
      postgres:
        image: postgres:latest
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: postgres
        ports:
        - 5432:5432
        # needed because the postgres container does not provide a healthcheck
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
    - run: echo BUNDLE_GEMFILE='' > $GITHUB_ENV
    - run: echo DATABASE='POSTGRESQL' > $GITHUB_ENV
    - run: echo PGPASSWORD='postgres' > $GITHUB_ENV
    - run: echo GRAPHQL_CPARSER=1 > $GITHUB_ENV
    - run: echo ISOLATION_LEVEL_FIBER=1 > $GITHUB_ENV
      if: ${{ !!matrix.isolation_level_fiber }}
    - uses: actions/checkout@v6
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: "3.3"
        bundler-cache: true
    - run: bundle exec rake compile test
  mongodb_test:
    strategy:
      fail-fast: false
      matrix:
        gemfile:
          - gemfiles/mongoid_9.gemfile
          - gemfiles/mongoid_8.gemfile
    runs-on: ubuntu-latest
    services:
      mongodb:
        image: mongo
        ports:
        - 27017:27017
    steps:
    - run: echo BUNDLE_GEMFILE=${{ matrix.gemfile }} > $GITHUB_ENV
    - uses: actions/checkout@v6
    - uses: ruby/setup-ruby@v1
      with:
        ruby-version: 3.4
        bundler-cache: true
    - run: bundle exec rake compile test
