# Redmine plugin for Document Management System "Features"
#
# Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#
# GitHub CI script

name: "GitHub CI"
on:
  push:
    branches: ["devel"]
  pull_request:
    branches: ["devel"]
jobs:
  plugin_tests:
    strategy:
      matrix:
        engine: [mysql, postgresql, sqlite]
        include:
          - engine: mysql
            # Database configuration for Redmine
            database_configuration: >
              test:
                adapter: mysql2
                database: test
                username: redmine
                password: redmine
                encoding: utf8mb4
                collation: utf8mb4_unicode_ci
            # SQL commands to create a database for Redmine
            sql1: CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8mb4;
            sql2: CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'redmine';
            sql3: GRANT ALL PRIVILEGES ON test.* TO 'redmine'@'localhost';
            # SQL client command
            database_command: mysql -uroot -proot -e
            # SQl service
            database_service: mysql
          - engine: postgresql
            # Database configuration for Redmine
            database_configuration: >
              test:
                adapter: postgresql
                database: test
                username: redmine
                password: redmine
                host: localhost
            # SQL commands to create a database for Redmine
            sql1: CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'redmine' NOINHERIT VALID UNTIL 'infinity';
            sql2: CREATE DATABASE test WITH ENCODING='UTF8' OWNER=redmine;
            sql3: ALTER USER redmine CREATEDB;
            # SQL client command
            database_command:  sudo -u postgres psql -c
            # SQL service
            database_service: postgresql
          - engine: sqlite
            # Database configuration for Redmine
            database_configuration: >
              test:
                adapter: sqlite3
                database: db/redmine.sqlite3
            # No database needed here. It's just a file.
    runs-on: ubuntu-latest
    env:
      RAILS_ENV: test
      NAME: redmine_dmsf
    steps:
      - name: Install dependencies
        # Install necessary packages
        run: |
          sudo apt-get update
          sudo apt-get install -y litmus libreoffice
      - name: Clone Redmine
        # Get the latest stable Redmine
        run: svn export http://svn.redmine.org/redmine/branches/5.1-stable/ /opt/redmine
      - name: Checkout code
        uses: actions/checkout@v3        
      - name: Link the plugin
        # Link the plugin to the redmine folder
        run: | 
          ln -s $(pwd) /opt/redmine/plugins/redmine_dmsf
      - name: Install Ruby and gems
        uses: ruby/setup-ruby@0a29871fe2b0200a17a4497bae54fe5df0d973aa # v1.115.3
        with:
          bundler-cache: true
          ruby-version: '3.1'
      - name: Setup database
        # Create the database
        run: | 
          echo "${{matrix.database_configuration}}" > /opt/redmine/config/database.yml      
          if [[ "${{matrix.database_service}}" ]]; then
            sudo systemctl start ${{matrix.engine}}
          fi
          if [[ "${{matrix.database_command}}" ]]; then
            ${{matrix.database_command}} "${{matrix.sql1}}"
            ${{matrix.database_command}} "${{matrix.sql2}}"
            ${{matrix.database_command}} "${{matrix.sql3}}"
          fi
      - name: Install Redmine
        # Install Redmine
        run: |
          cd /opt/redmine
          echo "gem \"webrick\"" > Gemfile.local          
          bundle config set --local without 'rmagick development xapian'
          bundle install
          bundle exec rake generate_secret_token
          bundle exec rake db:migrate
          bundle exec rake redmine:plugins:migrate
          bundle exec rake redmine:load_default_data
        env:
          REDMINE_LANG: en
      - name: Configure WebDAV
        # Add configuration for WebDAV to work
        run: |
          cp /opt/redmine/config/additional_environment.rb.example /opt/redmine/config/additional_environment.rb
          echo "config.log_level = :info" >> /opt/redmine/config/additional_environment.rb
          echo "# Redmine DMSF's WebDAV" >> /opt/redmine/config/additional_environment.rb
          echo "require \"#{Rails.root}/plugins/redmine_dmsf/lib/redmine_dmsf/webdav/custom_middleware\"" >> /opt/redmine/config/additional_environment.rb
          echo "config.middleware.insert_before ActionDispatch::Cookies, RedmineDmsf::Webdav::CustomMiddleware" >> /opt/redmine/config/additional_environment.rb
      - name: Standard tests
        # Run the tests
        run: |
          cd /opt/redmine
          bundle exec rake redmine:plugins:test:units
          bundle exec rake redmine:plugins:test:functionals
          bundle exec rake redmine:plugins:test:integration
      - name: Helpers tests
        run: |
          cd /opt/redmine
          ruby plugins/redmine_dmsf/test/helpers/dmsf_helper_test.rb
          ruby plugins/redmine_dmsf/test/helpers/dmsf_queries_helper_test.rb
      - name: Rubocop
        # Run the Rubocop tests
        run: |
          cd /opt/redmine                    
          bundle exec rubocop -c plugins/redmine_dmsf/.rubocop.yml plugins/redmine_dmsf/
      - name: Litmus
        # Prepare Redmine's environment for WebDAV testing
        # Run Webrick server
        # Run Litmus tests (Omit 'http' tests due to 'timeout waiting for interim response' and locks due to complex bogus conditional)
        # Shutdown Webrick
        # Clean up Redmine's environment from WebDAV testing
        run: |
          cd /opt/redmine
          bundle exec rake redmine:dmsf_webdav_test_on
          bundle exec rails server -u webrick -e test -d
          sleep 5
          litmus http://localhost:3000/dmsf/webdav/dmsf_test_project admin admin
          kill `cat tmp/pids/server.pid`
          bundle exec rake redmine:dmsf_webdav_test_off
        env:
          TESTS: "basic copymove props"
      - name: Cleanup
        # Rollback plugin's changes to the database
        # Stop the database engine
        run: |
          cd /opt/redmine
          bundle exec rake redmine:plugins:migrate VERSION=0
          if [[ "${{matrix.database_service}}" ]]; then
            sudo systemctl stop ${{matrix.engine}}
          fi
