name: Testing

on:
  pull_request:

jobs:

  test-js:
    name: Test asset generation process on Node 16 LTS
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1

      - name: Use Node.js 16 LTS
        uses: actions/setup-node@v2
        with:
          node-version: 16

      - name: Try to build the assets
        run: |
          npm ci
          npm run production

      - name: Upload built assets
        uses: actions/upload-artifact@v1
        with:
          name: assets
          path: public/assets/dist

      - name: Upload mix manifest
        uses: actions/upload-artifact@v1
        with:
          name: mix-manifest
          path: public/mix-manifest.json

  test-php:
    name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }}

    runs-on: ${{ matrix.operating-system }}
    needs: test-js
    strategy:
      matrix:
        operating-system: [ ubuntu-latest ]
        php-versions: [ '7.4', '8.0', '8.1' ]

    steps:
      - uses: actions/checkout@v2

      - uses: actions/download-artifact@v1
        with:
          name: assets
          path: public/assets/dist

      - uses: actions/download-artifact@v1
        with:
          name: mix-manifest
          path: public

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          extensions: dom, curl, libxml, mbstring, zip, json

      - name: Get Composer Cache Directory
        id: composer-cache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"

      - name: Cache dependencies
        uses: actions/cache@v1
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

      - name: Prepare the environment
        run: cp .env.example .env && touch database/testing.sqlite

      - name: Validate composer.json and composer.lock
        run: composer validate

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress --no-suggest

      - name: Run PHP CS
        run: composer run lint

      - name: Run PHPunit
        run: composer run test

      - uses: actions/upload-artifact@v1
        if: failure()
        with:
          name: application-logs
          path: storage/logs

      - uses: actions/upload-artifact@v1
        if: failure()
        with:
          name: application-public
          path: public
