wordpress-develop/tests/phpunit/tests/sitemaps/wpSitemapsRegistry.php
Peter Wilson b96a51c529 Sitemaps: Prevent invalid provider names throwing errors.
Validate the requested sitemap is a string before attempting to use it in a provider. This prevents `WP_Sitemaps_Registry::get_provider()` from triggering a fatal error in more recent versions of PHP.

The errors can be triggered by items outside the site owner or developers control (such as a user visiting `?sitemap[foo]=bar`) so the code fails silently to avoid filling error logs with unfixable errors.

Props costdev, dd32.
Fixes #56336.


git-svn-id: https://develop.svn.wordpress.org/trunk@53838 602fd350-edb4-49c9-b593-d223f7449a82
2022-08-05 05:47:56 +00:00

71 lines
2.1 KiB
PHP

<?php
/**
* @group sitemaps
*/
class Tests_Sitemaps_wpSitemapsRegistry extends WP_UnitTestCase {
public function test_add_provider() {
$provider = new WP_Sitemaps_Test_Provider();
$registry = new WP_Sitemaps_Registry();
$actual = $registry->add_provider( 'foo', $provider );
$providers = $registry->get_providers();
$this->assertTrue( $actual );
$this->assertCount( 1, $providers );
$this->assertSame( $providers['foo'], $provider, 'Can not confirm sitemap registration is working.' );
}
public function test_add_provider_prevent_duplicates() {
$provider1 = new WP_Sitemaps_Test_Provider();
$provider2 = new WP_Sitemaps_Test_Provider();
$registry = new WP_Sitemaps_Registry();
$actual1 = $registry->add_provider( 'foo', $provider1 );
$actual2 = $registry->add_provider( 'foo', $provider2 );
$providers = $registry->get_providers();
$this->assertTrue( $actual1 );
$this->assertFalse( $actual2 );
$this->assertCount( 1, $providers );
$this->assertSame( $providers['foo'], $provider1, 'Can not confirm sitemap registration is working.' );
}
/**
* Tests that `WP_Sitemaps_Registry::get_provider()` returns `null` when
* the `$name` argument is not a string.
*
* @ticket 56336
*
* @covers WP_Sitemaps_Registry::get_provider
*
* @dataProvider data_get_provider_should_return_null_with_non_string_name
*
* @param mixed $name The non-string name.
*/
public function test_get_provider_should_return_null_with_non_string_name( $name ) {
$registry = new WP_Sitemaps_Registry();
$this->assertNull( $registry->get_provider( $name ) );
}
/**
* Data provider with non-string values.
*
* @return array
*/
public function data_get_provider_should_return_null_with_non_string_name() {
return array(
'array' => array( array() ),
'object' => array( new stdClass() ),
'bool (true)' => array( true ),
'bool (false)' => array( false ),
'null' => array( null ),
'integer (0)' => array( 0 ),
'integer (1)' => array( 1 ),
'float (0.0)' => array( 0.0 ),
'float (1.1)' => array( 1.1 ),
);
}
}