Add PHPUnit testing framework and error checking documentation
This commit is contained in:
61
.github/workflows/phpunit.yml
vendored
Normal file
61
.github/workflows/phpunit.yml
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
name: PHPUnit Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: PHP ${{ matrix.php }} - WP ${{ matrix.wp }} - ${{ matrix.multisite && 'Multisite' || 'Single Site' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
php: [ '7.4', '8.0' ]
|
||||||
|
wp: [ 'latest' ]
|
||||||
|
multisite: [ false, true ]
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:5.7
|
||||||
|
env:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: wordpress_test
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||||
|
|
||||||
|
- name: Setup PHP
|
||||||
|
uses: shivammathur/setup-php@e6f75134d35752277f093989e72e140eaa222f35 # v2.30.0
|
||||||
|
with:
|
||||||
|
php-version: ${{ matrix.php }}
|
||||||
|
extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, bcmath, soap, intl, gd, exif, iconv
|
||||||
|
coverage: none
|
||||||
|
|
||||||
|
- name: Install Composer dependencies
|
||||||
|
uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # v2.2.0
|
||||||
|
|
||||||
|
- name: Install WordPress test suite
|
||||||
|
run: |
|
||||||
|
bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 ${{ matrix.wp }} ${{ matrix.multisite && 'true' || 'false' }}
|
||||||
|
|
||||||
|
- name: Run PHPUnit tests
|
||||||
|
run: |
|
||||||
|
if [ "${{ matrix.multisite }}" = "true" ]; then
|
||||||
|
WP_MULTISITE=1 composer test
|
||||||
|
else
|
||||||
|
composer test
|
||||||
|
fi
|
||||||
126
.wiki/Error-Checking-Feedback-Loops.md
Normal file
126
.wiki/Error-Checking-Feedback-Loops.md
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# Error Checking and Feedback Loops
|
||||||
|
|
||||||
|
This document explains how to check for code quality issues and get feedback from automated tools in our development workflow.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
* [Overview](#overview)
|
||||||
|
* [Local Error Checking](#local-error-checking)
|
||||||
|
* [CI/CD Feedback Loops](#cicd-feedback-loops)
|
||||||
|
* [Common Issues and Solutions](#common-issues-and-solutions)
|
||||||
|
* [Improving Code Quality](#improving-code-quality)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Our development process includes multiple layers of error checking and feedback loops to ensure high code quality:
|
||||||
|
|
||||||
|
1. **Local Development**: Run linters and tests locally before committing
|
||||||
|
2. **Pull Request**: Automated checks run when you create or update a PR
|
||||||
|
3. **Code Review**: Human reviewers provide feedback on your code
|
||||||
|
4. **Continuous Integration**: Tests run in various environments to ensure compatibility
|
||||||
|
|
||||||
|
## Local Error Checking
|
||||||
|
|
||||||
|
### PHP Code Quality Checks
|
||||||
|
|
||||||
|
Run these commands locally to check for PHP code quality issues:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run all PHP code quality checks
|
||||||
|
npm run lint:php
|
||||||
|
|
||||||
|
# Run specific checks
|
||||||
|
npm run lint:phpcs # PHP CodeSniffer
|
||||||
|
npm run lint:phpstan # PHPStan static analysis
|
||||||
|
npm run lint:phpmd # PHP Mess Detector
|
||||||
|
```
|
||||||
|
|
||||||
|
### JavaScript/CSS Checks
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run ESLint for JavaScript files
|
||||||
|
npm run lint:js
|
||||||
|
|
||||||
|
# Run stylelint for CSS files
|
||||||
|
npm run lint:css
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running Tests Locally
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run Cypress tests for single site
|
||||||
|
npm run test:playground:single
|
||||||
|
|
||||||
|
# Run Cypress tests for multisite
|
||||||
|
npm run test:playground:multisite
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD Feedback Loops
|
||||||
|
|
||||||
|
When you push code or create a pull request, several automated checks run:
|
||||||
|
|
||||||
|
### GitHub Actions Workflows
|
||||||
|
|
||||||
|
* **Code Quality**: Runs PHP CodeSniffer, PHPStan, and PHP Mess Detector
|
||||||
|
* **WordPress Tests**: Runs tests in WordPress environments
|
||||||
|
* **WordPress Playground Tests**: Runs tests in WordPress Playground environments
|
||||||
|
* **Tests - Run PHP compatibility and unit tests**: Checks compatibility with different PHP versions
|
||||||
|
|
||||||
|
### Third-Party Code Quality Services
|
||||||
|
|
||||||
|
* **CodeFactor**: Provides automated code reviews and quality grades
|
||||||
|
* **Codacy**: Analyzes code quality and security issues
|
||||||
|
* **SonarCloud**: Detects bugs, vulnerabilities, and code smells
|
||||||
|
|
||||||
|
## Common Issues and Solutions
|
||||||
|
|
||||||
|
### PHP CodeSniffer Issues
|
||||||
|
|
||||||
|
* **Indentation**: Use tabs for indentation in PHP files
|
||||||
|
* **Spacing**: Add spaces after commas, around operators, and after control structures
|
||||||
|
* **Naming Conventions**: Use snake_case for functions and variables in PHP
|
||||||
|
* **DocBlocks**: Add proper documentation for functions and classes
|
||||||
|
|
||||||
|
### PHPStan Issues
|
||||||
|
|
||||||
|
* **Undefined Variables**: Ensure all variables are defined before use
|
||||||
|
* **Type Errors**: Use proper type hints and return types
|
||||||
|
* **Null Checks**: Add null checks for variables that might be null
|
||||||
|
|
||||||
|
### JavaScript/CSS Issues
|
||||||
|
|
||||||
|
* **ESLint Errors**: Follow JavaScript best practices
|
||||||
|
* **Stylelint Errors**: Follow CSS best practices
|
||||||
|
* **Accessibility Issues**: Ensure UI elements are accessible
|
||||||
|
|
||||||
|
## Improving Code Quality
|
||||||
|
|
||||||
|
### Best Practices
|
||||||
|
|
||||||
|
* **Write Tests First**: Use test-driven development (TDD) when possible
|
||||||
|
* **Small PRs**: Keep pull requests small and focused on a single issue
|
||||||
|
* **Regular Commits**: Commit frequently with clear messages
|
||||||
|
* **Code Reviews**: Request code reviews from team members
|
||||||
|
* **Documentation**: Keep documentation up-to-date
|
||||||
|
|
||||||
|
### Using AI Assistants
|
||||||
|
|
||||||
|
AI assistants can help you understand and fix code quality issues:
|
||||||
|
|
||||||
|
1. Copy the error message or feedback
|
||||||
|
2. Paste it into your AI assistant chat
|
||||||
|
3. Ask for help understanding and fixing the issue
|
||||||
|
4. Apply the suggested fixes
|
||||||
|
5. Run the checks again to verify the issue is resolved
|
||||||
|
|
||||||
|
### Continuous Learning
|
||||||
|
|
||||||
|
* Review the code quality reports regularly
|
||||||
|
* Learn from feedback and improve your coding practices
|
||||||
|
* Stay updated on best practices for WordPress development
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
* [Testing Framework](Testing.md)
|
||||||
|
* [Code Review Guide](../.ai-workflows/code-review.md)
|
||||||
|
* [Architecture Overview](Architecture-Overview.md)
|
||||||
@@ -12,6 +12,7 @@ This document explains how to use the testing framework for our plugin.
|
|||||||
* [Writing Tests](#writing-tests)
|
* [Writing Tests](#writing-tests)
|
||||||
* [CI/CD Integration](#cicd-integration)
|
* [CI/CD Integration](#cicd-integration)
|
||||||
* [Troubleshooting](#troubleshooting)
|
* [Troubleshooting](#troubleshooting)
|
||||||
|
* [PHPUnit Tests](#phpunit-tests)
|
||||||
* [Future Improvements](#future-improvements)
|
* [Future Improvements](#future-improvements)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
@@ -200,15 +201,56 @@ We have GitHub Actions workflows for running tests in CI/CD:
|
|||||||
1. **Docker not running**: Make sure Docker is running before starting wp-env
|
1. **Docker not running**: Make sure Docker is running before starting wp-env
|
||||||
2. **Port conflicts**: If ports 8888 or 8889 are in use, wp-env will fail to start
|
2. **Port conflicts**: If ports 8888 or 8889 are in use, wp-env will fail to start
|
||||||
3. **wp-env not installed**: Run `npm install -g @wordpress/env` to install wp-env globally
|
3. **wp-env not installed**: Run `npm install -g @wordpress/env` to install wp-env globally
|
||||||
|
4. **WordPress Playground not loading**: Check your network connection and try refreshing the page
|
||||||
|
5. **Tests failing**: Check the error messages in the console and fix the issues
|
||||||
|
|
||||||
|
### Error Checking and Feedback Loops
|
||||||
|
|
||||||
|
For detailed information on how to check for code quality issues and get feedback from automated tools, see the [Error Checking and Feedback Loops](Error-Checking-Feedback-Loops.md) documentation.
|
||||||
|
|
||||||
### Debugging
|
### Debugging
|
||||||
|
|
||||||
1. **Cypress debugging**: Use `cy.debug()` to pause test execution
|
1. **Cypress debugging**: Use `cy.debug()` to pause test execution
|
||||||
2. **wp-env debugging**: Run `wp-env logs` to see WordPress logs
|
2. **wp-env debugging**: Run `wp-env logs` to see WordPress logs
|
||||||
|
3. **GitHub Actions debugging**: Check the workflow logs for detailed error messages
|
||||||
|
|
||||||
|
## PHPUnit Tests
|
||||||
|
|
||||||
|
We use PHPUnit for unit testing PHP code. The tests are located in the `tests/phpunit` directory.
|
||||||
|
|
||||||
|
### Running PHPUnit Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run PHPUnit tests for single site
|
||||||
|
npm run test:phpunit
|
||||||
|
|
||||||
|
# Run PHPUnit tests for multisite
|
||||||
|
npm run test:phpunit:multisite
|
||||||
|
```
|
||||||
|
|
||||||
|
### Writing PHPUnit Tests
|
||||||
|
|
||||||
|
Here's an example of a PHPUnit test for the Multisite class:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
class MultisiteTest extends WP_UnitTestCase {
|
||||||
|
|
||||||
|
public function test_is_multisite_compatible() {
|
||||||
|
$multisite = new WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite();
|
||||||
|
$this->assertTrue($multisite->is_multisite_compatible());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_get_network_sites() {
|
||||||
|
$multisite = new WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite();
|
||||||
|
$sites = $multisite->get_network_sites();
|
||||||
|
$this->assertIsArray($sites);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Future Improvements
|
## Future Improvements
|
||||||
|
|
||||||
1. **PHPUnit tests**: Add unit tests for PHP code
|
1. **Performance tests**: Add performance testing
|
||||||
2. **Performance tests**: Add performance testing
|
2. **Accessibility tests**: Add accessibility testing
|
||||||
3. **Accessibility tests**: Add accessibility testing
|
|
||||||
|
|
||||||
|
|||||||
159
bin/install-wp-tests.sh
Executable file
159
bin/install-wp-tests.sh
Executable file
@@ -0,0 +1,159 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ $# -lt 3 ]; then
|
||||||
|
echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation] [multisite]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DB_NAME=$1
|
||||||
|
DB_USER=$2
|
||||||
|
DB_PASS=$3
|
||||||
|
DB_HOST=${4-localhost}
|
||||||
|
WP_VERSION=${5-latest}
|
||||||
|
SKIP_DB_CREATE=${6-false}
|
||||||
|
MULTISITE=${7-false}
|
||||||
|
|
||||||
|
WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib}
|
||||||
|
WP_CORE_DIR=${WP_CORE_DIR-/tmp/wordpress/}
|
||||||
|
|
||||||
|
download() {
|
||||||
|
if [ `which curl` ]; then
|
||||||
|
curl -s "$1" > "$2";
|
||||||
|
elif [ `which wget` ]; then
|
||||||
|
wget -nv -O "$2" "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+\-(beta|RC)[0-9]+$ ]]; then
|
||||||
|
WP_BRANCH=${WP_VERSION%\-*}
|
||||||
|
WP_TESTS_TAG="branches/$WP_BRANCH"
|
||||||
|
WP_TESTS_TAG="tags/$WP_VERSION"
|
||||||
|
elif [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
WP_TESTS_TAG="branches/$WP_VERSION"
|
||||||
|
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then
|
||||||
|
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
|
||||||
|
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
|
||||||
|
WP_TESTS_TAG="tags/${WP_VERSION%??}"
|
||||||
|
else
|
||||||
|
WP_TESTS_TAG="tags/$WP_VERSION"
|
||||||
|
fi
|
||||||
|
elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
|
||||||
|
WP_TESTS_TAG="trunk"
|
||||||
|
else
|
||||||
|
# http serves a single offer, whereas https serves multiple. we only want one
|
||||||
|
download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
|
||||||
|
grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
|
||||||
|
LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
|
||||||
|
if [[ -z "$LATEST_VERSION" ]]; then
|
||||||
|
echo "Latest WordPress version could not be found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
WP_TESTS_TAG="tags/$LATEST_VERSION"
|
||||||
|
fi
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
install_wp() {
|
||||||
|
|
||||||
|
if [ -d $WP_CORE_DIR ]; then
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p $WP_CORE_DIR
|
||||||
|
|
||||||
|
if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
|
||||||
|
mkdir -p $WP_CORE_DIR
|
||||||
|
download https://wordpress.org/nightly-builds/wordpress-latest.zip $WP_CORE_DIR/wordpress-nightly.zip
|
||||||
|
unzip -q $WP_CORE_DIR/wordpress-nightly.zip -d $WP_CORE_DIR
|
||||||
|
rm $WP_CORE_DIR/wordpress-nightly.zip
|
||||||
|
else
|
||||||
|
if [ $WP_VERSION == 'latest' ]; then
|
||||||
|
local ARCHIVE_NAME='latest'
|
||||||
|
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then
|
||||||
|
# https serves multiple offers, whereas http serves single.
|
||||||
|
download https://api.wordpress.org/core/version-check/1.7/ $WP_CORE_DIR/wp-latest.json
|
||||||
|
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
|
||||||
|
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
|
||||||
|
LATEST_VERSION=${WP_VERSION%??}
|
||||||
|
else
|
||||||
|
# otherwise, scan the releases and get the most up to date minor version of the major release
|
||||||
|
local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'`
|
||||||
|
LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $WP_CORE_DIR/wp-latest.json | sed 's/"version":"//' | head -1)
|
||||||
|
fi
|
||||||
|
if [[ -z "$LATEST_VERSION" ]]; then
|
||||||
|
local ARCHIVE_NAME="wordpress-$WP_VERSION"
|
||||||
|
else
|
||||||
|
local ARCHIVE_NAME="wordpress-$LATEST_VERSION"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
local ARCHIVE_NAME="wordpress-$WP_VERSION"
|
||||||
|
fi
|
||||||
|
download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $WP_CORE_DIR/wordpress.tar.gz
|
||||||
|
tar --strip-components=1 -zxmf $WP_CORE_DIR/wordpress.tar.gz -C $WP_CORE_DIR
|
||||||
|
rm $WP_CORE_DIR/wordpress.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
|
||||||
|
}
|
||||||
|
|
||||||
|
install_test_suite() {
|
||||||
|
# portable in-place argument for both GNU sed and Mac OSX sed
|
||||||
|
if [[ $(uname -s) == 'Darwin' ]]; then
|
||||||
|
local ioption='-i.bak'
|
||||||
|
else
|
||||||
|
local ioption='-i'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set up testing suite if it doesn't yet exist
|
||||||
|
if [ ! -d $WP_TESTS_DIR ]; then
|
||||||
|
# set up testing suite
|
||||||
|
mkdir -p $WP_TESTS_DIR
|
||||||
|
svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
|
||||||
|
svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f wp-tests-config.php ]; then
|
||||||
|
download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
# remove all forward slashes in the end
|
||||||
|
WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
|
||||||
|
sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
|
||||||
|
if [ "$MULTISITE" = "true" ]; then
|
||||||
|
sed $ioption "s:// define( 'WP_TESTS_MULTISITE', true );:define( 'WP_TESTS_MULTISITE', true );:" "$WP_TESTS_DIR"/wp-tests-config.php
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
install_db() {
|
||||||
|
|
||||||
|
if [ ${SKIP_DB_CREATE} = "true" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# parse DB_HOST for port or socket references
|
||||||
|
local PARTS=(${DB_HOST//\:/ })
|
||||||
|
local DB_HOSTNAME=${PARTS[0]};
|
||||||
|
local DB_SOCK_OR_PORT=${PARTS[1]};
|
||||||
|
local EXTRA=""
|
||||||
|
|
||||||
|
if ! [ -z $DB_HOSTNAME ] ; then
|
||||||
|
if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
|
||||||
|
EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
|
||||||
|
elif ! [ -z $DB_SOCK_OR_PORT ] ; then
|
||||||
|
EXTRA=" --socket=$DB_SOCK_OR_PORT"
|
||||||
|
elif ! [ -z $DB_HOSTNAME ] ; then
|
||||||
|
EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create database
|
||||||
|
mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
|
||||||
|
}
|
||||||
|
|
||||||
|
install_wp
|
||||||
|
install_test_suite
|
||||||
|
install_db
|
||||||
@@ -32,12 +32,14 @@
|
|||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"WPALLSTARS\\PluginStarterTemplate\\": "includes/"
|
"WPALLSTARS\\PluginStarterTemplate\\": "includes/",
|
||||||
|
"WP_Plugin_Starter_Template_For_AI_Coding\\": "includes/"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"classmap": [
|
"classmap": [
|
||||||
"includes/Admin/class-admin.php"
|
"includes/Admin/class-admin.php",
|
||||||
|
"tests/phpunit/"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
"test:e2e:multisite": "npm run setup:multisite && sleep 5 && npm run test:multisite:headless",
|
"test:e2e:multisite": "npm run setup:multisite && sleep 5 && npm run test:multisite:headless",
|
||||||
"test:playground:single": "cypress run --spec cypress/e2e/playground-single-site.cy.js",
|
"test:playground:single": "cypress run --spec cypress/e2e/playground-single-site.cy.js",
|
||||||
"test:playground:multisite": "cypress run --spec cypress/e2e/playground-multisite.cy.js",
|
"test:playground:multisite": "cypress run --spec cypress/e2e/playground-multisite.cy.js",
|
||||||
|
"test:phpunit": "composer test",
|
||||||
|
"test:phpunit:multisite": "WP_MULTISITE=1 composer test",
|
||||||
"build": "./build.sh",
|
"build": "./build.sh",
|
||||||
"lint:php": "composer run-script phpcs",
|
"lint:php": "composer run-script phpcs",
|
||||||
"lint:php:simple": "composer run-script phpcs:simple",
|
"lint:php:simple": "composer run-script phpcs:simple",
|
||||||
|
|||||||
25
phpunit.xml.dist
Normal file
25
phpunit.xml.dist
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<phpunit
|
||||||
|
bootstrap="tests/phpunit/bootstrap.php"
|
||||||
|
backupGlobals="false"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="plugin">
|
||||||
|
<directory prefix="test-" suffix=".php">./tests/phpunit/</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<filter>
|
||||||
|
<whitelist>
|
||||||
|
<directory suffix=".php">./includes</directory>
|
||||||
|
<exclude>
|
||||||
|
<directory suffix=".php">./vendor</directory>
|
||||||
|
<directory suffix=".php">./tests</directory>
|
||||||
|
<directory suffix=".php">./node_modules</directory>
|
||||||
|
</exclude>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
||||||
22
tests/phpunit/bootstrap.php
Normal file
22
tests/phpunit/bootstrap.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHPUnit bootstrap file.
|
||||||
|
*
|
||||||
|
* @package WP_Plugin_Starter_Template_For_AI_Coding
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Composer autoloader must be loaded before WP_PHPUNIT__DIR will be available.
|
||||||
|
require_once dirname( dirname( __DIR__ ) ) . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
// Give access to tests_add_filter() function.
|
||||||
|
require_once getenv( 'WP_PHPUNIT__DIR' ) . '/includes/functions.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manually load the plugin being tested.
|
||||||
|
*/
|
||||||
|
function _manually_load_plugin() {
|
||||||
|
require dirname( dirname( __DIR__ ) ) . '/plugin-toggle.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start up the WP testing environment.
|
||||||
|
require getenv( 'WP_PHPUNIT__DIR' ) . '/includes/bootstrap.php';
|
||||||
56
tests/phpunit/test-multisite.php
Normal file
56
tests/phpunit/test-multisite.php
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Class MultisiteTest
|
||||||
|
*
|
||||||
|
* @package WP_Plugin_Starter_Template_For_AI_Coding
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sample test case for the Multisite class.
|
||||||
|
*/
|
||||||
|
class MultisiteTest extends WP_UnitTestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test instance creation.
|
||||||
|
*/
|
||||||
|
public function test_instance() {
|
||||||
|
$multisite = new WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite();
|
||||||
|
$this->assertInstanceOf( 'WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite', $multisite );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test is_multisite_compatible method.
|
||||||
|
*/
|
||||||
|
public function test_is_multisite_compatible() {
|
||||||
|
$multisite = new WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite();
|
||||||
|
$this->assertTrue( $multisite->is_multisite_compatible() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get_network_sites method.
|
||||||
|
*/
|
||||||
|
public function test_get_network_sites() {
|
||||||
|
$multisite = new WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite();
|
||||||
|
|
||||||
|
// Mock the get_sites function if we're not in a multisite environment.
|
||||||
|
if ( ! function_exists( 'get_sites' ) ) {
|
||||||
|
$this->assertEquals( array(), $multisite->get_network_sites() );
|
||||||
|
} else {
|
||||||
|
$sites = $multisite->get_network_sites();
|
||||||
|
$this->assertIsArray( $sites );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test initialize_hooks method.
|
||||||
|
*/
|
||||||
|
public function test_initialize_hooks() {
|
||||||
|
$multisite = new WP_Plugin_Starter_Template_For_AI_Coding\Multisite\Multisite();
|
||||||
|
|
||||||
|
// Call the method.
|
||||||
|
$multisite->initialize_hooks();
|
||||||
|
|
||||||
|
// Check if the action was added.
|
||||||
|
$this->assertEquals( 10, has_action( 'network_admin_menu', array( $multisite, 'add_network_menu' ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user