name: Tests
on:
  push:
  pull_request:
  schedule:
    - cron: '0 5 * * *'

jobs:
  test:
    name: ${{ matrix.redmine }} ${{ matrix.db }} ruby-${{ matrix.ruby }}
    runs-on: ubuntu-latest

    strategy:
      matrix:
        ruby: ['2.7', '3.0', '3.1', '3.2']
        redmine: ['5.0-stable', 'master']
        db: ['postgres', 'mysql']
        exclude:
          - ruby: '3.2'
            redmine: '5.0-stable'
      fail-fast: false

    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432:5432

        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

      mysql:
        image: mysql:8.0
        env:
          MYSQL_ROOT_PASSWORD: 'BestPasswordEver'
        ports:
          # will assign a random free host port
          - 3306/tcp
        options: >-
          --health-cmd="mysqladmin ping"
          --health-interval=10s
          --health-timeout=5s
          --health-retries=3

    steps:
      - name: Verify MySQL connection from host
        run: |
          mysql --host 127.0.0.1 --port ${{ job.services.mysql.ports[3306] }} -uroot -pBestPasswordEver -e "SHOW DATABASES"
        if: matrix.db == 'mysql'

      - name: Checkout Redmine
        uses: actions/checkout@v3
        with:
          repository: redmine/redmine
          ref: ${{ matrix.redmine }}
          path: redmine

      - name: Checkout redmine_messenger
        uses: actions/checkout@v3
        with:
          repository: AlphaNodes/redmine_messenger
          path: redmine/plugins/redmine_messenger

      - name: Update package archives
        run: sudo apt-get update --yes --quiet

      - name: Install package dependencies
        run: >
          sudo apt-get install --yes --quiet
          build-essential
          cmake
          libicu-dev
          libmysqlclient-dev

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true # runs 'bundle install' and caches installed gems automatically

      - name: Prepare Redmine source
        working-directory: redmine
        run: |
          cp plugins/redmine_messenger/test/support/database-mysql.yml config/database.yml
          cp plugins/redmine_messenger/test/support/configuration.yml config/configuration.yml

      - name: Install Ruby dependencies
        working-directory: redmine
        run: |
          bundle config set --local without 'development'
          bundle install --jobs=4 --retry=3

      - name: Run Redmine rake tasks
        env:
          RAILS_ENV: test
          MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
        working-directory: redmine
        run: |
          bundle exec rake generate_secret_token
          bundle exec rake db:create db:migrate redmine:plugins:migrate
          bundle exec rake db:test:prepare

      - name: Run tests
        env:
          RAILS_ENV: test
          MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
        working-directory: redmine
        run: bundle exec rake redmine:plugins:test NAME=redmine_messenger RUBYOPT="-W0"

      - name: Run uninstall test
        env:
          RAILS_ENV: test
          MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
        working-directory: redmine
        run: bundle exec rake redmine:plugins:migrate NAME=redmine_messenger VERSION=0
