Skip to content

Commit 0769d6c

Browse files
authored
Merge pull request #208 from newfold-labs/PRESS10-97
PHPUnit Test Scaffolding
2 parents 9b9719d + 1546301 commit 0769d6c

16 files changed

+6066
-2238
lines changed

.env.testing

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# WP-Browser configuration
2+
# https://wpbrowser.wptestkit.dev/
3+
4+
# The location Composer installed johnpbloch/wordpress to
5+
WP_ROOT_FOLDER="wordpress"
6+
7+
TEST_DB_HOST="127.0.0.1"
8+
# This must match the .wp-env.json config
9+
TEST_DB_PORT="33306"
10+
TEST_DB_USER="root"
11+
TEST_DB_PASSWORD="password"
12+
13+
TEST_DB_NAME="wp-browser-tests"
14+
TEST_TABLE_PREFIX="wp_"
15+
16+
TEST_SITE_WP_DOMAIN="localhost:8888"
17+
TEST_SITE_ADMIN_EMAIL="[email protected]"

.gitattributes

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/.env.testing export-ignore
2+
/.wp-env.json export-ignore
3+
/codeception.dist.yml export-ignore
4+
/package-lock.json export-ignore
5+
/package.json export-ignore
6+
/tests export-ignore
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
name: Codecoverage-Main
2+
3+
# Runs PHPUnit unit and Codeception wp-browser wpunit tests, merges the code coverage, commits the html report to
4+
# GitHub Pages, generates a README badge with the coverage percentage.
5+
6+
on:
7+
push:
8+
branches:
9+
- main
10+
pull_request:
11+
types: [ opened, reopened, ready_for_review, synchronize ]
12+
branches:
13+
- main
14+
workflow_dispatch:
15+
16+
jobs:
17+
18+
codecoverage:
19+
runs-on: ubuntu-latest
20+
21+
services:
22+
mysql:
23+
image: mysql:5.7 # Password auth did not work on 8.0 on PHP 7.3, it did seem to work for PHP 7.4+
24+
env: # These are the same username and password as the wp-env container defaults
25+
MYSQL_ROOT_PASSWORD: password
26+
MYSQL_DATABASE: tests-wordpress
27+
ports: # This mapping matches the .wp-env.json configuration
28+
- 33306:3306
29+
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
30+
31+
strategy:
32+
matrix: # Supported PHP versions
33+
php: [ '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ]
34+
35+
steps:
36+
- name: Checkout
37+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
38+
with:
39+
fetch-depth: 0 # attempting to get all branch names.
40+
41+
# TODO: a DEPLOY_KEY is needed to enable gh-pages for the first time (the branch can be created and pushed but
42+
# it will not be reachable as a website).
43+
# Consider @see https://github.com/peaceiris/actions-gh-pages
44+
# - name: Check does gh-pages branch need to be created
45+
# run: |
46+
# git branch -l;
47+
# if [[ $(git branch -l gh-pages) == "" ]]; then
48+
# gh_pages_branch_needed=true;
49+
# echo "gh-pages branch is needed";
50+
# else
51+
# gh_pages_branch_needed=false
52+
# echo "gh-pages branch already exists";
53+
# fi
54+
# echo "GH_PAGES_BRANCH_NEEDED=$gh_pages_branch_needed" >> $GITHUB_ENV;
55+
# mkdir gh-pages
56+
#
57+
# - name: Maybe create gh-pages branch
58+
# if: ${{ env.GH_PAGES_BRANCH_NEEDED }}
59+
# uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
60+
# with:
61+
# github_token: ${{ secrets.GITHUB_TOKEN }}
62+
# publish_dir: ./gh-pages
63+
# force_orphan: true
64+
# allow_empty_commit: true
65+
# commit_message: "🤖 Creating gh-pages branch"
66+
67+
- name: Checkout GitHub Pages branch for code coverage report
68+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
69+
with:
70+
ref: gh-pages
71+
path: gh-pages
72+
73+
- name: Install PHP
74+
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
75+
with:
76+
php-version: ${{ matrix.php }}
77+
coverage: xdebug
78+
tools: composer, jaschilz/php-coverage-badger
79+
extensions: zip
80+
81+
- name: Read .env.testing
82+
uses: c-py/action-dotenv-to-setenv@925b5d99a3f1e4bd7b4e9928be4e2491e29891d9 # v5
83+
with:
84+
env-file: .env.testing
85+
86+
- name: Run composer install
87+
continue-on-error: true
88+
run: composer install -v
89+
90+
- name: Allow writing to wp-content
91+
if: ${{ hashFiles('wp-content') != '' }} # TODO: This may be incorrect since it's a directory.
92+
run: sudo chmod -R a+w wp-content
93+
94+
# On main, there will be a previous coverage report. On PRs we create a new directory using the commit SHA.
95+
- name: Clear previous code coverage
96+
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/main') }}
97+
run: |
98+
rm -rf gh-pages/phpunit || true;
99+
mkdir gh-pages/phpunit || true;
100+
101+
- name: Run unit tests
102+
if: ${{ hashFiles('tests/phpunit/bootstrap.php') != '' }} # Only run unit tests if they are present.
103+
run: XDEBUG_MODE=coverage vendor/bin/phpunit --bootstrap tests/phpunit/bootstrap.php --coverage-php tests/_output/unit.cov --debug
104+
105+
- name: Run wpunit tests
106+
run: XDEBUG_MODE=coverage vendor/bin/codecept run wpunit --coverage tests/_output/wpunit.cov --debug
107+
108+
# For PRs, we'll generate the coverage report on each pushed commit
109+
- name: Merge code coverage for PR
110+
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
111+
run: |
112+
vendor/bin/phpcov merge --clover clover.xml tests/_output/;
113+
vendor/bin/phpcov merge --clover gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/clover.xml --php gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/phpunit.cov --html gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/html/ tests/_output/;
114+
115+
# On main, we want it output to a different path
116+
- name: Merge code coverage for main
117+
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/main') }}
118+
run: |
119+
vendor/bin/phpcov merge --clover clover.xml tests/_output/;
120+
vendor/bin/phpcov merge --clover gh-pages/phpunit/clover.xml --php gh-pages/phpunit/phpunit.cov --html gh-pages/phpunit/html/ tests/_output/;
121+
122+
# This makes the coverage percentage available in `{{ steps.coverage-percentage.outputs.coverage-rounded }}`.
123+
- name: Check test coverage
124+
if: ${{ matrix.php == '7.3' }}
125+
uses: johanvanhelden/gha-clover-test-coverage-check@2543c79a701f179bd63aa14c16c6938c509b2cec # v1
126+
id: coverage-percentage
127+
with:
128+
percentage: 25
129+
exit: false
130+
filename: clover.xml
131+
rounded-precision: "0"
132+
133+
# See: https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/
134+
- name: Add `.nojekyll` file so code coverage report successfully deploys to gh-pages
135+
if: ${{ (matrix.php == '7.3') }}
136+
working-directory: gh-pages
137+
run: |
138+
touch .nojekyll
139+
git add -- .nojekyll *
140+
141+
- name: Update README coverage badge
142+
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/main') }} # only commit on main, on the PHP version we're using in production.
143+
run: php-coverage-badger clover.xml gh-pages/phpunit/coverage.svg
144+
145+
- name: Generate PR coverage badge
146+
if: ${{ (matrix.php == '7.3') && github.event_name == 'pull_request' }}
147+
run: php-coverage-badger clover.xml gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/coverage.svg
148+
149+
- name: Commit code coverage to gh-pages
150+
if: ${{ matrix.php == '7.3' }}
151+
uses: stefanzweifel/git-auto-commit-action@e348103e9026cc0eee72ae06630dbe30c8bf7a79 # v5.1.0
152+
with:
153+
repository: gh-pages
154+
branch: gh-pages
155+
commit_message: ${{ format('🤖 Save code coverage report to gh-pages {0}%', steps.coverage-percentage.outputs.coverage-rounded) }}
156+
commit_options: ""
157+
env:
158+
GITHUB_TOKEN: "${{ github.token }}"
159+
160+
- name: Add coverage badge to PR comment
161+
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
162+
run: |
163+
echo "[![Code Coverage ](https://newfold-labs.github.io/wp-module-performance/${{ github.event.pull_request.head.sha }}/phpunit/coverage.svg)](https://newfold-labs.github.io/wp-module-performance/${{ github.event.pull_request.head.sha }}/phpunit/html/)" >> coverage-comment.md
164+
echo "" >> coverage-comment.md
165+
echo "" >> coverage-comment.md
166+
167+
- name: Add coverage report link to PR comment
168+
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
169+
run: |
170+
echo "${{ format('[project coverage report {0}%](https://newfold-labs.github.io/wp-module-performance/{1}/phpunit/html/) @ {2}', steps.coverage-percentage.outputs.coverage-rounded, github.event.pull_request.head.sha, github.event.pull_request.head.sha) }}" >> coverage-comment.md
171+
echo "" >> coverage-comment.md
172+
echo "" >> coverage-comment.md
173+
174+
- name: Add phpcov uncovered lines report to PR comment
175+
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
176+
continue-on-error: true # phpcov can fail if there are no uncovered lines
177+
run: |
178+
BRANCHED_COMMIT=$(git rev-list origin..HEAD | tail -n 1);
179+
echo "BRANCHED_COMMIT=$BRANCHED_COMMIT"
180+
git diff $BRANCHED_COMMIT...${{ github.event.pull_request.head.sha }} > branch.diff;
181+
cat branch.diff;
182+
OUTPUT=${vendor/bin/phpcov patch-coverage --path-prefix $(pwd) ./gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/phpunit.cov branch.diff || true}
183+
echo $OUTPUT;
184+
echo "$OUTPUT" >> coverage-comment.md
185+
186+
- name: Add coverage PR comment
187+
uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
188+
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
189+
with:
190+
message-id: coverage-report
191+
message-path: coverage-comment.md

.gitignore

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
node_modules
2-
vendor
31
.DS_Store
42
.vscode
3+
/node_modules
4+
/tests/_output
5+
/tests/_support/_generated
6+
/wordpress
7+
/wp-content
8+
node_modules
9+
vendor

.wp-env.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"env": {
3+
"tests": {
4+
"mysqlPort": 33306
5+
}
6+
},
7+
"core": "https://wordpress.org/wordpress-6.1.7.zip"
8+
}

codeception.dist.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
paths:
2+
tests: tests
3+
output: tests/_output
4+
data: tests/_data
5+
support: tests/_support
6+
envs: tests/_envs
7+
actor_suffix: Tester
8+
extensions:
9+
enabled:
10+
- Codeception\Extension\RunFailed
11+
commands:
12+
- Codeception\Command\GenerateWPUnit
13+
params:
14+
- .env.testing
15+
coverage:
16+
enabled: true
17+
include:
18+
- /includes/*
19+
# - /upgrades/*
20+
bootstrap: bootstrap.php

0 commit comments

Comments
 (0)