From 0c38f660e1d67979db3d55ab5becbc5b321ce6d5 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Mon, 14 Sep 2015 19:14:38 +0000 Subject: [PATCH] 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 --- tests/phpunit/tests/pluggable.php | 142 ++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 tests/phpunit/tests/pluggable.php diff --git a/tests/phpunit/tests/pluggable.php b/tests/phpunit/tests/pluggable.php new file mode 100644 index 0000000000..464638d761 --- /dev/null +++ b/tests/phpunit/tests/pluggable.php @@ -0,0 +1,142 @@ +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 ), + ); + + } + +}