Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .env.testing.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# WP-Browser configuration
# https://wpbrowser.wptestkit.dev/
# Copy to .env.testing and adjust for your environment.
# These defaults match the reusable codecoverage workflow (MySQL service on 33306, MYSQL_DATABASE=tests-wordpress).

WP_ROOT_FOLDER="wordpress"

TEST_DB_HOST="127.0.0.1"
TEST_DB_PORT="33306"
TEST_DB_USER="root"
TEST_DB_PASSWORD="password"

TEST_DB_NAME="tests-wordpress"
TEST_TABLE_PREFIX="wp_"

TEST_SITE_WP_DOMAIN="localhost:8888"
TEST_SITE_ADMIN_EMAIL="admin@example.org"
222 changes: 33 additions & 189 deletions .github/workflows/codecoverage-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,194 +4,38 @@ name: Codecoverage-Main
# GitHub Pages, generates a README badge with the coverage percentage.

on:
push:
branches:
- trunk
pull_request:
types: [ opened, reopened, ready_for_review, synchronize ]
branches:
- trunk
workflow_dispatch:
push:
branches:
- trunk
pull_request:
types: [ opened, reopened, ready_for_review, synchronize ]
branches:
- trunk
workflow_dispatch:

permissions:
contents: read

jobs:

codecoverage:
runs-on: ubuntu-latest

services:
mysql:
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+
env: # These are the same username and password as the wp-env container defaults
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: tests-wordpress
ports: # This mapping matches the .wp-env.json configuration
- 33306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

strategy:
matrix: # Supported PHP versions
php: [ '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ]

steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0 # attempting to get all branch names.

# TODO: a DEPLOY_KEY is needed to enable gh-pages for the first time (the branch can be created and pushed but
# it will not be reachable as a website).
# Consider @see https://github.com/peaceiris/actions-gh-pages
# - name: Check does gh-pages branch need to be created
# run: |
# git branch -l;
# if [[ $(git branch -l gh-pages) == "" ]]; then
# gh_pages_branch_needed=true;
# echo "gh-pages branch is needed";
# else
# gh_pages_branch_needed=false
# echo "gh-pages branch already exists";
# fi
# echo "GH_PAGES_BRANCH_NEEDED=$gh_pages_branch_needed" >> $GITHUB_ENV;
# mkdir gh-pages
#
# - name: Maybe create gh-pages branch
# if: ${{ env.GH_PAGES_BRANCH_NEEDED }}
# uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
# with:
# github_token: ${{ secrets.GITHUB_TOKEN }}
# publish_dir: ./gh-pages
# force_orphan: true
# allow_empty_commit: true
# commit_message: "🤖 Creating gh-pages branch"

- name: Checkout GitHub Pages branch for code coverage report
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: gh-pages
path: gh-pages

- name: Install PHP
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
with:
php-version: ${{ matrix.php }}
coverage: xdebug
tools: composer, jaschilz/php-coverage-badger
extensions: zip

- name: Read .env.testing
uses: c-py/action-dotenv-to-setenv@925b5d99a3f1e4bd7b4e9928be4e2491e29891d9 # v5
with:
env-file: .env.testing

- name: Run composer install
continue-on-error: true
run: composer install -v

- name: Allow writing to wp-content
if: ${{ hashFiles('wp-content') != '' }} # TODO: This may be incorrect since it's a directory.
run: sudo chmod -R a+w wp-content

- name: Print refs
run: |
echo "ref: ${{ github.ref }}"
echo "head_ref: ${{ github.head_ref }}"
echo "base_ref: ${{ github.base_ref }}"

# On trunk, there will be a previous coverage report. On PRs we create a new directory using the commit SHA.
- name: Clear previous code coverage
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/trunk') }}
run: |
rm -rf gh-pages/phpunit || true;
mkdir gh-pages/phpunit || true;

# - name: Run unit tests
# if: ${{ hashFiles('tests/phpunit/bootstrap.php') != '' }} # Only run unit tests if they are present.
# run: XDEBUG_MODE=coverage vendor/bin/phpunit --bootstrap tests/phpunit/bootstrap.php --coverage-php tests/_output/unit.cov --debug

- name: Run wpunit tests
run: XDEBUG_MODE=coverage vendor/bin/codecept run wpunit --coverage tests/_output/wpunit.cov --debug

# For PRs, we'll generate the coverage report on each pushed commit
- name: Merge code coverage for PR
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
run: |
vendor/bin/phpcov merge --clover clover.xml tests/_output/;
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/;

# On main, we want it output to a different path
- name: Merge code coverage for main
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/trunk') }}
run: |
vendor/bin/phpcov merge --clover clover.xml tests/_output/;
vendor/bin/phpcov merge --clover gh-pages/phpunit/clover.xml --php gh-pages/phpunit/phpunit.cov --html gh-pages/phpunit/html/ tests/_output/;

# This makes the coverage percentage available in `{{ steps.coverage-percentage.outputs.coverage-rounded }}`.
- name: Check test coverage
if: ${{ matrix.php == '7.3' }}
uses: johanvanhelden/gha-clover-test-coverage-check@2543c79a701f179bd63aa14c16c6938c509b2cec # v1
id: coverage-percentage
with:
percentage: 25
exit: false
filename: clover.xml
rounded-precision: "0"

# See: https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/
- name: Add `.nojekyll` file so code coverage report successfully deploys to gh-pages
if: ${{ (matrix.php == '7.3') }}
working-directory: gh-pages
run: |
touch .nojekyll
git add -- .nojekyll *

- name: Update README coverage badge
if: ${{ (matrix.php == '7.3') && (github.ref == 'refs/heads/trunk') }} # only commit on trunk, on the PHP version we're using in production.
run: php-coverage-badger clover.xml gh-pages/phpunit/coverage.svg

- name: Generate PR coverage badge
if: ${{ (matrix.php == '7.3') && github.event_name == 'pull_request' }}
run: php-coverage-badger clover.xml gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/coverage.svg

- name: Commit code coverage to gh-pages
if: ${{ matrix.php == '7.3' }}
uses: stefanzweifel/git-auto-commit-action@28e16e81777b558cc906c8750092100bbb34c5e3 # v7.0.0
with:
repository: gh-pages
branch: gh-pages
commit_message: ${{ format('🤖 Save code coverage report to gh-pages {0}%', steps.coverage-percentage.outputs.coverage-rounded) }}
commit_options: ""
env:
GITHUB_TOKEN: "${{ github.token }}"

- name: Add coverage badge to PR comment
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
run: |
echo "[![Code Coverage ](https://newfold-labs.github.io/wp-module-onboarding/${{ github.event.pull_request.head.sha }}/phpunit/coverage.svg)](https://newfold-labs.github.io/wp-module-onboarding/${{ github.event.pull_request.head.sha }}/phpunit/html/)" >> coverage-comment.md
echo "" >> coverage-comment.md
echo "" >> coverage-comment.md

- name: Add coverage report link to PR comment
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
run: |
echo "${{ format('[project coverage report {0}%](https://newfold-labs.github.io/wp-module-onboarding/{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
echo "" >> coverage-comment.md
echo "" >> coverage-comment.md

- name: Add phpcov uncovered lines report to PR comment
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
continue-on-error: true # phpcov can fail if there are no uncovered lines
run: |
BRANCHED_COMMIT=$(git rev-list origin..HEAD | tail -n 1);
echo "BRANCHED_COMMIT=$BRANCHED_COMMIT"
git diff $BRANCHED_COMMIT...${{ github.event.pull_request.head.sha }} > branch.diff;
cat branch.diff;
OUTPUT=${vendor/bin/phpcov patch-coverage --path-prefix $(pwd) ./gh-pages/${{ github.event.pull_request.head.sha }}/phpunit/phpunit.cov branch.diff || true}
echo $OUTPUT;
echo "$OUTPUT" >> coverage-comment.md

- name: Add coverage PR comment
uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2.8.2
if: ${{ matrix.php == '7.3' && github.event_name == 'pull_request' }}
with:
message-id: coverage-report
message-path: coverage-comment.md
get-repo-name:
runs-on: ubuntu-latest
outputs:
repository-name: ${{ steps.repo-name.outputs.name }}
steps:
- name: Extract repository name
id: repo-name
run: echo "name=$(echo ${{ github.repository }} | cut -d'/' -f2)" >> $GITHUB_OUTPUT

codecoverage:
needs: get-repo-name
permissions:
contents: write
pull-requests: write
uses: newfold-labs/workflows/.github/workflows/reusable-codecoverage.yml@main
with:
php-versions: '["7.4", "8.0", "8.1", "8.2", "8.3", "8.4"]'
coverage-php-version: '7.4'
repository-name: ${{ needs.get-repo-name.outputs.repository-name }}
minimum-coverage: 25
secrets:
repo_token: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.DS_Store
.vscode
.env
.env.testing
/node_modules
/tests/_output
/tests/_support/_generated
Expand Down
9 changes: 6 additions & 3 deletions codeception.dist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ params:
coverage:
enabled: true
include:
- /includes/*
# - /upgrades/*
bootstrap: bootstrap.php
- includes/*
exclude:
- tests/*
- vendor/*
- build/*
- src/*
1 change: 0 additions & 1 deletion phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
>
<php>
<ini name="display_errors" value="true"/>
<env name="WP_PHPUNIT__TESTS_CONFIG" value="tests/phpunit/wp-tests-config.php" />
</php>
<testsuites>
<testsuite name="Application Test Suite">
Expand Down
Empty file added tests/_data/.gitkeep
Empty file.
101 changes: 101 additions & 0 deletions tests/phpunit/ColorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?php

namespace NewfoldLabs\WP\Module\Onboarding;

use NewfoldLabs\WP\Module\Onboarding\Types\Color;
use PHPUnit\Framework\TestCase;

/**
* PHPUnit tests for Types\Color (no WordPress required).
*
* @coversDefaultClass \NewfoldLabs\WP\Module\Onboarding\Types\Color
*/
class ColorTest extends TestCase {

/**
* Color constructor and getters work.
*
* @return void
*/
public function test_constructor_and_getters() {
$color = new Color( 'Accent 1', 'accent_1', '#F27121' );
$this->assertSame( 'Accent 1', $color->get_name() );
$this->assertSame( 'accent_1', $color->get_slug() );
$this->assertSame( '#F27121', $color->get_color() );
}

/**
* To_array returns expected keys.
*
* @return void
*/
public function test_to_array() {
$color = new Color( 'Accent 1', 'accent_1', '#F27121' );
$arr = $color->to_array();
$this->assertSame(
array(
'name' => 'Accent 1',
'slug' => 'accent_1',
'color' => '#F27121',
),
$arr
);
}

/**
* From_array creates equivalent Color.
*
* @return void
*/
public function test_from_array() {
$data = array(
'name' => 'Accent 1',
'slug' => 'accent_1',
'color' => '#F27121',
);
$color = Color::from_array( $data );
$this->assertInstanceOf( Color::class, $color );
$this->assertSame( 'Accent 1', $color->get_name() );
$this->assertSame( 'accent_1', $color->get_slug() );
$this->assertSame( '#F27121', $color->get_color() );
}

/**
* From_array throws when keys are missing.
*
* @return void
*/
public function test_from_array_throws_when_keys_missing() {
$this->expectException( \InvalidArgumentException::class );
$this->expectExceptionMessage( 'Array must contain name, slug, and color keys' );
Color::from_array(
array(
'slug' => 'accent_1',
'color' => '#F27121',
)
);
}

/**
* Constructor trims whitespace.
*
* @return void
*/
public function test_trims_whitespace() {
$color = new Color( ' Accent 1 ', ' accent_1 ', ' #F27121 ' );
$this->assertSame( 'Accent 1', $color->get_name() );
$this->assertSame( 'accent_1', $color->get_slug() );
$this->assertSame( '#F27121', $color->get_color() );
}

/**
* Constructor throws when name is empty.
*
* @return void
*/
public function test_throws_when_name_empty() {
$this->expectException( \InvalidArgumentException::class );
$this->expectExceptionMessage( 'Name cannot be empty' );
new Color( ' ', 'accent_1', '#F27121' );
}
}
15 changes: 0 additions & 15 deletions tests/phpunit/ExampleTest.php

This file was deleted.

Loading