name: CI

on: [push, pull_request]

jobs:
  tests:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      matrix:
        operating-system: [ubuntu-latest]
        php-versions: ['8.1']
    name: PHP ${{ matrix.php-versions }} test on ${{ matrix.operating-system }}

    services:
      mysql:
        image: mysql:5.7
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: bagisto
        ports:
          - 3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          extensions: curl, gd, intl, mbstring, openssl, pdo, pdo_mysql, tokenizer, zip

      - name: Composer Install
        run: |
          set -e
          composer install --no-cache

      - name: Set Testing Environment
        run: |
          cp .env.example .env.testing
          set -e
          sed -i "s|^\(APP_ENV=\s*\).*$|\1testing|" .env.testing
          sed -i "s|^\(DB_HOST=\s*\).*$|\1127.0.0.1|" .env.testing
          sed -i "s|^\(DB_PORT=\s*\).*$|\1${{ job.services.mysql.ports['3306'] }}|" .env.testing
          sed -i "s|^\(DB_DATABASE=\s*\).*$|\1bagisto|" .env.testing
          sed -i "s|^\(DB_USERNAME=\s*\).*$|\1root|" .env.testing
          sed -i "s|^\(DB_PASSWORD=\s*\).*$|\1root|" .env.testing

      - name: Key Generate
        run: set -e && php artisan key:generate --env=testing

      - name: Comlplete Testing Env File
        run: |
          printf "The complete `.env.testing` ... \n\n"
          cat .env.testing

      - name: Optimize Stuffs
        run: set -e && php artisan optimize:clear --env=testing

      - name: Migrate Database
        run: set -e && php artisan migrate --env=testing

      - name: Seed Database
        run: set -e && php artisan db:seed --env=testing

      - name: Vendor Publish
        run: set -e && php artisan bagisto:publish --force --env=testing

      - name: Execute Unit Tests
        run: set -e && vendor/bin/codecept run unit

      - name: Execute Functional Tests
        run: set -e && vendor/bin/codecept run functional

      - name: Execute Trigger Tests
        run: set -e && vendor/bin/codecept run trigger

      - name: Execute API Tests
        run: set -e && vendor/bin/codecept run api

      - name: Persist Test Artifacts
        uses: actions/upload-artifact@v1
        if: always()
        with:
          name: test_artifacts
          path: tests/_output
