Skip to content

Commit 1f32760

Browse files
authored
Merge pull request #438 from newfold-labs/update/reusable-workflows-codecoverage-playwright
Use reusable codecoverage workflow
2 parents 7e8ca57 + fd75daa commit 1f32760

File tree

11 files changed

+197
-188
lines changed

11 files changed

+197
-188
lines changed

.env.testing.example

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+
# Copy to .env.testing and adjust for your environment.
4+
# These defaults match the reusable codecoverage workflow (MySQL service on 33306, MYSQL_DATABASE=tests-wordpress).
5+
6+
WP_ROOT_FOLDER="wordpress"
7+
8+
TEST_DB_HOST="127.0.0.1"
9+
TEST_DB_PORT="33306"
10+
TEST_DB_USER="root"
11+
TEST_DB_PASSWORD="password"
12+
13+
TEST_DB_NAME="tests-wordpress"
14+
TEST_TABLE_PREFIX="wp_"
15+
16+
TEST_SITE_WP_DOMAIN="localhost:8888"
17+
TEST_SITE_ADMIN_EMAIL="admin@example.org"

.github/workflows/codecoverage-main.yml

Lines changed: 22 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -13,179 +13,29 @@ on:
1313
- main
1414
workflow_dispatch:
1515

16-
jobs:
16+
permissions:
17+
contents: read
1718

18-
codecoverage:
19+
jobs:
20+
get-repo-name:
1921
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-
22+
outputs:
23+
repository-name: ${{ steps.repo-name.outputs.name }}
3524
steps:
36-
- name: Checkout
37-
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
69-
with:
70-
ref: gh-pages
71-
path: gh-pages
72-
73-
- name: Install PHP
74-
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.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;
25+
- name: Extract repository name
26+
id: repo-name
27+
run: echo "name=$(echo ${{ github.repository }} | cut -d'/' -f2)" >> $GITHUB_OUTPUT
10028

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@04702edda442b2e678b25b537cec683a1493fcb9 # v7.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
29+
codecoverage:
30+
needs: get-repo-name
31+
permissions:
32+
contents: write
33+
pull-requests: write
34+
uses: newfold-labs/workflows/.github/workflows/reusable-codecoverage.yml@main
35+
with:
36+
php-versions: '["7.4", "8.0", "8.1", "8.2", "8.3", "8.4"]'
37+
coverage-php-version: '7.4'
38+
repository-name: ${{ needs.get-repo-name.outputs.repository-name }}
39+
minimum-coverage: 25
40+
secrets:
41+
repo_token: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.DS_Store
2+
.env.testing
23
.vscode
34
/node_modules
45
/tests/_output

codeception.dist.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ params:
1515
coverage:
1616
enabled: true
1717
include:
18-
- /includes/*
19-
# - /upgrades/*
20-
bootstrap: bootstrap.php
18+
- includes/*
19+
exclude:
20+
- tests/*
21+
- vendor/*
22+
- build/*
23+
- src/*
24+
- languages/*

tests/_data/.gitkeep

Whitespace-only changes.

tests/wpunit.suite.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ modules:
1616

1717
domain: "%TEST_SITE_WP_DOMAIN%"
1818
adminEmail: "%TEST_SITE_ADMIN_EMAIL%"
19-
title: "wp-module-data"
19+
adminEmailFallback: "admin@example.org"
20+
title: "wp-module-performance"
2021
plugins: []
2122
activatePlugins: []
2223

tests/wpunit/ExampleWPUnitTest.php

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace NewfoldLabs\WP\Module\Performance;
4+
5+
use NewfoldLabs\WP\Module\Performance\RestApi\RestApi;
6+
use NewfoldLabs\WP\Module\Performance\Data\Constants;
7+
8+
/**
9+
* Module loading wpunit tests.
10+
*
11+
* @coversDefaultClass \NewfoldLabs\WP\Module\Performance\Performance
12+
*/
13+
class ModuleLoadingWPUnitTest extends \lucatume\WPBrowser\TestCase\WPTestCase {
14+
15+
/**
16+
* Verify core module classes exist.
17+
*
18+
* RestApi\CacheController is not asserted here because it can fail to load in CI
19+
* when its dependencies (e.g. CacheManager, container) are not fully available.
20+
*
21+
* @return void
22+
*/
23+
public function test_module_classes_load() {
24+
$this->assertTrue( class_exists( Performance::class ), 'Performance class should exist' );
25+
$this->assertTrue( class_exists( PerformanceFeature::class ), 'PerformanceFeature class should exist' );
26+
$this->assertTrue( class_exists( Permissions::class ), 'Permissions class should exist' );
27+
$this->assertTrue( class_exists( RestApi::class ), 'RestApi class should exist' );
28+
$this->assertTrue( class_exists( Constants::class ), 'Data\Constants class should exist' );
29+
$this->assertTrue( class_exists( Cache\Cache::class ), 'Cache\Cache class should exist' );
30+
}
31+
32+
/**
33+
* Verify WordPress factory is available.
34+
*
35+
* @return void
36+
*/
37+
public function test_wordpress_factory_available() {
38+
$this->assertTrue( function_exists( 'get_option' ) );
39+
$this->assertNotEmpty( get_option( 'blogname' ) );
40+
}
41+
42+
/**
43+
* Performance constants are defined.
44+
*
45+
* @return void
46+
*/
47+
public function test_performance_constants() {
48+
$this->assertSame( 'nfd_purge_all', Performance::PURGE_ALL );
49+
$this->assertSame( 'nfd_purge_url', Performance::PURGE_URL );
50+
$this->assertSame( 'nfd-performance', Performance::PAGE_SLUG );
51+
}
52+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace NewfoldLabs\WP\Module\Performance;
4+
5+
/**
6+
* Permissions wpunit tests.
7+
*
8+
* @coversDefaultClass \NewfoldLabs\WP\Module\Performance\Permissions
9+
*/
10+
class PermissionsWPUnitTest extends \lucatume\WPBrowser\TestCase\WPTestCase {
11+
12+
/**
13+
* Permission constants are defined.
14+
*
15+
* @return void
16+
*/
17+
public function test_permission_constants() {
18+
$this->assertSame( 'manage_options', Permissions::ADMIN );
19+
$this->assertSame( 'upload_files', Permissions::UPLOAD_FILES );
20+
$this->assertSame( 'edit_posts', Permissions::EDIT_POSTS );
21+
$this->assertSame( 'manage_media_library', Permissions::MANAGE_MEDIA_LIBRARY );
22+
}
23+
24+
/**
25+
* Rest_is_authorized_admin returns false when not logged in.
26+
*
27+
* @return void
28+
*/
29+
public function test_rest_is_authorized_admin_when_logged_out() {
30+
wp_set_current_user( 0 );
31+
$this->assertFalse( Permissions::rest_is_authorized_admin() );
32+
}
33+
34+
/**
35+
* Rest_is_authorized_admin returns true for administrator.
36+
*
37+
* @return void
38+
*/
39+
public function test_rest_is_authorized_admin_when_administrator() {
40+
$user_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
41+
wp_set_current_user( $user_id );
42+
$this->assertTrue( Permissions::rest_is_authorized_admin() );
43+
}
44+
45+
/**
46+
* Rest_can_upload_media returns true for administrator.
47+
*
48+
* @return void
49+
*/
50+
public function test_rest_can_upload_media_for_administrator() {
51+
$user_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
52+
wp_set_current_user( $user_id );
53+
$this->assertTrue( Permissions::rest_can_upload_media() );
54+
}
55+
}

0 commit comments

Comments
 (0)