e72fff9cef
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
768 lines
21 KiB
PHP
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',
|
|
);
|
|
}
|
|
}
|