Implement unit tests which use reflection to test functions in pluggable.php. This means any changes to these functions will need explicit changes to their corresponding tests, which helps prevent unintentional breakage.

Fixes #33867


git-svn-id: https://develop.svn.wordpress.org/trunk@34126 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
John Blackbourn 2015-09-14 19:14:38 +00:00
parent 974517d2bc
commit 0c38f660e1
1 changed files with 142 additions and 0 deletions

View File

@ -0,0 +1,142 @@
<?php
/**
* @group pluggable
*/
class Tests_Pluggable extends WP_UnitTestCase {
/**
* Tests that the signatures of all functions in pluggable.php match their expected signature.
*
* @ticket 33654
* @ticket 33867
*
* @dataProvider getDefinedPluggableFunctions
*/
public function testPluggableFunctionSignaturesMatch( $function ) {
$signatures = $this->getPluggableFunctionSignatures();
$this->assertTrue( function_exists( $function ) );
$this->assertArrayHasKey( $function, $signatures );
$function_ref = new ReflectionFunction( $function );
$param_refs = $function_ref->getParameters();
$this->assertSame( count( $signatures[ $function ] ), count( $param_refs ) );
$i = 0;
foreach ( $signatures[ $function ] as $name => $value ) {
$param_ref = $param_refs[ $i ];
$msg = 'Parameter: ' . $param_ref->getName();
if ( is_numeric( $name ) ) {
$name = $value;
$this->assertFalse( $param_ref->isOptional(), $msg );
} else {
$this->assertTrue( $param_ref->isOptional(), $msg );
$this->assertSame( $value, $param_ref->getDefaultValue(), $msg );
}
$this->assertSame( $name, $param_ref->getName(), $msg );
$i++;
}
}
/**
* Test the tests. Makes sure all the expected pluggable functions exist and that they live in pluggable.php.
*
* @ticket 33654
* @ticket 33867
*/
public function testAllPluggableFunctionsExist() {
$defined = wp_list_pluck( $this->getDefinedPluggableFunctions(), 0 );
$expected = $this->getPluggableFunctionSignatures();
foreach ( $expected as $function => $sig ) {
$msg = 'Function: ' . $function . '()';
$this->assertTrue( function_exists( $function ), $msg );
$this->assertTrue( in_array( $function, $defined, true ), $msg );
}
}
/**
* Data provider for our pluggable function signature tests.
*
* @return array Data provider array of pluggable function names.
*/
public function getDefinedPluggableFunctions() {
preg_match_all( '#^function (\w+)#m', file_get_contents( ABSPATH . '/wp-includes/pluggable.php' ), $functions );
$data = array();
foreach ( $functions[1] as $function ) {
$data[] = array(
$function,
);
}
return $data;
}
/**
* Expected pluggable function signatures.
*
* @return array Array of signatures keyed by their function name.
*/
public function getPluggableFunctionSignatures() {
return array(
'wp_set_current_user' => array( 'id', 'name' => '' ),
'wp_get_current_user' => array(),
'get_currentuserinfo' => array(),
'get_userdata' => array( 'user_id' ),
'get_user_by' => array( 'field', 'value' ),
'cache_users' => array( 'user_ids' ),
'wp_mail' => array( 'to', 'subject', 'message', 'headers' => '', 'attachments' => array() ),
'wp_authenticate' => array( 'username', 'password' ),
'wp_logout' => array(),
'wp_validate_auth_cookie' => array( 'cookie' => '', 'scheme' => '' ),
'wp_generate_auth_cookie' => array( 'user_id', 'expiration', 'scheme' => 'auth', 'token' => '' ),
'wp_parse_auth_cookie' => array( 'cookie' => '', 'scheme' => '' ),
'wp_set_auth_cookie' => array( 'user_id', 'remember' => false, 'secure' => '', 'token' => '' ),
'wp_clear_auth_cookie' => array(),
'is_user_logged_in' => array(),
'auth_redirect' => array(),
'check_admin_referer' => array( 'action' => -1, 'query_arg' => '_wpnonce' ),
'check_ajax_referer' => array( 'action' => -1, 'query_arg' => false, 'die' => true ),
'wp_redirect' => array( 'location', 'status' => 302 ),
'wp_sanitize_redirect' => array( 'location' ),
'_wp_sanitize_utf8_in_redirect' => array( 'matches' ),
'wp_safe_redirect' => array( 'location', 'status' => 302 ),
'wp_validate_redirect' => array( 'location', 'default' => '' ),
'wp_notify_postauthor' => array( 'comment_id', 'deprecated' => null ),
'wp_notify_moderator' => array( 'comment_id' ),
'wp_password_change_notification' => array( 'user' ),
'wp_new_user_notification' => array( 'user_id', 'deprecated' => null, 'notify' => '' ),
'wp_nonce_tick' => array(),
'wp_verify_nonce' => array( 'nonce', 'action' => -1 ),
'wp_create_nonce' => array( 'action' => -1 ),
'wp_salt' => array( 'scheme' => 'auth' ),
'wp_hash' => array( 'data', 'scheme' => 'auth' ),
'wp_hash_password' => array( 'password' ),
'wp_check_password' => array( 'password', 'hash', 'user_id' => '' ),
'wp_generate_password' => array( 'length' => 12, 'special_chars' => true, 'extra_special_chars' => false ),
'wp_rand' => array( 'min' => 0, 'max' => 0 ),
'wp_set_password' => array( 'password', 'user_id' ),
'get_avatar' => array( 'id_or_email', 'size' => 96, 'default' => '', 'alt' => '', 'args' => null ),
'wp_text_diff' => array( 'left_string', 'right_string', 'args' => null ),
);
}
}