name: Tests
on:
  - push
  - pull_request
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true
jobs:
  test:
    name: Ubuntu ${{ matrix.ubuntu }}, Ruby ${{ matrix.ruby }}
    strategy:
      matrix:
        ubuntu: [22.04, 24.04]
        ruby: ['3.1', '3.2', '3.3']
    runs-on: ubuntu-${{ matrix.ubuntu }}
    env:
      RAILS_ENV: test
      OPENSTREETMAP_MEMCACHE_SERVERS: 127.0.0.1
    steps:
    - name: Checkout source
      uses: actions/checkout@v4
    - name: Setup ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby }}
        rubygems: 3.4.10
        bundler-cache: true
    - name: Cache node modules
      uses: actions/cache@v4
      with:
        path: node_modules
        key: yarn-ubuntu-${{ matrix.ubuntu }}-${{ hashFiles('yarn.lock') }}
        restore-keys: |
          yarn-ubuntu-${{ matrix.ubuntu }}-
    - name: Install packages
      run: |
        sudo apt-get -yqq update
        sudo apt-get -yqq install memcached libvips-dev
    - name: Create database
      run: |
        sudo systemctl start postgresql
        sudo -u postgres createuser -s $(id -un)
        createdb openstreetmap
    - name: Configure rails
      run: |
        cp config/github.database.yml config/database.yml
        cp config/example.storage.yml config/storage.yml
        touch config/settings.local.yml
    - name: Populate database
      run: |
        sed -f script/normalise-structure db/structure.sql > db/structure.expected
        bundle exec rails db:migrate
        sed -f script/normalise-structure db/structure.sql > db/structure.actual
        diff -uw db/structure.expected db/structure.actual
    - name: Export javascript strings
      run: bundle exec rails i18n:js:export
    - name: Install node modules
      run: bundle exec bin/yarn install
    - name: Compile assets
      run: bundle exec rails assets:precompile
    - name: Create tmp/pids directory
      run: mkdir -p tmp/pids
    - name: Run tests
      run: bundle exec rails test:all
    - name: Run javascript tests
      run: bundle exec teaspoon
    - name: Report completion to Coveralls
      uses: coverallsapp/github-action@v2.3.6
      with:
        github-token: ${{ secrets.github_token }}
        flag-name: ubuntu-${{ matrix.ubuntu }}-ruby-${{ matrix.ruby }}
        format: lcov
        parallel: true
  finish:
    name: Finalise
    needs: test
    runs-on: ubuntu-latest
    steps:
    - name: Report completion to Coveralls
      uses: coverallsapp/github-action@v2.3.6
      with:
        github-token: ${{ secrets.github_token }}
        parallel-finished: true