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 ), + ); + + } + +}