name: Development

on: [ push, pull_request ]

env:
  PACKAGE_NAME: 'oxid-solution-catalysts/paypal-module'
  CLIENT_PACKAGE_NAME: 'oxid-solution-catalysts/paypal-client'
  CLIENT_REPO_NAME: 'https://github.com/OXID-eSales/paypal-client.git'
  MODULE_PATH: 'osc/paypal'
  SONARCLOUD_ORGANIZATION: 'oxid-esales'
  SONARCLOUD_PROJECT_KEY: 'OXID-eSales_module-paypal_checkout'

jobs:
  install_shop_with_module:
    strategy:
      matrix:
        php: [ '7.4', '8.0', '8.1' ]
    runs-on: ubuntu-latest
    steps:
      - name: Clone testing environment v3.0.0
        run: git clone https://github.com/OXID-eSales/docker-eshop-sdk.git . && git reset --hard v3.0.0

      - name: Clone the shop
        run: git clone --depth 1 https://github.com/OXID-eSales/oxideshop_ce.git --branch b-6.5.x --single-branch source

      - name: Cache current installation
        uses: actions/cache@v3.2.3
        with:
          path: |
            ./*
          key: moduleDevelopmentInstallation-${{ matrix.php }}-${{ github.sha }}

      - name: Prepare container configuration
        run: |
          make setup
          make addbasicservices
          make file=services/selenium-chrome.yml addservice
          perl -pi\
            -e "s#PHP_VERSION=.*#PHP_VERSION='${{ matrix.php }}'#g;"\
            .env

          perl -pi\
            -e 's#display_errors =.*#display_errors = false#g;'\
            -e 'print "xdebug.max_nesting_level=1000\nxdebug.mode=coverage\n\n"'\
            containers/php-fpm/custom.ini

          perl -pi\
            -e 's#/var/www/#/var/www/source/#g;'\
            containers/httpd/project.conf

      - name: Prepare shop configuration
        run: |
          cp source/source/config.inc.php.dist source/source/config.inc.php
          sed -i "1s+^+SetEnvIf Authorization "\(.*\)" HTTP_AUTHORIZATION=\$1\n\n+" source/source/.htaccess
          sed -i -e 's/<dbHost>/mysql/'\
                 -e 's/<dbUser>/root/'\
                 -e 's/<dbName>/example/'\
                 -e 's/<dbPwd>/root/'\
                 -e 's/<dbPort>/3306/'\
                 -e 's/<sShopURL>/http:\/\/localhost.local\//'\
                 -e 's/<sShopDir>/\/var\/www\/source\//'\
                 -e 's/<sCompileDir>/\/var\/www\/source\/tmp\//'\
              source/source/config.inc.php

      - name: Start containers
        run: |
          make up
          sleep 2

      - name: Checkout current module
        uses: actions/checkout@v3
        with:
          path: source/test-module

      - name: Install module
        run: |
          docker-compose exec -T \
            php composer require symfony/dotenv:^5.1 --no-update
          docker-compose exec -T \
            php composer require codeception/module-rest:1.4.2 --no-update
          docker-compose exec -T \
            php composer require codeception/module-phpbrowser:^1.0.2 --no-update
          docker-compose exec -T \
            php composer config repositories.${{ env.CLIENT_PACKAGE_NAME }} git ${{ env.CLIENT_REPO_NAME }}
          docker-compose exec -T \
            php composer config repositories.${{ env.PACKAGE_NAME }} \
            --json '{"type":"path", "url":"./test-module", "options": {"symlink": true}}'
          docker-compose exec -T \
            php composer require ${{ env.PACKAGE_NAME }}:* --no-interaction --no-update

      - name: Install dependencies and reset shop
        run: |
          docker-compose exec -T php composer update --no-interaction
          docker-compose exec -T php php vendor/bin/reset-shop

      - name: Put module settings
        continue-on-error: true
        run: |
          mkdir -p source/var/configuration/environment/
          echo "${{ secrets.MODULE_SETTINGS }}" > source/var/configuration/environment/1.yaml
          echo "${{ secrets.MODULE_ENV }}" > source/vendor/${{ env.PACKAGE_NAME }}/Tests/.env
          docker-compose exec -T php php bin/oe-console oe:module:apply-configuration

      - name: Stop containers
        run: |
          docker-compose down
          sleep 2

  styles:
    strategy:
      matrix:
        php: [ '8.0' ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout current module
        uses: actions/checkout@v3
        with:
          path: source/test-module

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          coverage: xdebug
          extensions: gd, zip

      - name: Install module dependencies
        id: dependencies
        working-directory: source/test-module
        run: composer install

      - name: Run phpcs
        id: phpcs
        if: always()
        working-directory: source/test-module
        run: composer phpcs

      - name: Run psalm
        id: psalm
        working-directory: source/test-module
        run: composer psalm-report

#      - name: Run phpstan
#        id: phpstan
#        if: always()
#        working-directory: source/test-module
#        run: composer phpstan-report || composer phpstan

#      - name: Run phpmd
#        id: phpmd
#        if: always()
#        working-directory: source/test-module
#        run: composer phpmd-report || composer phpmd

      - name: Upload log artifact
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: StylesLog-${{ matrix.php }}
          path: |
            source/test-module/psalm.sonarqube.json
#            source/test-module/phpstan.report.json
#            source/test-module/phpmd.report.json

  unit_tests:
    strategy:
      fail-fast: false
      matrix:
        php: [ '7.4', '8.0', '8.1' ]
    needs: [ install_shop_with_module ]
    runs-on: ubuntu-latest
    steps:
      - name: Load current installation from cache
        uses: actions/cache@v3.2.3
        with:
          path: |
            ./*
          key: moduleDevelopmentInstallation-${{ matrix.php }}-${{ github.sha }}
          restore-keys: |
            moduleDevelopmentInstallation-${{ matrix.php }}-${{ github.sha }}

      - name: Start containers
        run: |
          make up
          sleep 2

      - name: Run tests
        run: |
          docker-compose exec -T \
            -e PARTIAL_MODULE_PATHS=${{ env.MODULE_PATH }} \
            -e ACTIVATE_ALL_MODULES=1 \
            -e RUN_TESTS_FOR_SHOP=0 \
            -e RUN_TESTS_FOR_MODULES=0 \
            -e XDEBUG_MODE=coverage \
            -e ADDITIONAL_TEST_PATHS='/var/www/vendor/${{ env.PACKAGE_NAME }}/Tests' \
            php php vendor/bin/runtests \
              --coverage-clover=/var/www/coverage.xml \
              --coverage-text \
              --log-junit=/var/www/phpunit.xml \
              AllTestsUnit

      - name: Upload log artifact
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: TestsLog-${{ matrix.php }}
          path: |
            source/coverage.xml
            source/phpunit.xml

  codeception_tests:
    strategy:
      fail-fast: false
      matrix:
        php: [ '7.4', '8.0', '8.1' ]
        group:
          - 'oe_moduletemplate'
    needs: [ install_shop_with_module ]
    runs-on: ubuntu-latest
    steps:
      - name: Load current installation from cache
        uses: actions/cache@v3.2.3
        with:
          path: |
            ./*
          key: moduleDevelopmentInstallation-${{ matrix.php }}-${{ github.sha }}
          restore-keys: |
            moduleDevelopmentInstallation-${{ matrix.php }}-${{ github.sha }}

      - name: Start containers
        run: |
          make up
          sleep 2

      - name: Install codeception dependencies
        run: |
          docker-compose exec -T php composer require codeception/module-rest:^1.4.2 --dev --no-update
          docker-compose exec -T php composer require codeception/module-phpbrowser:^1.0.2 --dev --no-update
          docker-compose exec -T php composer update

      - name: Run tests
        run: |
          docker-compose exec -T \
            -e PARTIAL_MODULE_PATHS=${{ env.MODULE_PATH }} \
            -e ACTIVATE_ALL_MODULES=1 \
            -e RUN_TESTS_FOR_SHOP=0 \
            -e RUN_TESTS_FOR_MODULES=0 \
            -e ADDITIONAL_TEST_PATHS='/var/www/vendor/${{ env.PACKAGE_NAME }}/Tests' \
            php php vendor/bin/runtests-codeception

      - name: Stop containers
        if: always()
        run: |
          docker-compose down
          sleep 2
      - name: Upload log artifact
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: CodeceptionTestsLog-${{ matrix.php }}
          path: |
            source/vendor/${{ env.PACKAGE_NAME }}/Tests/Codeception/_output/
            source/source/log/oxideshop.log
            source/data/php/logs/error_log.txt

  sonarcloud:
    needs: [ styles, unit_tests ]
    if: always()
    runs-on: ubuntu-latest
    steps:
      - name: Checkout current module
        uses: actions/checkout@v3

      - name: Download phpunit artifacts
        continue-on-error: true
        uses: actions/download-artifact@v3
        with:
          name: TestsLog-7.4
          path: ./tests/

      - name: Fix paths in unit logs
        continue-on-error: true
        run: |
          sed -i 's+/var/www/test-module/++' tests/coverage.xml
          sed -i 's+/var/www/test-module/++' tests/phpunit.xml

      - name: Download styles artifacts
        uses: actions/download-artifact@v3
        with:
          name: StylesLog-8.0
          path: ./styles/

      - name: Fix paths in styles logs
        continue-on-error: true
        run: |
          sed -i 's+\/home\/runner\/work\/.*?\/.*?\/source\/test-module\/++' styles/phpstan.report.json

      - name: SonarCloud Scan
        uses: sonarsource/sonarcloud-github-action@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        with:
          args: >
            -Dsonar.organization=${{ env.SONARCLOUD_ORGANIZATION }}
            -Dsonar.projectKey=${{ env.SONARCLOUD_PROJECT_KEY }}
            -Dsonar.sources=src
            -Dsonar.tests=tests
            -Dsonar.sourceEncoding=UTF-8
            -Dsonar.php.coverage.reportPaths=tests/coverage.xml
            -Dsonar.php.phpstan.reportPaths=styles/phpstan.report.json
            -Dsonar.cpd.php.minimumTokens=25
            -Dsonar.cpd.php.minimumLines=5