name: tests

on:
  push:
    branches:
      - master
      - develop
      - '*.x'
  pull_request:
  schedule:
    - cron: '0 0 * * *'

jobs:
  stub-tests:
    runs-on: ubuntu-latest

    strategy:
      fail-fast: true
      matrix:
        stack: [blade, livewire, livewire-functional, react, vue, api]
        laravel: [11, 12]
        args: ["", --pest]
        include:
          - stack: vue
            args: --ssr --typescript
            laravel: 11
          - stack: react
            args: --ssr --typescript
            laravel: 11
          - stack: vue
            args: --ssr --typescript
            laravel: 12
          - stack: react
            args: --ssr --typescript
            laravel: 12

    name: Test Stubs - Laravel ${{ matrix.laravel }} - ${{ matrix.stack }} ${{ matrix.args }}

    steps:
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.2
          extensions: dom, curl, libxml, mbstring, zip
          ini-values: error_reporting=E_ALL
          tools: composer:v2
          coverage: none

      - name: Setup Laravel
        run: |
          composer create-project laravel/laravel:^${{ matrix.laravel }} .
          composer require laravel/breeze:@dev --no-interaction --no-update
          composer config repositories.breeze '{"type": "path", "url": "breeze"}' --file composer.json
        if: matrix.laravel < 12

      - name: Setup Laravel (dev-master)
        run: |
          composer create-project laravel/laravel:dev-master .
          composer require laravel/breeze:@dev --no-interaction --no-update
          composer config repositories.breeze '{"type": "path", "url": "breeze"}' --file composer.json
        if: matrix.laravel == 12

      - name: Checkout code
        uses: actions/checkout@v4
        with:
          path: 'breeze'

      - name: Install Breeze
        run: |
          composer update "laravel/breeze" --prefer-dist --no-interaction --no-progress -W
          php artisan breeze:install ${{ matrix.stack }} ${{ matrix.args }}

      - name: Install NPM dependencies
        if: matrix.stack != 'api'
        run: npm i

      - name: Compile assets
        if: matrix.stack != 'api'
        run: npm run build

      - name: Execute tests
        run: ${{ matrix.args == '--pest' && 'vendor/bin/pest' || 'vendor/bin/phpunit' }}
        env:
          DB_CONNECTION: sqlite
          DB_DATABASE: ":memory:"
