WordPress-Coding-Standards/.github/workflows/unit-tests.yml
Rodrigo Primo e3da696385
Tests: update to allow for running the tests on PHPCS 4.x
As of PHPCS 4.0, the base sniff test class has been renamed from `AbstractSniffUnitTest` to `AbstractSniffTestCase`. Additionally, the PHPCS test setup no longer uses the outdated custom test suite creation.

This means that to allow for the tests to run on both PHPCS 3.x and 4.x, some changes are needed.

This commit handles this by:
* Changing all test files to `extend` the new test case class and adding a class alias to the test bootstrap for compatibility with PHPCS 3.x.
* Adding separate scripts to the `composer.json` file for invoking the tests on PHPCS 3.x vs 4.x.
* Updating the minimum PHPUnit 9 version to 9.3.4 as required by the PHPCS 4.x native test framework.
* Add GH Actions jobs to test against PHPCS 4.x to all `test` matrices.
* Updating the `quicktest` and `unit-tests` GH Actions jobs to use the correct Composer script based on the installed PHPCS version.
* Run the `basic-qa` code-sniff and ruleset-test jobs against both PHPCS 3.x-dev and 4.x-dev.
* Update `basic-qa` to accept the phpcbf NON_FIXABLE exit code (2) on PHPCS 4.x in the fixer-conflict check. PHPCS 4.0 reworked the phpcbf exit codes into a bitmask.

_Note: even though PHPCS 4.x supports PHPUnit 10 and 11, we cannot widen the version restrictions for PHPUnit (yet) while PHPCS 3.x is also supported as it would lead to PHPUnit 10/11 being installed for PHPCS 3.x on PHP >= 8.1, which would break the test runs._

---------

Co-authored-by: Juliette <663378+jrfnl@users.noreply.github.com>
2026-07-17 16:25:20 -03:00

172 lines
6.5 KiB
YAML

name: Unit Tests
on:
push:
branches:
- main
pull_request:
# Allow manually triggering the workflow.
workflow_dispatch:
# Cancels all previous workflow runs for the same branch that have not yet completed.
concurrency:
# The concurrency group contains the workflow name and the branch name.
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
PHPCS_3_DEV: '3.x-dev'
PHPCS_4_DEV: '4.x-dev'
UTILS_DEV: 'dev-develop'
EXTRA_DEV: 'dev-develop'
jobs:
# Runs the test suite against all supported branches and combinations.
# Linting is performed on all jobs run with dependencies `stable`.
test:
runs-on: ubuntu-latest
strategy:
matrix:
php: [ '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.6' ]
dependencies: [ 'lowest', 'stable' ]
extensions: [ '' ]
coverage: [false]
include:
# Run code coverage builds against high/low PHP and high/low PHPCS.
- php: '7.2'
dependencies: 'stable'
extensions: ''
coverage: true
- php: '7.2'
dependencies: 'lowest'
extensions: ''
coverage: true
- php: '8.5'
dependencies: 'stable'
extensions: ''
coverage: true
- php: '8.5'
dependencies: 'lowest'
extensions: ''
coverage: true
# Test against dev versions of all dependencies with select PHP versions for early detection of issues.
- php: '7.2'
dependencies: 'phpcs-3-dev'
extensions: ''
coverage: false
- php: '7.2'
dependencies: 'phpcs-4-dev'
extensions: ''
coverage: false
- php: '8.1'
dependencies: 'phpcs-3-dev'
extensions: ''
coverage: false
- php: '8.1'
dependencies: 'phpcs-4-dev'
extensions: ''
coverage: false
- php: '8.4'
dependencies: 'phpcs-3-dev'
extensions: ''
coverage: false
- php: '8.5'
dependencies: 'phpcs-4-dev'
extensions: ''
coverage: false
# Add extra build to test against PHPCS 4.
#- php: '7.4'
# dependencies: '4.0.x-dev as 3.99.99'
name: PHP ${{ matrix.php }} on PHPCS ${{ matrix.dependencies }}
continue-on-error: ${{ matrix.php == '8.6' }}
steps:
- name: Checkout repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
# With stable PHPCS dependencies, allow for PHP deprecation notices.
# Unit tests don't need to fail on those for stable releases where those issues won't get fixed anymore.
- name: Setup ini config
id: set_ini
run: |
if [ "${{ matrix.dependencies }}" != "phpcs-3-dev" ] && [ "${{ matrix.dependencies }}" != "phpcs-4-dev" ]; then
echo 'PHP_INI=error_reporting=E_ALL & ~E_DEPRECATED, display_errors=On, display_startup_errors=On' >> "$GITHUB_OUTPUT"
else
echo 'PHP_INI=error_reporting=-1, display_errors=On, display_startup_errors=On' >> "$GITHUB_OUTPUT"
fi
- name: Set up PHP
uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2
with:
php-version: ${{ matrix.php }}
ini-values: ${{ steps.set_ini.outputs.PHP_INI }}
coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}
tools: cs2pr
- name: "Composer: set PHPCS dependencies for tests (dev)"
if: ${{ matrix.dependencies == 'phpcs-3-dev' || matrix.dependencies == 'phpcs-4-dev' }}
run: >
composer require --no-update --no-scripts --no-interaction
squizlabs/php_codesniffer:"${{ matrix.dependencies == 'phpcs-3-dev' && env.PHPCS_3_DEV || env.PHPCS_4_DEV }}"
phpcsstandards/phpcsutils:"${{ env.UTILS_DEV }}"
phpcsstandards/phpcsextra:"${{ env.EXTRA_DEV }}"
- name: Enable creation of `composer.lock` file
if: ${{ matrix.dependencies == 'lowest' }}
run: composer config --unset lock
- name: Install Composer dependencies
uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
# Bust the cache at least once a month - output format: YYYY-MM.
custom-cache-suffix: $(date -u "+%Y-%m")
- name: "Composer: downgrade PHPCS dependencies for tests (lowest)"
if: ${{ matrix.dependencies == 'lowest' }}
run: >
composer update --prefer-lowest --no-scripts --no-interaction
squizlabs/php_codesniffer
phpcsstandards/phpcsutils
phpcsstandards/phpcsextra
- name: Lint PHP files against parse errors
if: ${{ matrix.dependencies == 'stable' }}
run: composer lint -- --checkstyle | cs2pr
- name: Grab PHPCS version
id: phpcs_version
run: echo "VERSION=$(vendor/bin/phpcs --version | grep --only-matching --max-count=1 --extended-regexp '\b[0-9]+\.[0-9]+')" >> "$GITHUB_OUTPUT"
- name: Run the unit tests without code coverage (PHPCS 3.x)
if: ${{ startsWith( steps.phpcs_version.outputs.VERSION, '3.' ) && (matrix.coverage == false || github.event.repository.fork == true) }}
run: composer run-tests-phpcs3
- name: Run the unit tests without code coverage (PHPCS 4.x)
if: ${{ startsWith( steps.phpcs_version.outputs.VERSION, '4.' ) && (matrix.coverage == false || github.event.repository.fork == true) }}
run: composer run-tests-phpcs4
- name: Run the unit tests with code coverage (PHPCS 3.x)
if: ${{ startsWith( steps.phpcs_version.outputs.VERSION, '3.' ) && matrix.coverage == true && github.event.repository.fork == false }}
run: composer coverage-phpcs3
- name: Run the unit tests with code coverage (PHPCS 4.x)
if: ${{ startsWith( steps.phpcs_version.outputs.VERSION, '4.' ) && matrix.coverage == true && github.event.repository.fork == false }}
run: composer coverage-phpcs4
- name: Send coverage report to Codecov
if: ${{ success() && matrix.coverage == true && github.event.repository.fork == false }}
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
files: ./build/logs/clover.xml
fail_ci_if_error: true
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}