Wordpress/tests/phpunit/tests/adminbar.php
Sergey Biryukov e72fff9cef Code Modernization: Replace dirname( __FILE__ ) calls with __DIR__ magic constant.
This avoids the performance overhead of the function call every time `dirname( __FILE__ )` was used instead of `__DIR__`.

This commit also includes:

* Removing unnecessary parentheses from `include`/`require` statements. These are language constructs, not function calls.
* Replacing `include` statements for several files with `require_once`, for consistency:
 * `wp-admin/admin-header.php`
 * `wp-admin/admin-footer.php`
 * `wp-includes/version.php`

Props ayeshrajans, desrosj, valentinbora, jrf, joostdevalk, netweb.
Fixes #48082.

git-svn-id: https://develop.svn.wordpress.org/trunk@47198 602fd350-edb4-49c9-b593-d223f7449a82
2020-02-06 06:31:22 +00:00

768 lines
21 KiB
PHP

<?php
/**
* @group admin-bar
* @group toolbar
* @group admin
*/
class Tests_AdminBar extends WP_UnitTestCase {
protected static $editor_id;
protected static $admin_id;
protected static $no_role_id;
protected static $post_id;
protected static $blog_id;
protected static $user_ids = array();
public static function setUpBeforeClass() {
require_once ABSPATH . WPINC . '/class-wp-admin-bar.php';
parent::setUpBeforeClass();
}
public static function wpSetUpBeforeClass( $factory ) {
self::$editor_id = $factory->user->create( array( 'role' => 'editor' ) );
self::$user_ids[] = self::$editor_id;
self::$admin_id = $factory->user->create( array( 'role' => 'administrator' ) );
self::$user_ids[] = self::$admin_id;
self::$no_role_id = $factory->user->create( array( 'role' => '' ) );
self::$user_ids[] = self::$no_role_id;
}
/**
* @ticket 21117
*/
function test_content_post_type() {
wp_set_current_user( self::$editor_id );
register_post_type( 'content', array( 'show_in_admin_bar' => true ) );
$admin_bar = new WP_Admin_Bar;
wp_admin_bar_new_content_menu( $admin_bar );
$nodes = $admin_bar->get_nodes();
$this->assertFalse( $nodes['new-content']->parent );
$this->assertEquals( 'new-content', $nodes['add-new-content']->parent );
_unregister_post_type( 'content' );
}
/**
* @ticket 21117
*/
function test_merging_existing_meta_values() {
wp_set_current_user( self::$editor_id );
$admin_bar = new WP_Admin_Bar;
$admin_bar->add_node(
array(
'id' => 'test-node',
'meta' => array( 'class' => 'test-class' ),
)
);
$node1 = $admin_bar->get_node( 'test-node' );
$this->assertEquals( array( 'class' => 'test-class' ), $node1->meta );
$admin_bar->add_node(
array(
'id' => 'test-node',
'meta' => array( 'some-meta' => 'value' ),
)
);
$node2 = $admin_bar->get_node( 'test-node' );
$this->assertEquals(
array(
'class' => 'test-class',
'some-meta' => 'value',
),
$node2->meta
);
}
/**
* @ticket 25162
* @group ms-excluded
*/
public function test_admin_bar_contains_correct_links_for_users_with_no_role() {
$this->assertFalse( user_can( self::$no_role_id, 'read' ) );
wp_set_current_user( self::$no_role_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
$node_my_account = $wp_admin_bar->get_node( 'my-account' );
$node_user_info = $wp_admin_bar->get_node( 'user-info' );
$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
// Site menu points to the home page instead of the admin URL.
$this->assertEquals( home_url( '/' ), $node_site_name->href );
// No profile links as the user doesn't have any permissions on the site.
$this->assertFalse( $node_my_account->href );
$this->assertFalse( $node_user_info->href );
$this->assertNull( $node_edit_profile );
}
/**
* @ticket 25162
* @group ms-excluded
*/
public function test_admin_bar_contains_correct_links_for_users_with_role() {
$this->assertTrue( user_can( self::$editor_id, 'read' ) );
wp_set_current_user( self::$editor_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
$node_my_account = $wp_admin_bar->get_node( 'my-account' );
$node_user_info = $wp_admin_bar->get_node( 'user-info' );
$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
// Site menu points to the admin URL.
$this->assertEquals( admin_url( '/' ), $node_site_name->href );
$profile_url = admin_url( 'profile.php' );
// Profile URLs point to profile.php.
$this->assertEquals( $profile_url, $node_my_account->href );
$this->assertEquals( $profile_url, $node_user_info->href );
$this->assertEquals( $profile_url, $node_edit_profile->href );
}
/**
* @ticket 25162
* @group multisite
* @group ms-required
*/
public function test_admin_bar_contains_correct_links_for_users_with_no_role_on_blog() {
$blog_id = self::factory()->blog->create(
array(
'user_id' => self::$admin_id,
)
);
$this->assertTrue( user_can( self::$admin_id, 'read' ) );
$this->assertTrue( user_can( self::$editor_id, 'read' ) );
$this->assertTrue( is_user_member_of_blog( self::$admin_id, $blog_id ) );
$this->assertFalse( is_user_member_of_blog( self::$editor_id, $blog_id ) );
wp_set_current_user( self::$editor_id );
switch_to_blog( $blog_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
$node_my_account = $wp_admin_bar->get_node( 'my-account' );
$node_user_info = $wp_admin_bar->get_node( 'user-info' );
$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
// Get primary blog.
$primary = get_active_blog_for_user( self::$editor_id );
$this->assertInternalType( 'object', $primary );
// No Site menu as the user isn't a member of this blog.
$this->assertNull( $node_site_name );
$primary_profile_url = get_admin_url( $primary->blog_id, 'profile.php' );
// Ensure the user's primary blog is not the same as the main site.
$this->assertNotEquals( $primary_profile_url, admin_url( 'profile.php' ) );
// Profile URLs should go to the user's primary blog.
$this->assertEquals( $primary_profile_url, $node_my_account->href );
$this->assertEquals( $primary_profile_url, $node_user_info->href );
$this->assertEquals( $primary_profile_url, $node_edit_profile->href );
restore_current_blog();
}
/**
* @ticket 25162
* @group multisite
* @group ms-required
*/
public function test_admin_bar_contains_correct_links_for_users_with_no_role_on_network() {
$this->assertTrue( user_can( self::$admin_id, 'read' ) );
$this->assertFalse( user_can( self::$no_role_id, 'read' ) );
$blog_id = self::factory()->blog->create(
array(
'user_id' => self::$admin_id,
)
);
$this->assertTrue( is_user_member_of_blog( self::$admin_id, $blog_id ) );
$this->assertFalse( is_user_member_of_blog( self::$no_role_id, $blog_id ) );
$this->assertTrue( is_user_member_of_blog( self::$no_role_id, get_current_blog_id() ) );
// Remove `$nobody` from the current blog, so they're not a member of any blog.
$removed = remove_user_from_blog( self::$no_role_id, get_current_blog_id() );
$this->assertTrue( $removed );
$this->assertFalse( is_user_member_of_blog( self::$no_role_id, get_current_blog_id() ) );
wp_set_current_user( self::$no_role_id );
switch_to_blog( $blog_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
$node_my_account = $wp_admin_bar->get_node( 'my-account' );
$node_user_info = $wp_admin_bar->get_node( 'user-info' );
$node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
// Get primary blog.
$primary = get_active_blog_for_user( self::$no_role_id );
$this->assertNull( $primary );
// No Site menu as the user isn't a member of this site.
$this->assertNull( $node_site_name );
$user_profile_url = user_admin_url( 'profile.php' );
$this->assertNotEquals( $user_profile_url, admin_url( 'profile.php' ) );
// Profile URLs should go to the user's primary blog.
$this->assertEquals( $user_profile_url, $node_my_account->href );
$this->assertEquals( $user_profile_url, $node_user_info->href );
$this->assertEquals( $user_profile_url, $node_edit_profile->href );
restore_current_blog();
}
protected function get_standard_admin_bar() {
global $wp_admin_bar;
_wp_admin_bar_init();
$this->assertTrue( is_admin_bar_showing() );
$this->assertInstanceOf( 'WP_Admin_Bar', $wp_admin_bar );
do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) );
return $wp_admin_bar;
}
/**
* @ticket 32495
*
* @dataProvider data_admin_bar_nodes_with_tabindex_meta
*
* @param array $node_data The data for a node, passed to `WP_Admin_Bar::add_node()`.
* @param string $expected_html The expected HTML when admin menu is rendered.
*/
public function test_admin_bar_with_tabindex_meta( $node_data, $expected_html ) {
$admin_bar = new WP_Admin_Bar();
$admin_bar->add_node( $node_data );
$admin_bar_html = get_echo( array( $admin_bar, 'render' ) );
$this->assertContains( $expected_html, $admin_bar_html );
}
/**
* Data provider for test_admin_bar_with_tabindex_meta().
*
* @return array {
* @type array {
* @type array $node_data The data for a node, passed to `WP_Admin_Bar::add_node()`.
* @type string $expected_html The expected HTML when admin bar is rendered.
* }
* }
*/
public function data_admin_bar_nodes_with_tabindex_meta() {
return array(
array(
// No tabindex.
array(
'id' => 'test-node',
),
'<div class="ab-item ab-empty-item">',
),
array(
// Empty string.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => '' ),
),
'<div class="ab-item ab-empty-item">',
),
array(
// Integer 1 as string.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => '1' ),
),
'<div class="ab-item ab-empty-item" tabindex="1">',
),
array(
// Integer -1 as string.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => '-1' ),
),
'<div class="ab-item ab-empty-item" tabindex="-1">',
),
array(
// Integer 0 as string.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => '0' ),
),
'<div class="ab-item ab-empty-item" tabindex="0">',
),
array(
// Integer, 0.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => 0 ),
),
'<div class="ab-item ab-empty-item" tabindex="0">',
),
array(
// Integer, 2.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => 2 ),
),
'<div class="ab-item ab-empty-item" tabindex="2">',
),
array(
// Boolean, false.
array(
'id' => 'test-node',
'meta' => array( 'tabindex' => false ),
),
'<div class="ab-item ab-empty-item">',
),
);
}
/**
* @ticket 22247
*/
public function test_admin_bar_has_edit_link_for_existing_posts() {
wp_set_current_user( self::$editor_id );
$post = array(
'post_author' => self::$editor_id,
'post_status' => 'publish',
'post_content' => 'Post Content',
'post_title' => 'Post Title',
);
$id = wp_insert_post( $post );
// Set queried object to the newly created post.
global $wp_the_query;
$wp_the_query->queried_object = (object) array(
'ID' => $id,
'post_type' => 'post',
);
$wp_admin_bar = $this->get_standard_admin_bar();
$node_edit = $wp_admin_bar->get_node( 'edit' );
$this->assertNotNull( $node_edit );
}
/**
* @ticket 22247
*/
public function test_admin_bar_has_no_edit_link_for_non_existing_posts() {
wp_set_current_user( self::$editor_id );
// Set queried object to a non-existing post.
global $wp_the_query;
$wp_the_query->queried_object = (object) array(
'ID' => 0,
'post_type' => 'post',
);
$wp_admin_bar = $this->get_standard_admin_bar();
$node_edit = $wp_admin_bar->get_node( 'edit' );
$this->assertNull( $node_edit );
}
/**
* @ticket 34113
*/
public function test_admin_bar_has_no_archives_link_if_no_static_front_page() {
set_current_screen( 'edit-post' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'archive' );
set_current_screen( 'front' );
$this->assertNull( $node );
}
/**
* @ticket 34113
*/
public function test_admin_bar_contains_view_archive_link_if_static_front_page() {
update_option( 'show_on_front', 'page' );
set_current_screen( 'edit-post' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'archive' );
set_current_screen( 'front' );
$this->assertNotNull( $node );
}
/**
* @ticket 34113
*/
public function test_admin_bar_has_no_archives_link_for_pages() {
set_current_screen( 'edit-page' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'archive' );
set_current_screen( 'front' );
$this->assertNull( $node );
}
/**
* @ticket 37949
* @group ms-excluded
*/
public function test_admin_bar_contains_correct_about_link_for_users_with_role() {
wp_set_current_user( self::$editor_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$wp_logo_node = $wp_admin_bar->get_node( 'wp-logo' );
$about_node = $wp_admin_bar->get_node( 'about' );
$this->assertNotNull( $wp_logo_node );
$this->assertSame( admin_url( 'about.php' ), $wp_logo_node->href );
$this->assertArrayNotHasKey( 'tabindex', $wp_logo_node->meta );
$this->assertNotNull( $about_node );
}
/**
* @ticket 37949
* @group ms-excluded
*/
public function test_admin_bar_contains_correct_about_link_for_users_with_no_role() {
wp_set_current_user( self::$no_role_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$wp_logo_node = $wp_admin_bar->get_node( 'wp-logo' );
$about_node = $wp_admin_bar->get_node( 'about' );
$this->assertNotNull( $wp_logo_node );
$this->assertSame( false, $wp_logo_node->href );
$this->assertArrayHasKey( 'tabindex', $wp_logo_node->meta );
$this->assertSame( 0, $wp_logo_node->meta['tabindex'] );
$this->assertNull( $about_node );
}
/**
* @ticket 37949
* @group multisite
* @group ms-required
*/
public function test_admin_bar_contains_correct_about_link_for_users_with_no_role_in_multisite() {
// User is not a member of a site.
remove_user_from_blog( self::$no_role_id, get_current_blog_id() );
wp_set_current_user( self::$no_role_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$wp_logo_node = $wp_admin_bar->get_node( 'wp-logo' );
$about_node = $wp_admin_bar->get_node( 'about' );
$this->assertNotNull( $wp_logo_node );
$this->assertSame( user_admin_url( 'about.php' ), $wp_logo_node->href );
$this->assertArrayNotHasKey( 'tabindex', $wp_logo_node->meta );
$this->assertNotNull( $about_node );
}
/**
* @ticket 34113
*/
public function test_admin_bar_has_no_archives_link_for_non_public_cpt() {
register_post_type(
'foo-non-public',
array(
'public' => false,
'has_archive' => true,
'show_in_admin_bar' => true,
)
);
set_current_screen( 'edit-foo-non-public' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'archive' );
set_current_screen( 'front' );
unregister_post_type( 'foo-non-public' );
$this->assertNull( $node );
}
/**
* @ticket 34113
*/
public function test_admin_bar_has_no_archives_link_for_cpt_without_archive() {
register_post_type(
'foo-non-public',
array(
'public' => true,
'has_archive' => false,
'show_in_admin_bar' => true,
)
);
set_current_screen( 'edit-foo-non-public' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'archive' );
set_current_screen( 'front' );
unregister_post_type( 'foo-non-public' );
$this->assertNull( $node );
}
/**
* @ticket 34113
*/
public function test_admin_bar_has_no_archives_link_for_cpt_not_shown_in_admin_bar() {
register_post_type(
'foo-non-public',
array(
'public' => true,
'has_archive' => true,
'show_in_admin_bar' => false,
)
);
set_current_screen( 'edit-foo-non-public' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'archive' );
set_current_screen( 'front' );
unregister_post_type( 'foo-non-public' );
$this->assertNull( $node );
}
public function map_meta_cap_grant_create_users( $caps, $cap ) {
if ( 'create_users' === $cap ) {
$caps = array( 'exist' );
}
return $caps;
}
public function map_meta_cap_deny_create_users( $caps, $cap ) {
if ( 'create_users' === $cap ) {
$caps = array( 'do_not_allow' );
}
return $caps;
}
public function map_meta_cap_grant_promote_users( $caps, $cap ) {
if ( 'promote_users' === $cap ) {
$caps = array( 'exist' );
}
return $caps;
}
public function map_meta_cap_deny_promote_users( $caps, $cap ) {
if ( 'promote_users' === $cap ) {
$caps = array( 'do_not_allow' );
}
return $caps;
}
/**
* @ticket 39252
*/
public function test_new_user_link_exists_for_user_with_create_users() {
wp_set_current_user( self::$admin_id );
add_filter( 'map_meta_cap', array( $this, 'map_meta_cap_grant_create_users' ), 10, 2 );
add_filter( 'map_meta_cap', array( $this, 'map_meta_cap_deny_promote_users' ), 10, 2 );
$this->assertTrue( current_user_can( 'create_users' ) );
$this->assertFalse( current_user_can( 'promote_users' ) );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'new-user' );
// 'create_users' is sufficient in single- and multisite.
$this->assertNotEmpty( $node );
}
/**
* @ticket 39252
*/
public function test_new_user_link_existence_for_user_with_promote_users() {
wp_set_current_user( self::$admin_id );
add_filter( 'map_meta_cap', array( $this, 'map_meta_cap_deny_create_users' ), 10, 2 );
add_filter( 'map_meta_cap', array( $this, 'map_meta_cap_grant_promote_users' ), 10, 2 );
$this->assertFalse( current_user_can( 'create_users' ) );
$this->assertTrue( current_user_can( 'promote_users' ) );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'new-user' );
if ( is_multisite() ) {
$this->assertNotEmpty( $node );
} else {
// 'promote_users' is insufficient in single-site.
$this->assertNull( $node );
}
}
/**
* @ticket 39252
*/
public function test_new_user_link_does_not_exist_for_user_without_create_or_promote_users() {
wp_set_current_user( self::$admin_id );
add_filter( 'map_meta_cap', array( $this, 'map_meta_cap_deny_create_users' ), 10, 2 );
add_filter( 'map_meta_cap', array( $this, 'map_meta_cap_deny_promote_users' ), 10, 2 );
$this->assertFalse( current_user_can( 'create_users' ) );
$this->assertFalse( current_user_can( 'promote_users' ) );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'new-user' );
$this->assertNull( $node );
}
/**
* @ticket 30937
* @covers ::wp_admin_bar_customize_menu
*/
public function test_customize_link() {
global $wp_customize;
require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
$uuid = wp_generate_uuid4();
$this->go_to( home_url( "/?customize_changeset_uuid=$uuid" ) );
wp_set_current_user( self::$admin_id );
$this->factory()->post->create(
array(
'post_type' => 'customize_changeset',
'post_status' => 'auto-draft',
'post_name' => $uuid,
)
);
$wp_customize = new WP_Customize_Manager(
array(
'changeset_uuid' => $uuid,
)
);
$wp_customize->start_previewing_theme();
set_current_screen( 'front' );
$wp_admin_bar = $this->get_standard_admin_bar();
$node = $wp_admin_bar->get_node( 'customize' );
$this->assertNotEmpty( $node );
$parsed_url = wp_parse_url( $node->href );
$query_params = array();
wp_parse_str( $parsed_url['query'], $query_params );
$this->assertEquals( $uuid, $query_params['changeset_uuid'] );
$this->assertNotContains( 'changeset_uuid', $query_params['url'] );
}
/**
* @ticket 39082
* @group ms-required
*/
public function test_my_sites_network_menu_for_regular_user() {
wp_set_current_user( self::$editor_id );
$wp_admin_bar = $this->get_standard_admin_bar();
$nodes = $wp_admin_bar->get_nodes();
foreach ( $this->get_my_sites_network_menu_items() as $id => $cap ) {
$this->assertFalse( isset( $nodes[ $id ] ), sprintf( 'Menu item %s must not display for a regular user.', $id ) );
}
}
/**
* @ticket 39082
* @group ms-required
*/
public function test_my_sites_network_menu_for_super_admin() {
wp_set_current_user( self::$editor_id );
grant_super_admin( self::$editor_id );
$wp_admin_bar = $this->get_standard_admin_bar();
revoke_super_admin( self::$editor_id );
$nodes = $wp_admin_bar->get_nodes();
foreach ( $this->get_my_sites_network_menu_items() as $id => $cap ) {
$this->assertTrue( isset( $nodes[ $id ] ), sprintf( 'Menu item %s must display for a super admin.', $id ) );
}
}
/**
* @ticket 39082
* @group ms-required
*/
public function test_my_sites_network_menu_for_regular_user_with_network_caps() {
global $current_user;
$network_user_caps = array( 'manage_network', 'manage_network_themes', 'manage_network_plugins' );
wp_set_current_user( self::$editor_id );
foreach ( $network_user_caps as $network_cap ) {
$current_user->add_cap( $network_cap );
}
$wp_admin_bar = $this->get_standard_admin_bar();
foreach ( $network_user_caps as $network_cap ) {
$current_user->remove_cap( $network_cap );
}
$nodes = $wp_admin_bar->get_nodes();
foreach ( $this->get_my_sites_network_menu_items() as $id => $cap ) {
if ( in_array( $cap, $network_user_caps, true ) ) {
$this->assertTrue( isset( $nodes[ $id ] ), sprintf( 'Menu item %1$s must display for a user with the %2$s cap.', $id, $cap ) );
} else {
$this->assertFalse( isset( $nodes[ $id ] ), sprintf( 'Menu item %1$s must not display for a user without the %2$s cap.', $id, $cap ) );
}
}
}
private function get_my_sites_network_menu_items() {
return array(
'my-sites-super-admin' => 'manage_network',
'network-admin' => 'manage_network',
'network-admin-d' => 'manage_network',
'network-admin-s' => 'manage_sites',
'network-admin-u' => 'manage_network_users',
'network-admin-t' => 'manage_network_themes',
'network-admin-p' => 'manage_network_plugins',
'network-admin-o' => 'manage_network_options',
);
}
}