name: Test

on:
  pull_request:
  push:
    branches:
      - main
      - stable*

jobs:
  unit-tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        php-versions: [7.3, 7.4]
        nextcloud-versions: ['stable21', 'stable22', 'stable23', 'master']
        include:
            - php: 8.0
              nextcloud-version: master
    name: Nextcloud ${{ matrix.nextcloud-versions }} php${{ matrix.php-versions }} unit tests
    steps:
    - name: Set up php${{ matrix.php-versions }}
      uses: shivammathur/setup-php@master
      with:
        php-version: ${{ matrix.php-versions }}
        tools: composer:v1
        extensions: ctype,curl,dom,gd,iconv,intl,json,mbstring,openssl,posix,sqlite,xml,zip,gmp
        coverage: xdebug
    - name: Checkout Nextcloud
      run: git clone https://github.com/nextcloud/server.git --recursive --depth 1 -b ${{ matrix.nextcloud-versions }} nextcloud
    - name: Install Nextcloud
      run: php -f nextcloud/occ maintenance:install --database-name oc_autotest --database-user oc_autotest --admin-user admin --admin-pass admin --database sqlite --database-pass=''
    - name: Fix php-parser on stable20 incompatibility with phpunit 9.3+
      if: ${{ matrix.nextcloud-versions == 'stable20' }}
      working-directory: nextcloud/3rdparty
      run: composer require nikic/php-parser:4.10
    - name: Checkout Mail
      uses: actions/checkout@master
      with:
        path: nextcloud/apps/mail
    - name: Install dependencies
      working-directory: nextcloud/apps/mail
      run: composer install
    - name: Run tests
      working-directory: nextcloud/apps/mail
      run: composer run test:unit
      env:
        XDEBUG_MODE: coverage
    - name: Report coverage
      uses: codecov/codecov-action@v2.1.0
      if: ${{ always() && matrix.nextcloud-versions == 'master' }}
      with:
        file: ./nextcloud/apps/mail/tests/clover.unit.xml
        flags: unittests
        fail_ci_if_error: true

  integration-tests:
      runs-on: ubuntu-latest
      strategy:
          matrix:
              php-versions: [7.4, 8.0]
              nextcloud-versions: ['master']
              db: ['sqlite', 'mysql', 'pgsql']
      name: php${{ matrix.php-versions }}-${{ matrix.db }} integration tests
      services:
          mail-service:
              image: christophwurst/imap-devel
              env:
                  MAILNAME: mail.domain.tld
                  MAIL_ADDRESS: user@domain.tld
                  MAIL_PASS: mypassword
              ports:
                  - 25:25
                  - 143:143
                  - 993:993
                  - 4190:4190
          mysql-service:
              image: mariadb:10.5
              env:
                  MYSQL_ROOT_PASSWORD: my-secret-pw
                  MYSQL_DATABASE: nextcloud
                  MYSQL_USER: nextcloud
                  MYSQL_PASSWORD: nextcloud
              ports:
                  - 3306:3306
              options: >-
                  --health-cmd="mysqladmin ping"
                  --health-interval=10s
                  --health-timeout=5s
                  --health-retries=3
          postgres-service:
              image: postgres
              env:
                  POSTGRES_USER: nextcloud
                  POSTGRES_DB: nextcloud
                  POSTGRES_PASSWORD: nextcloud
              ports:
                  - 5432:5432
              options: >-
                  --health-cmd pg_isready
                  --health-interval 10s
                  --health-timeout 5s
                  --health-retries 5
      steps:
          - name: Set up php${{ matrix.php-versions }}
            uses: shivammathur/setup-php@master
            with:
                php-version: ${{ matrix.php-versions }}
                tools: composer:v1
                extensions: ctype,curl,dom,gd,iconv,intl,json,mbstring,openssl,posix,sqlite,xml,zip,gmp
                coverage: xdebug
          - name: Checkout Nextcloud
            run: git clone https://github.com/nextcloud/server.git --recursive --depth 1 -b ${{ matrix.nextcloud-versions }} nextcloud
          - name: Install Nextcloud
            run: php -f nextcloud/occ maintenance:install --database-host 127.0.0.1 --database-name nextcloud --database-user nextcloud --database-pass nextcloud --admin-user admin --admin-pass admin --database ${{ matrix.db }}
          - name: Checkout Mail
            uses: actions/checkout@master
            with:
                path: nextcloud/apps/mail
          - name: Install dependencies
            working-directory: nextcloud/apps/mail
            run: composer install
          - name: Install Mail
            run: php -f nextcloud/occ app:enable mail
          - name: Configure Nextcloud for testing
            run: |
                php -f nextcloud/occ config:system:set debug --type bool --value true
                php -f nextcloud/occ config:system:set app.mail.verify-tls-peer --type bool --value false
          - name: Run tests
            working-directory: nextcloud/apps/mail
            run: |
                ss -tunlp
                true | openssl s_client -crlf -connect 127.0.0.1:993
                composer run test:integration
            env:
                XDEBUG_MODE: coverage
          - name: Print debug logs
            if: ${{ always() }}
            run: cat nextcloud/data/horde_*.log
          - name: Report coverage
            uses: codecov/codecov-action@v2.1.0
            if: ${{ always() && matrix.db == 'mysql' }}
            with:
              file: ./nextcloud/apps/mail/tests/clover.integration.xml
              flags: integrationtests
              fail_ci_if_error: true
  frontend-unit-test:
      runs-on: ubuntu-latest
      name: Front-end unit tests
      steps:
          - uses: actions/checkout@master
          - name: Set up Node
            uses: actions/setup-node@v2.5.0
            with:
                node-version: 12.x
          - name: npm install
            run: npm install
          - name: run tests
            run: npm run test
      env:
          CI: true
