Skip to content

Commit 9b565f7

Browse files
Build/Test Tools: Make the polyfills loading more flexible.
The PHPUnit Polyfills are, since [51559], a required dependency for the WP test suite and, by extension, for plugin/theme integration test suites which are based on and use (parts of) the WP core test suite. However, plugin/theme integration test suites may not use a full WordPress installation. This commit: * Removes the presumption that a full WP install, including `vendor` directory, will be available when the test `bootstrap.php` file is run. * Makes the loading of the PHPUnit Polyfills autoload file more flexible by: * Checking if the autoload class contained within the autoload file is already available before attempting to load the file.[[BR]] This allows for plugin/theme integration test suites to load the `phpunitpolyfills-autoload.php` file from any location, as long as it is loaded before the WP core test `bootstrap.php` file is run. * Allowing for the path to an arbitrary installation location for the PHPUnit Polyfills to be passed as a constant.[[BR]] As long as the provided location is a valid file path and the `phpunitpolyfills-autoload.php` file exists in the provided location, that file will be loaded.[[BR]] The constant can be declared in a plugin/theme integration test suite native test bootstrap file, or in the `wp-tests-config.php` file, or even in a `phpunit.xml[.dist]` file via `<php><const name="WP_TESTS_PHPUNIT_POLYFILLS_PATH" value="path/to/yoast/phpunit-polyfills"/></php>`. * Adds a version check for the PHPUnit Polyfills to prevent a mismatch between the version of the package expected by WordPress and the version used by plugins/themes.[[BR]] The version this checks for should be in line with the minimum version requirement for the PHPUnit Polyfills as declared in the `composer.json` file.[[BR]] This version number should only be updated when new features added in later PHPUnit Polyfills releases are actually used in the WP core test suite. * Adds appropriate error messages for every possible error condition. * Upgrades the PHPUnit Polyfills to version 1.0.1, which now includes a version constant. Follow-up to [51559-51577]. Props jrf, hellofromTonya, swissspidy, jeherve, thomasplevy, SergeyBiryukov. See #46149. git-svn-id: https://develop.svn.wordpress.org/trunk@51598 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 43b55b4 commit 9b565f7

File tree

2 files changed

+79
-10
lines changed

2 files changed

+79
-10
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"squizlabs/php_codesniffer": "3.6.0",
1818
"wp-coding-standards/wpcs": "~2.3.0",
1919
"phpcompatibility/phpcompatibility-wp": "~2.1.2",
20-
"yoast/phpunit-polyfills": "^1.0"
20+
"yoast/phpunit-polyfills": "^1.0.1"
2121
},
2222
"scripts": {
2323
"compat": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs --standard=phpcompat.xml.dist --report=summary,source",

tests/phpunit/includes/bootstrap.php

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,86 @@
4646
exit( 1 );
4747
}
4848

49-
// Check that the PHPUnit Polyfills autoloader exists.
50-
$phpunit_polyfills_autoloader = __DIR__ . '/../../../vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php';
51-
if ( ! file_exists( $phpunit_polyfills_autoloader ) ) {
52-
echo 'Error: You need to run `composer update` before running the tests.' . PHP_EOL;
53-
echo 'You can still use a PHPUnit phar to run them, but the dependencies do need to be installed.' . PHP_EOL;
49+
/*
50+
* Load the PHPUnit Polyfills autoloader.
51+
*
52+
* The PHPUnit Polyfills are a requirement for the WP test suite.
53+
*
54+
* Plugin/theme integration tests can handle this in any of the following ways:
55+
* - When using a full WP install: run `composer update` for the WP install prior to running the tests.
56+
* - When using a partial WP test suite install:
57+
* - Add a `yoast/phpunit-polyfills` (dev) requirement to their own `composer.json` file.
58+
* - And then:
59+
* - Either load the PHPUnit Polyfills autoload file prior to running the WP core bootstrap file.
60+
* - Or declare a `WP_TESTS_PHPUNIT_POLYFILLS_PATH` constant pointing to the root directory
61+
* of the PHPUnit Polyfills installation.
62+
* This constant can be declared in the `phpunit.xml[.dist]` file like this:
63+
* `<php><const name="WP_TESTS_PHPUNIT_POLYFILLS_PATH" value="path/to/yoast/phpunit-polyfills"/></php>
64+
* or can be declared as a PHP constant in the `wp-tests-config.php` file or the plugin/theme
65+
* test bootstrap file.
66+
*/
67+
if ( ! class_exists( 'Yoast\PHPUnitPolyfills\Autoload' ) ) {
68+
// Default location of the autoloader for WP core test runs.
69+
$phpunit_polyfills_autoloader = __DIR__ . '/../../../vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php';
70+
$phpunit_polyfills_error = false;
71+
72+
// Allow for a custom installation location to be provided for plugin/theme integration tests.
73+
if ( defined( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH' ) ) {
74+
$phpunit_polyfills_path = WP_TESTS_PHPUNIT_POLYFILLS_PATH;
75+
76+
if ( is_string( WP_TESTS_PHPUNIT_POLYFILLS_PATH )
77+
&& '' !== WP_TESTS_PHPUNIT_POLYFILLS_PATH
78+
) {
79+
$phpunit_polyfills_path = rtrim( $phpunit_polyfills_path, '/\\' );
80+
$phpunit_polyfills_path = realpath( $phpunit_polyfills_path . '/phpunitpolyfills-autoload.php' );
81+
if ( false !== $phpunit_polyfills_path ) {
82+
$phpunit_polyfills_autoloader = $phpunit_polyfills_path;
83+
} else {
84+
$phpunit_polyfills_error = true;
85+
}
86+
} else {
87+
$phpunit_polyfills_error = true;
88+
}
89+
}
90+
91+
if ( $phpunit_polyfills_error || ! file_exists( $phpunit_polyfills_autoloader ) ) {
92+
echo 'Error: The PHPUnit Polyfills library is a requirement for running the WP test suite.' . PHP_EOL;
93+
if ( isset( $phpunit_polyfills_path ) ) {
94+
printf(
95+
'The PHPUnit Polyfills autoload file was not found in "%s"' . PHP_EOL,
96+
WP_TESTS_PHPUNIT_POLYFILLS_PATH
97+
);
98+
echo 'Please verify that the file path provided in the WP_TESTS_PHPUNIT_POLYFILLS_PATH constant is correct.' . PHP_EOL;
99+
} else {
100+
echo 'You need to run `composer update` before running the tests.' . PHP_EOL;
101+
echo 'Once the dependencies are installed, you can run the tests using the Composer-installed version of PHPUnit or using a PHPUnit phar file, but the dependencies do need to be installed whichever way the tests are run.' . PHP_EOL;
102+
}
103+
exit( 1 );
104+
}
105+
106+
require_once $phpunit_polyfills_autoloader;
107+
}
108+
unset( $phpunit_polyfills_autoloader, $phpunit_polyfills_error, $phpunit_polyfills_path );
109+
110+
/*
111+
* Minimum version of the PHPUnit Polyfills package as declared in `composer.json`.
112+
* Only needs updating when new polyfill features start being used in the test suite.
113+
*/
114+
$phpunit_polyfills_minimum_version = '1.0.1';
115+
if ( class_exists( '\Yoast\PHPUnitPolyfills\Autoload' )
116+
&& ( defined( '\Yoast\PHPUnitPolyfills\Autoload::VERSION' ) === false
117+
|| version_compare( \Yoast\PHPUnitPolyfills\Autoload::VERSION, $phpunit_polyfills_minimum_version, '<' ) )
118+
) {
119+
printf(
120+
'Error: Version mismatch detected for the PHPUnit Polyfills. Please ensure that PHPUnit Polyfills %s or higher is loaded.' . PHP_EOL,
121+
$phpunit_polyfills_minimum_version
122+
);
123+
if ( ! defined( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH' ) ) {
124+
echo 'Please run `composer update` to install the latest version.' . PHP_EOL;
125+
}
54126
exit( 1 );
55127
}
128+
unset( $phpunit_polyfills_minimum_version );
56129

57130
// If running core tests, check if all the required PHP extensions are loaded before running the test suite.
58131
if ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS ) {
@@ -199,10 +272,6 @@ function wp_tests_options( $value ) {
199272
require __DIR__ . '/phpunit6/compat.php';
200273
}
201274

202-
// Load the PHPUnit Polyfills autoloader (check for existence of the file is done earlier in the script).
203-
require_once $phpunit_polyfills_autoloader;
204-
unset( $phpunit_polyfills_autoloader );
205-
206275
require __DIR__ . '/phpunit-adapter-testcase.php';
207276
require __DIR__ . '/abstract-testcase.php';
208277
require __DIR__ . '/testcase.php';

0 commit comments

Comments
 (0)