mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2025-10-16 12:05:38 +00:00
**composer.json**: Remove the PHPUnit dependency in favor of allowing the PHPUnit Polyfills library to manage the supported PHPUnit version. This automatically now widens the supported PHPUnit versions to 5.7.21 to 9.5.8 (current). Letting the PHPUnit Polyfills handle the version constraints for PHPUnit prevents potential version conflicts in the future, as well as allows WordPress to benefit straight away when a new PHPUnit version would be released and the PHPUnit Polyfills package adds support for that PHPUnit version. **Test Bootstrap** Update the supported version number for PHPUnit 5.x, as the minimum PHPUnit 5.x version supported by the PHPUnit Polyfills is PHPUnit 5.7.21, and remove the PHPUnit maximum. **.gitignore and svn:ignore:** Add the PHPUnit cache file to the list of files to be ignored. Since PHPUnit 8, PHPUnit has a built-in caching feature which creates a `.phpunit.result.cache` file. This file should not be committed. Follow-up to [40536], [40853], [44701], [51559-51573]. Props jrf. See #46149. git-svn-id: https://develop.svn.wordpress.org/trunk@51574 602fd350-edb4-49c9-b593-d223f7449a82
291 lines
9.6 KiB
PHP
291 lines
9.6 KiB
PHP
<?php
|
|
/**
|
|
* Installs WordPress for running the tests and loads WordPress and the test libraries
|
|
*/
|
|
|
|
if ( defined( 'WP_TESTS_CONFIG_FILE_PATH' ) ) {
|
|
$config_file_path = WP_TESTS_CONFIG_FILE_PATH;
|
|
} else {
|
|
$config_file_path = dirname( __DIR__ );
|
|
if ( ! file_exists( $config_file_path . '/wp-tests-config.php' ) ) {
|
|
// Support the config file from the root of the develop repository.
|
|
if ( basename( $config_file_path ) === 'phpunit' && basename( dirname( $config_file_path ) ) === 'tests' ) {
|
|
$config_file_path = dirname( dirname( $config_file_path ) );
|
|
}
|
|
}
|
|
$config_file_path .= '/wp-tests-config.php';
|
|
}
|
|
|
|
/*
|
|
* Globalize some WordPress variables, because PHPUnit loads this file inside a function.
|
|
* See: https://github.com/sebastianbergmann/phpunit/issues/325
|
|
*/
|
|
global $wpdb, $current_site, $current_blog, $wp_rewrite, $shortcode_tags, $wp, $phpmailer, $wp_theme_directories;
|
|
|
|
if ( ! is_readable( $config_file_path ) ) {
|
|
echo "Error: wp-tests-config.php is missing! Please use wp-tests-config-sample.php to create a config file.\n";
|
|
exit( 1 );
|
|
}
|
|
|
|
require_once $config_file_path;
|
|
require_once __DIR__ . '/functions.php';
|
|
|
|
if ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS && ! is_dir( ABSPATH ) ) {
|
|
echo "Error: The /build/ directory is missing! Please run `npm run build` prior to running PHPUnit.\n";
|
|
exit( 1 );
|
|
}
|
|
|
|
$phpunit_version = tests_get_phpunit_version();
|
|
|
|
if ( version_compare( $phpunit_version, '5.7.21', '<' ) ) {
|
|
printf(
|
|
"Error: Looks like you're using PHPUnit %s. WordPress requires at least PHPUnit 5.7.21.\n",
|
|
$phpunit_version
|
|
);
|
|
echo "Please use the latest PHPUnit version supported for the PHP version you are running the tests on.\n";
|
|
exit( 1 );
|
|
}
|
|
|
|
// Register a custom autoloader for the PHPUnit 9.x Mockobject classes for compatibility with PHP 8.0.
|
|
require_once __DIR__ . '/class-mockobject-autoload.php';
|
|
spl_autoload_register( 'MockObject_Autoload::load', true, true );
|
|
|
|
// Check that the PHPUnit Polyfills autoloader exists.
|
|
$phpunit_polyfills_autoloader = __DIR__ . '/../../../vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php';
|
|
if ( ! file_exists( $phpunit_polyfills_autoloader ) ) {
|
|
echo "Error: You need to run `composer update` before running the tests.\n";
|
|
echo "You can still use a PHPUnit phar to run them, but the dependencies do need to be installed.\n";
|
|
exit( 1 );
|
|
}
|
|
|
|
// If running core tests, check if all the required PHP extensions are loaded before running the test suite.
|
|
if ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS ) {
|
|
$required_extensions = array(
|
|
'gd',
|
|
);
|
|
$missing_extensions = array();
|
|
|
|
foreach ( $required_extensions as $extension ) {
|
|
if ( ! extension_loaded( $extension ) ) {
|
|
$missing_extensions[] = $extension;
|
|
}
|
|
}
|
|
|
|
if ( $missing_extensions ) {
|
|
printf(
|
|
"Error: The following required PHP extensions are missing from the testing environment: %s.\n",
|
|
implode( ', ', $missing_extensions )
|
|
);
|
|
echo "Please make sure they are installed and enabled.\n",
|
|
exit( 1 );
|
|
}
|
|
}
|
|
|
|
$required_constants = array(
|
|
'WP_TESTS_DOMAIN',
|
|
'WP_TESTS_EMAIL',
|
|
'WP_TESTS_TITLE',
|
|
'WP_PHP_BINARY',
|
|
);
|
|
$missing_constants = array();
|
|
|
|
foreach ( $required_constants as $constant ) {
|
|
if ( ! defined( $constant ) ) {
|
|
$missing_constants[] = $constant;
|
|
}
|
|
}
|
|
|
|
if ( $missing_constants ) {
|
|
printf(
|
|
"Error: The following required constants are not defined: %s.\n",
|
|
implode( ', ', $missing_constants )
|
|
);
|
|
echo "Please check out `wp-tests-config-sample.php` for an example.\n",
|
|
exit( 1 );
|
|
}
|
|
|
|
tests_reset__SERVER();
|
|
|
|
define( 'WP_TESTS_TABLE_PREFIX', $table_prefix );
|
|
define( 'DIR_TESTDATA', __DIR__ . '/../data' );
|
|
define( 'DIR_TESTROOT', realpath( dirname( __DIR__ ) ) );
|
|
|
|
define( 'WP_LANG_DIR', DIR_TESTDATA . '/languages' );
|
|
|
|
if ( ! defined( 'WP_TESTS_FORCE_KNOWN_BUGS' ) ) {
|
|
define( 'WP_TESTS_FORCE_KNOWN_BUGS', false );
|
|
}
|
|
|
|
/*
|
|
* Cron tries to make an HTTP request to the site, which always fails,
|
|
* because tests are run in CLI mode only.
|
|
*/
|
|
define( 'DISABLE_WP_CRON', true );
|
|
|
|
define( 'WP_MEMORY_LIMIT', -1 );
|
|
define( 'WP_MAX_MEMORY_LIMIT', -1 );
|
|
|
|
define( 'REST_TESTS_IMPOSSIBLY_HIGH_NUMBER', 99999999 );
|
|
|
|
$PHP_SELF = '/index.php';
|
|
$GLOBALS['PHP_SELF'] = '/index.php';
|
|
$_SERVER['PHP_SELF'] = '/index.php';
|
|
|
|
// Should we run in multisite mode?
|
|
$multisite = ( '1' === getenv( 'WP_MULTISITE' ) );
|
|
$multisite = $multisite || ( defined( 'WP_TESTS_MULTISITE' ) && WP_TESTS_MULTISITE );
|
|
$multisite = $multisite || ( defined( 'MULTISITE' ) && MULTISITE );
|
|
|
|
// Override the PHPMailer.
|
|
require_once __DIR__ . '/mock-mailer.php';
|
|
$phpmailer = new MockPHPMailer( true );
|
|
|
|
if ( ! defined( 'WP_DEFAULT_THEME' ) ) {
|
|
define( 'WP_DEFAULT_THEME', 'default' );
|
|
}
|
|
$wp_theme_directories = array();
|
|
|
|
if ( file_exists( DIR_TESTDATA . '/themedir1' ) ) {
|
|
$wp_theme_directories[] = DIR_TESTDATA . '/themedir1';
|
|
}
|
|
|
|
if ( '1' !== getenv( 'WP_TESTS_SKIP_INSTALL' ) ) {
|
|
$core_tests = ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS ) ? 'run_core_tests' : 'no_core_tests';
|
|
$ms_tests = $multisite ? 'run_ms_tests' : 'no_ms_tests';
|
|
|
|
system( WP_PHP_BINARY . ' ' . escapeshellarg( __DIR__ . '/install.php' ) . ' ' . escapeshellarg( $config_file_path ) . ' ' . $ms_tests . ' ' . $core_tests, $retval );
|
|
if ( 0 !== $retval ) {
|
|
exit( $retval );
|
|
}
|
|
}
|
|
|
|
if ( $multisite ) {
|
|
echo 'Running as multisite...' . PHP_EOL;
|
|
defined( 'MULTISITE' ) or define( 'MULTISITE', true );
|
|
defined( 'SUBDOMAIN_INSTALL' ) or define( 'SUBDOMAIN_INSTALL', false );
|
|
$GLOBALS['base'] = '/';
|
|
} else {
|
|
echo 'Running as single site... To run multisite, use -c tests/phpunit/multisite.xml' . PHP_EOL;
|
|
}
|
|
unset( $multisite );
|
|
|
|
$GLOBALS['_wp_die_disabled'] = false;
|
|
// Allow tests to override wp_die().
|
|
tests_add_filter( 'wp_die_handler', '_wp_die_handler_filter' );
|
|
// Use the Spy REST Server instead of default.
|
|
tests_add_filter( 'wp_rest_server_class', '_wp_rest_server_class_filter' );
|
|
// Prevent updating translations asynchronously.
|
|
tests_add_filter( 'async_update_translation', '__return_false' );
|
|
// Disable background updates.
|
|
tests_add_filter( 'automatic_updater_disabled', '__return_true' );
|
|
|
|
// Preset WordPress options defined in bootstrap file.
|
|
// Used to activate themes, plugins, as well as other settings.
|
|
if ( isset( $GLOBALS['wp_tests_options'] ) ) {
|
|
function wp_tests_options( $value ) {
|
|
$key = substr( current_filter(), strlen( 'pre_option_' ) );
|
|
return $GLOBALS['wp_tests_options'][ $key ];
|
|
}
|
|
|
|
foreach ( array_keys( $GLOBALS['wp_tests_options'] ) as $key ) {
|
|
tests_add_filter( 'pre_option_' . $key, 'wp_tests_options' );
|
|
}
|
|
}
|
|
|
|
// Load WordPress.
|
|
require_once ABSPATH . '/wp-settings.php';
|
|
|
|
// Delete any default posts & related data.
|
|
_delete_all_posts();
|
|
|
|
// Load class aliases for compatibility with PHPUnit 6+.
|
|
if ( version_compare( tests_get_phpunit_version(), '6.0', '>=' ) ) {
|
|
require __DIR__ . '/phpunit6/compat.php';
|
|
}
|
|
|
|
// Load the PHPUnit Polyfills autoloader (check for existence of the file is done earlier in the script).
|
|
require_once $phpunit_polyfills_autoloader;
|
|
unset( $phpunit_polyfills_autoloader );
|
|
|
|
require __DIR__ . '/phpunit-adapter-testcase.php';
|
|
require __DIR__ . '/abstract-testcase.php';
|
|
require __DIR__ . '/testcase.php';
|
|
require __DIR__ . '/testcase-rest-api.php';
|
|
require __DIR__ . '/testcase-rest-controller.php';
|
|
require __DIR__ . '/testcase-rest-post-type-controller.php';
|
|
require __DIR__ . '/testcase-xmlrpc.php';
|
|
require __DIR__ . '/testcase-ajax.php';
|
|
require __DIR__ . '/testcase-canonical.php';
|
|
require __DIR__ . '/testcase-xml.php';
|
|
require __DIR__ . '/exceptions.php';
|
|
require __DIR__ . '/utils.php';
|
|
require __DIR__ . '/spy-rest-server.php';
|
|
require __DIR__ . '/class-wp-rest-test-search-handler.php';
|
|
require __DIR__ . '/class-wp-rest-test-configurable-controller.php';
|
|
require __DIR__ . '/class-wp-fake-block-type.php';
|
|
require __DIR__ . '/class-wp-sitemaps-test-provider.php';
|
|
require __DIR__ . '/class-wp-sitemaps-empty-test-provider.php';
|
|
require __DIR__ . '/class-wp-sitemaps-large-test-provider.php';
|
|
|
|
/**
|
|
* A class to handle additional command line arguments passed to the script.
|
|
*
|
|
* If it is determined that phpunit was called with a --group that corresponds
|
|
* to an @ticket annotation (such as `phpunit --group 12345` for bugs marked
|
|
* as #WP12345), then it is assumed that known bugs should not be skipped.
|
|
*
|
|
* If WP_TESTS_FORCE_KNOWN_BUGS is already set in wp-tests-config.php, then
|
|
* how you call phpunit has no effect.
|
|
*/
|
|
class WP_PHPUnit_Util_Getopt {
|
|
|
|
function __construct( $argv ) {
|
|
$skipped_groups = array(
|
|
'ajax' => true,
|
|
'ms-files' => true,
|
|
'external-http' => true,
|
|
);
|
|
|
|
while ( current( $argv ) ) {
|
|
$option = current( $argv );
|
|
$value = next( $argv );
|
|
|
|
switch ( $option ) {
|
|
case '--exclude-group':
|
|
foreach ( $skipped_groups as $group_name => $skipped ) {
|
|
$skipped_groups[ $group_name ] = false;
|
|
}
|
|
continue 2;
|
|
case '--group':
|
|
$groups = explode( ',', $value );
|
|
foreach ( $groups as $group ) {
|
|
if ( is_numeric( $group ) || preg_match( '/^(UT|Plugin)\d+$/', $group ) ) {
|
|
WP_UnitTestCase::forceTicket( $group );
|
|
}
|
|
}
|
|
|
|
foreach ( $skipped_groups as $group_name => $skipped ) {
|
|
if ( in_array( $group_name, $groups, true ) ) {
|
|
$skipped_groups[ $group_name ] = false;
|
|
}
|
|
}
|
|
continue 2;
|
|
}
|
|
}
|
|
|
|
$skipped_groups = array_filter( $skipped_groups );
|
|
foreach ( $skipped_groups as $group_name => $skipped ) {
|
|
echo sprintf( 'Not running %1$s tests. To execute these, use --group %1$s.', $group_name ) . PHP_EOL;
|
|
}
|
|
|
|
if ( ! isset( $skipped_groups['external-http'] ) ) {
|
|
echo PHP_EOL;
|
|
echo 'External HTTP skipped tests can be caused by timeouts.' . PHP_EOL;
|
|
echo 'If this changeset includes changes to HTTP, make sure there are no timeouts.' . PHP_EOL;
|
|
echo PHP_EOL;
|
|
}
|
|
}
|
|
|
|
}
|
|
new WP_PHPUnit_Util_Getopt( $_SERVER['argv'] );
|