name: CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ "*" ]
  workflow_dispatch:

jobs:
  test:
    name: "PHPUnit: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}"
    continue-on-error: ${{ matrix.experimental }}

    strategy:
      matrix:
        include:
          - mw: 'REL1_43'
            php: 8.1
            experimental: false
          - mw: 'REL1_44'
            php: 8.2
            experimental: false
          - mw: 'REL1_45'
            php: 8.3
            experimental: false
          - mw: 'master'
            php: 8.4
            experimental: true
          - mw: 'master'
            php: 8.5
            experimental: true

    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: mediawiki

    steps:
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: mbstring, intl
          tools: composer

      - name: Cache MediaWiki
        id: cache-mediawiki
        uses: actions/cache@v4
        with:
          path: |
            mediawiki
            !mediawiki/extensions/
            !mediawiki/vendor/
          key: mw_${{ matrix.mw }}-php${{ matrix.php }}

      - name: Cache Composer cache
        uses: actions/cache@v4
        with:
          path: ~/.composer/cache
          key: composer-php${{ matrix.php }}

      - uses: actions/checkout@v4
        with:
          path: EarlyCopy

      - name: Install MediaWiki
        if: steps.cache-mediawiki.outputs.cache-hit != 'true'
        working-directory: ~
        run: bash EarlyCopy/.github/workflows/installWiki.sh ${{ matrix.mw }} Bootstrap

      - uses: actions/checkout@v4
        with:
          path: mediawiki/extensions/Bootstrap

      - name: Composer allow-plugins
        run: composer config --no-plugins allow-plugins.composer/installers true

      - name: Composer update
        run: composer update

      # "master" currently tracks MW >= 1.46, where tests/phpunit/phpunit.php
      # was removed. Once REL1_46 lands in the matrix, it needs the master
      # invocation below as well.
      - name: Run PHPUnit (MW < master)
        if: matrix.mw != 'master'
        run: php tests/phpunit/phpunit.php -c extensions/Bootstrap/

      - name: Run PHPUnit (MW master)
        if: matrix.mw == 'master'
        run: |
          # TODO: phpunit.xml.template is export-ignored from GitHub's tarball
          # archive, so we fetch it separately. Remove this once installWiki.sh
          # switches to `git clone`, or MW drops the export-ignore.
          if [ ! -f phpunit.xml.template ]; then
            wget -q -O phpunit.xml.template "https://raw.githubusercontent.com/wikimedia/mediawiki/${{ matrix.mw }}/phpunit.xml.template"
          fi
          composer phpunit:config
          vendor/bin/phpunit --group extension-bootstrap
