diff --git a/.github/workflows/php-test-coverage.yml b/.github/workflows/php-test-coverage.yml
new file mode 100644
index 0000000..e7f8488
--- /dev/null
+++ b/.github/workflows/php-test-coverage.yml
@@ -0,0 +1,98 @@
+name: PHP Unit Test Coverage
+
+on:
+ push:
+ branches:
+ - main
+ # Only run if PHP-related files changed.
+ paths:
+ - '.github/workflows/php-test-coverage.yml'
+ - '**.php'
+ - '.wp-env.json'
+ - '**/package.json'
+ - 'package-lock.json'
+ - 'phpunit.xml.dist'
+ - 'tests/phpunit/multisite.xml'
+ - 'composer.json'
+ - 'composer.lock'
+ pull_request:
+ branches:
+ - main
+ # Only run if PHP-related files changed.
+ paths:
+ - '.github/workflows/php-test-coverage.yml'
+ - '**.php'
+ - '.wp-env.json'
+ - '**/package.json'
+ - 'package-lock.json'
+ - 'phpunit.xml.dist'
+ - 'tests/phpunit/multisite.xml'
+ - 'composer.json'
+ - 'composer.lock'
+ types:
+ - opened
+ - reopened
+ - synchronize
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
+
+jobs:
+ php-test-coverage:
+ name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} report (${{ matrix.format }})
+ runs-on: ubuntu-latest
+ timeout-minutes: 20
+ strategy:
+ fail-fast: true
+ matrix:
+ multisite: [ false, true ]
+ format: [ 'clover', 'html' ]
+ php: [ '8.2' ]
+ wordpress: [ 'latest' ]
+ env:
+ WP_ENV_PHP_VERSION: ${{ matrix.php }}
+ WP_ENV_CORE: ${{ matrix.wordpress == 'trunk' && 'WordPress/WordPress' || format( 'https://wordpress.org/wordpress-{0}.zip', matrix.wordpress ) }}
+ continue-on-error: ${{ matrix.experimental == true }}
+ steps:
+ - uses: styfle/cancel-workflow-action@0.12.1
+
+ - uses: actions/checkout@v4
+
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Setup Node.js (.nvmrc)
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: npm
+
+ - name: npm install
+ run: npm ci
+
+ - name: Install WordPress
+ run: npm run wp-env start -- --xdebug=coverage
+
+ - name: Running ${{ matrix.multisite && 'multisite' || 'single site' }} unit tests
+ run: npm run test-php${{ matrix.multisite && '-multisite' || '' }} -- --coverage-${{ 'html' == matrix.format && 'html' || 'clover' }} wp-code-coverage-single-${{ github.sha }}${{ 'clover' == matrix.format && '.xml' || '' }}
+
+ - name: Upload ${{ matrix.multisite && 'multisite' || 'single site' }} report to Codecov
+ if: ${{ matrix.format == 'clover' && github.event_name != 'pull_request' }}
+ uses: codecov/codecov-action@v4
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ file: wp-code-coverage-${{ matrix.multisite && 'multisite' || 'single' }}-${{ github.sha }}.xml
+ flags: ${{ matrix.multisite && 'multisite' || 'single' }},php
+ fail_ci_if_error: true
+
+ - name: Upload ${{ matrix.multisite && 'multisite' || 'single site' }} HTML report as artifact
+ if: ${{ matrix.format == 'html' }}
+ uses: actions/upload-artifact@v4
+ with:
+ name: wp-code-coverage-${{ matrix.multisite && 'multisite' || 'single' }}-${{ github.sha }}
+ path: wp-code-coverage-${{ matrix.multisite && 'multisite' || 'single' }}-${{ github.sha }}
+ overwrite: true
\ No newline at end of file
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index d31ca8e..cfa5b12 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -19,4 +19,11 @@
ms-required
+
+
+ capabilities.php
+ db.php
+ ui.php
+
+
diff --git a/tests/phpunit/multisite.xml b/tests/phpunit/multisite.xml
index eb031cb..f546292 100644
--- a/tests/phpunit/multisite.xml
+++ b/tests/phpunit/multisite.xml
@@ -20,4 +20,11 @@
ms-excluded
+
+
+ ../../capabilities.php
+ ../../db.php
+ ../../ui.php
+
+