wordpress-develop/tests/phpunit/tests
Joe McGill 618e42240f Themes: Use original template paths when switching blogs.
This fixes a bug introduced by [57129] and [56635] in which deprecating the previous  `TEMPLATEPATH` and `STYLESHEETPATH` constants in favor of `get_template_directory()` and `get_stylesheet_directory()` functions caused the active theme template path to change when using `switch_to_blog()`.

This introduces a new function, `wp_set_template_globals()`, which is called during the bootstrap process to store the template paths to new globals values `$wp_template_path` and `$wp_stylesheet_path`. This restores behavior to how things worked prior to [56635] but retains the ability for template values to be reset for better testability.

Related #18298, #60025.

Props joemcgill, flixos90, mukesh27, swissspidy, manfcarlo, metropolis_john, jeremyfelt.
Fixes #60290.


git-svn-id: https://develop.svn.wordpress.org/trunk@57685 602fd350-edb4-49c9-b593-d223f7449a82
2024-02-21 19:24:12 +00:00
..
admin Export: Include featured image for posts or pages. 2024-02-21 18:13:27 +00:00
ajax Tests: Use assertSame() in some newly introduced tests. 2024-01-06 12:59:49 +00:00
attachment Coding Standards: Remove superfluous blank lines at the end of various classes. 2023-09-08 09:30:38 +00:00
block-bindings Editor: Merge uses_context defined by block bindings sources with block types 2024-02-16 12:53:16 +00:00
block-supports Editor: Fix instance element styles for links applying to buttons. 2024-02-20 11:20:22 +00:00
block-templates Block Hooks: Set ignoredHookedBlocks metadata upon saving. 2024-02-13 15:10:21 +00:00
blocks Block Hooks: Make test a bit easier to read. 2024-02-21 10:47:49 +00:00
bookmark Tests: Use the function get_num_queries across all unit tests. 2023-05-11 10:05:51 +00:00
canonical Media: Redirect inactive attachment pages for logged-out users. 2024-01-25 17:34:54 +00:00
category Tests: Improve the @group annotation accuracy and consistency. 2023-10-19 13:51:04 +00:00
comment Themes: Use original template paths when switching blogs. 2024-02-21 19:24:12 +00:00
compat General: Add tests for array_is_list polyfill added in r57337. 2024-02-05 21:57:44 +00:00
cron Cron API: Modify _get_cron_array() to always return an array. 2022-07-29 03:32:58 +00:00
customize Tests: Add a @ticket reference for WP_Customize_Manager::trash_changeset_post() test. 2024-01-05 11:38:34 +00:00
date Tests: Add unit tests for wp_checkdate(). 2023-12-12 12:19:38 +00:00
db Docs: Replace "sanity" with "confidence" for inclusive language. 2024-01-03 21:57:32 +00:00
dependencies Script Modules API: Add import map polyfill for older browsers 2024-01-31 08:29:18 +00:00
diff Code Modernization: Use wp_trigger_error() in WP_Text_Diff_Renderer_Table magic methods. 2023-09-07 20:46:53 +00:00
editor Tests: Improve the @group annotation accuracy and consistency. 2023-10-19 13:51:04 +00:00
error-protection Tests: Rename classes in phpunit/tests/error-protection/ per the naming conventions. 2021-08-21 15:32:53 +00:00
feed Tests: Reduce usage of assertEquals 2023-09-29 15:22:12 +00:00
filesystem Upload: Fallback to PclZip to validate ZIP file uploads. 2024-02-05 22:21:35 +00:00
fonts Editor: Format and sanitize font family names according the CSS spec. 2024-02-20 07:09:43 +00:00
formatting Emoji: Replace twitter/twemoji with jdecked/twemoji. 2024-02-13 14:34:17 +00:00
functions Tests: Adjust the meta key time in wp_scheduled_delete() tests. 2024-02-11 17:02:46 +00:00
general Tests: Use a @requires annotation for readonly() function test. 2023-10-26 20:31:45 +00:00
hooks Tests: Add hook priority call order tests. 2024-01-09 16:32:14 +00:00
html-api HTML API: Reset parser state after seeking to bookmark. 2024-02-02 22:55:27 +00:00
http HTTP API: Ensure cookie names are cast to strings. 2024-01-31 12:51:39 +00:00
image Tests: Use assertSame() in wp_read_image_metadata() tests. 2024-02-20 18:14:41 +00:00
import Coding Standards: Remove redundant ignore annotations. 2023-09-28 00:02:47 +00:00
includes Code Modernization: Explicitly declare all properties created in set_up() methods of various test classes. 2022-08-27 12:30:08 +00:00
interactivity-api Interactivity API: Skip instead of bail out if HTML contains SVG or MATH. 2024-02-17 15:26:43 +00:00
kses Editor: Add PHPUnit tests for 5.9.0 new functions. 2022-10-04 14:20:18 +00:00
l10n I18N: Fix plural forms parsing in WP_Translation_File. 2024-02-01 20:57:03 +00:00
link Posts, Post Types: Don't force trailing slash in get_pagenum_link(). 2023-10-16 00:05:28 +00:00
load Tests: Improve the @group annotation accuracy and consistency. 2023-10-19 13:51:04 +00:00
media Media: Consider inline image CSS width to backfill width and height attributes. 2024-01-16 17:01:30 +00:00
menu Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00
meta Revisions: framework for storing post meta revisions. 2023-09-26 15:30:34 +00:00
multisite Coding Standards: Use pre-increment/decrement for stand-alone statements. 2023-09-09 09:26:01 +00:00
oembed Embeds: Ensure the deprecated function print_emoji_styles isn't used 2024-01-17 21:34:24 +00:00
option Options, Meta APIs: Fast follow fixes for option cache priming functions. 2023-10-30 22:56:25 +00:00
pluggable Coding Standards: Use pre-increment/decrement for stand-alone statements. 2023-09-09 09:26:01 +00:00
pomo Code Modernization: Use dirname() with the $levels parameter. 2023-09-11 04:51:09 +00:00
post Tests: Use assertSame() in wp_insert_post() tests. 2024-02-21 17:33:54 +00:00
privacy Docs: Fix various incorrect WP-flavored array specifications. 2023-11-09 09:49:41 +00:00
query Tests: Use assertSame() in WP_Query tests involving ::$max_num_pages property. 2024-02-18 18:59:24 +00:00
rest-api Tests: Synchronize Theme.JSON unit test between Core and Gutenberg. 2024-02-20 09:53:11 +00:00
rewrite Coding Standards: Remove superfluous blank lines at the end of various classes. 2023-09-08 09:30:38 +00:00
script-modules Script Modules API: Add deregister module function 2024-02-12 12:58:53 +00:00
sitemaps Sitemaps: add lastmod for individual posts and the homepage. 2023-10-23 15:40:44 +00:00
style-engine Editor: introduce dimensions.aspectRatio block support. 2024-01-31 02:52:25 +00:00
taxonomy Build/Test Tools: Implement use of the void solution. 2021-08-07 10:29:41 +00:00
term Taxonomy: Check for empty term after DB sanitization in wp_insert_term(). 2024-01-08 22:42:49 +00:00
theme Tests: Synchronize Theme.JSON unit test between Core and Gutenberg. 2024-02-20 09:53:11 +00:00
url Tests: Second pass at merging file-level and class-level DocBlocks in various unit test files. 2023-03-03 14:42:42 +00:00
user Docs: Correct the WP_User Query location reference in query cache tests. 2024-01-22 19:40:18 +00:00
widgets Tests: Reduce usage of assertEquals 2023-09-29 15:22:12 +00:00
wp Tests: Move the tests for WP class methods to the wp directory. 2022-10-28 14:08:20 +00:00
xmlrpc XML-RPC: Add alt attribute value to media item API. 2023-09-20 19:29:30 +00:00
actions.php Tests: Add hook priority call order tests. 2024-01-09 16:32:14 +00:00
adminbar.php Tests: Add tests to ensure the contribute Toolbar node is added when appropriate. 2023-07-13 12:39:42 +00:00
auth.php REST API: Correct parsing of password from Authorization header when processing Application Password credentials. 2023-10-09 14:47:57 +00:00
avatar.php Coding Standards: Remove superfluous blank lines at the end of various classes. 2023-09-08 09:30:38 +00:00
basic.php Tests: Separate the tests in basic.php for clarity. 2022-07-07 23:55:13 +00:00
block-template-utils.php Tests: Improve code coverage for _build_block_template_result_from_file 2023-10-23 05:36:50 +00:00
block-template.php Themes: Improve the performance of _get_block_templates_paths. 2023-12-20 20:00:04 +00:00
cache.php Coding Standards: Always use parentheses when instantiating an object. 2022-11-29 15:49:49 +00:00
canonical.php Canonical: Limit post types searched by redirect_guess_404_permalink(). 2024-02-16 23:32:48 +00:00
comment.php Tests: Reset the current user before performing assertions in some comment tests. 2023-10-15 08:07:11 +00:00
cron.php Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00
db.php Database: Reinstate wpdb::$use_mysqli property. 2023-11-08 20:31:34 +00:00
dependencies.php Coding Standards: Remove superfluous blank lines at the end of various functions. 2023-09-08 10:01:14 +00:00
file.php Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00
filters.php Tests: Add hook priority call order tests. 2024-01-09 16:32:14 +00:00
functions.php Media: enable AVIF support. 2024-02-02 17:46:50 +00:00
https-detection.php Security: remove the cron event that checked for https support. 2023-09-22 19:06:45 +00:00
https-migration.php Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00
kses.php KSES: Add background-repeat to the list of safe CSS properties. 2023-12-26 14:22:45 +00:00
l10n.php Tests: Ensure prerequisites are met for draft length tests in Tests_L10n. 2022-10-01 15:47:13 +00:00
link.php Posts, Post Types: Don't force trailing slash in get_pagenum_link(). 2023-10-16 00:05:28 +00:00
locale.php I18N: Introduce word_count_type property to WP_Locale. 2023-02-07 17:26:14 +00:00
media.php Themes: Skip wrapping block template for singular content with a main query loop when the template was injected from outside the current theme. 2023-10-27 18:16:05 +00:00
meta.php Tests: Reduce usage of assertEquals 2023-09-29 15:22:12 +00:00
post.php Docs: Replace "sanity" with "confidence" for inclusive language. 2024-01-03 21:57:32 +00:00
query.php Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00
readme.php Tests: Query mariadb.org instead of mariadb.com in README test. 2024-02-21 18:59:57 +00:00
rest-api.php Tests: Avoid an infinite loop in Spy_REST_Server if a non-existing method is called. 2023-11-23 14:39:16 +00:00
rewrite.php Code Modernization: Check the return type of parse_url() in url_to_postid(). 2022-10-01 03:23:41 +00:00
robots.php Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00
shortcode.php Shortcodes: Always return an array in shortcode_parse_atts(). 2024-02-12 16:06:47 +00:00
taxonomy.php Taxonomy: add taxonomy for user pattern categories. 2023-09-21 04:23:12 +00:00
template.php Themes: Deprecate usage of TEMPLATEPATH and STYLESHEETPATH constants. 2023-09-20 17:25:26 +00:00
term.php Tests: Improve the @group annotation accuracy and consistency. 2023-10-19 13:51:04 +00:00
theme-previews.php Editor: Add function prefix to avoid conflicts. 2023-10-02 22:40:36 +00:00
theme.php Themes: Use original template paths when switching blogs. 2024-02-21 19:24:12 +00:00
upload.php Coding Standards: Remove superfluous blank lines at the end of various classes. 2023-09-08 09:30:38 +00:00
url.php Coding Standards: Use pre-increment/decrement for stand-alone statements. 2023-09-09 09:26:01 +00:00
user.php Tests: Reduce usage of assertEquals 2023-09-29 15:22:12 +00:00
utils.php Coding Standards: Remove superfluous blank lines at the end of various functions. 2023-09-08 10:01:14 +00:00
vars.php Tests: Improve the @group annotation accuracy and consistency. 2023-10-19 13:51:04 +00:00
walker.php Coding Standards: Remove superfluous blank lines at the end of various functions. 2023-09-08 10:01:14 +00:00
widgets.php Coding Standards: Include one space after function keyword for closures. 2023-09-12 15:21:02 +00:00

<?php
/**
 * Validate recommended versions for dependencies referenced in `readme.html`,
 * based on external site support pages.
 *
 * @group external-http
 */
class Tests_Readme extends WP_UnitTestCase {

	/**
	 * @coversNothing
	 */
	public function test_readme_php_version() {
		$this->markTestSkipped(
			'Temporarily disabled. Test should be re-enabled once WordPress is fully compatible with PHP 8.0+.'
		);

		// This test is designed to only run on trunk.
		$this->skipOnAutomatedBranches();

		$readme = file_get_contents( ABSPATH . 'readme.html' );

		preg_match( '#Recommendations.*PHP</a> version <strong>([0-9.]*)#s', $readme, $matches );

		$response_body = $this->get_response_body( 'https://www.php.net/supported-versions.php' );

		preg_match_all( '#<tr class="stable">\s*<td>\s*<a [^>]*>\s*([0-9.]*)#s', $response_body, $php_matches );

		$this->assertContains( $matches[1], $php_matches[1], "readme.html's Recommended PHP version is too old. Remember to update the WordPress.org Requirements page, too." );
	}

	/**
	 * @coversNothing
	 */
	public function test_readme_mysql_version() {
		// This test is designed to only run on trunk.
		$this->skipOnAutomatedBranches();

		$readme = file_get_contents( ABSPATH . 'readme.html' );

		preg_match( '#Recommendations.*MySQL</a> version <strong>([0-9.]*)#s', $readme, $matches );

		$response_body = $this->get_response_body( "https://dev.mysql.com/doc/relnotes/mysql/{$matches[1]}/en/" );

		// Retrieve the date of the first GA release for the recommended branch.
		preg_match( '#.*(\d{4}-\d{2}-\d{2}), General Availability#s', $response_body, $mysql_matches );

		/*
		 * Per https://www.mysql.com/support/, Oracle actively supports MySQL releases for 5 years from GA release.
		 *
		 * The currently recommended MySQL 8.0 branch moved from active support to extended support on 2023-04-19.
		 * As WordPress core may not be fully compatible with MySQL 8.1 at this time, the "supported" period here
		 * is increased to 8 years to include extended support.
		 *
		 * TODO: Reduce this back to 5 years once MySQL 8.1 compatibility is achieved.
		 */
		$mysql_eol    = gmdate( 'Y-m-d', strtotime( $mysql_matches[1] . ' +8 years' ) );
		$current_date = gmdate( 'Y-m-d' );

		$this->assertLessThan( $mysql_eol, $current_date, "readme.html's Recommended MySQL version is too old. Remember to update the WordPress.org Requirements page, too." );
	}

	/**
	 * @coversNothing
	 */
	public function test_readme_mariadb_version() {
		// This test is designed to only run on trunk.
		$this->skipOnAutomatedBranches();

		$readme = file_get_contents( ABSPATH . 'readme.html' );

		preg_match( '#Recommendations.*MariaDB</a> version <strong>([0-9.]*)#s', $readme, $recommended );
		$this->assertCount( 2, $recommended, 'The recommended version was not matched.' );

		$all_releases       = $this->get_response_body( 'https://mariadb.org/mariadb/all-releases/' );
		$recommended_regex  = str_replace( '.', '\.', $recommended[1] ) . '\.\d{1,2}'; // Examples: 10.4.1 or 10.4.22
		$release_date_regex = '(\d{4}-\d{2}-\d{2})'; // Example: 2024-01-01

		// Retrieve the date of the first stable release for the recommended branch.
		preg_match( "#{$recommended_regex}.*?{$release_date_regex}#", $all_releases, $release_date );
		$this->assertCount( 2, $release_date, 'The release date was not matched.' );

		// Per https://mariadb.org/about/#maintenance-policy, MariaDB releases are supported for 5 years.
		$mariadb_eol  = gmdate( 'Y-m-d', strtotime( $release_date[1] . ' +5 years' ) );
		$current_date = gmdate( 'Y-m-d' );

		$this->assertLessThan( $mariadb_eol, $current_date, "readme.html's Recommended MariaDB version is too old. Remember to update the WordPress.org Requirements page, too." );
	}

	/**
	 * Helper function to retrieve the response body or skip the test on HTTP timeout.
	 *
	 * @param string $url The URL to retrieve the response from.
	 * @return string The response body.
	 */
	public function get_response_body( $url ) {
		$response = wp_remote_get( $url );

		$this->skipTestOnTimeout( $response );

		$response_code = wp_remote_retrieve_response_code( $response );
		$response_body = wp_remote_retrieve_body( $response );

		if ( 200 !== $response_code ) {
			$parsed_url = parse_url( $url );

			$error_message = sprintf(
				'Could not contact %1$s to check versions. Response code: %2$s. Response body: %3$s',
				$parsed_url['host'],
				$response_code,
				$response_body
			);

			if ( 503 === $response_code ) {
				$this->markTestSkipped( $error_message );
			}

			$this->fail( $error_message );
		}

		return $response_body;
	}
}