Completed
Push — renovate/node-sass-5.x ( d43362...b9b7fb )
by
unknown
150:26 queued 139:03
created

Test_Admin_Menu::test_add_plugins_menu()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 24
rs 9.536
c 0
b 0
f 0
1
<?php
2
/**
3
 * Tests for Admin_Menu class.
4
 *
5
 * @package automattic/jetpack
6
 */
7
8
use Automattic\Jetpack\Dashboard_Customizations\Admin_Menu;
9
use Automattic\Jetpack\Redirect;
10
use Automattic\Jetpack\Status;
11
12
require_jetpack_file( 'modules/masterbar/admin-menu/class-admin-menu.php' );
13
require_jetpack_file( 'tests/php/modules/masterbar/data/admin-menu.php' );
14
15
/**
16
 * Class Test_Admin_Menu
17
 *
18
 * @coversDefaultClass Automattic\Jetpack\Dashboard_Customizations\Admin_Menu
19
 */
20
class Test_Admin_Menu extends WP_UnitTestCase {
21
22
	/**
23
	 * Menu data fixture.
24
	 *
25
	 * @var array
26
	 */
27
	public static $menu_data;
28
29
	/**
30
	 * Submenu data fixture.
31
	 *
32
	 * @var array
33
	 */
34
	public static $submenu_data;
35
36
	/**
37
	 * Test domain.
38
	 *
39
	 * @var string
40
	 */
41
	public static $domain;
42
43
	/**
44
	 * Admin menu instance.
45
	 *
46
	 * @var Admin_Menu
47
	 */
48
	public static $admin_menu;
49
50
	/**
51
	 * Mock user ID.
52
	 *
53
	 * @var int
54
	 */
55
	private static $user_id = 0;
56
57
	/**
58
	 * Create shared fixtures.
59
	 *
60
	 * @param WP_UnitTest_Factory $factory Fixture factory.
61
	 */
62 View Code Duplication
	public static function wpSetUpBeforeClass( $factory ) {
63
		static::$domain       = ( new Status() )->get_site_suffix();
64
		static::$user_id      = $factory->user->create( array( 'role' => 'administrator' ) );
0 ignored issues
show
Bug introduced by
Since $user_id is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $user_id to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
65
		static::$menu_data    = get_menu_fixture();
66
		static::$submenu_data = get_submenu_fixture();
67
	}
68
69
	/**
70
	 * Set up data.
71
	 */
72 View Code Duplication
	public function setUp() {
73
		parent::setUp();
74
		global $menu, $submenu;
75
76
		// Initialize in setUp so it registers hooks for every test.
77
		static::$admin_menu = Admin_Menu::get_instance();
78
79
		$menu    = static::$menu_data;
80
		$submenu = static::$submenu_data;
81
82
		wp_set_current_user( static::$user_id );
0 ignored issues
show
Bug introduced by
Since $user_id is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $user_id to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
83
	}
84
85
	/**
86
	 * Test get_instance.
87
	 *
88
	 * @covers ::get_instance
89
	 * @covers ::__construct
90
	 */
91 View Code Duplication
	public function test_get_instance() {
92
		$instance = Admin_Menu::get_instance();
93
94
		$this->assertInstanceOf( Admin_Menu::class, $instance );
95
		$this->assertSame( $instance, static::$admin_menu );
96
97
		$this->assertSame( 99999, has_action( 'admin_menu', array( $instance, 'reregister_menu_items' ) ) );
98
		$this->assertSame( 10, has_action( 'admin_enqueue_scripts', array( $instance, 'enqueue_scripts' ) ) );
99
	}
100
101
	/**
102
	 * Tests add_admin_menu_separator
103
	 *
104
	 * @covers ::add_admin_menu_separator
105
	 */
106
	public function test_add_admin_menu_separator() {
107
		global $menu;
108
109
		// Start with a clean slate.
110
		$temp_menu = $menu;
111
		$menu      = array();
112
113
		static::$admin_menu->add_admin_menu_separator( 15 );
114
		static::$admin_menu->add_admin_menu_separator( 10, 'manage_options' );
115
116
		$this->assertSame( array( 10, 15 ), array_keys( $menu ), 'Menu should be ordered by position parameter.' );
117
		$this->assertSame( 'manage_options', $menu[10][1] );
118
		$this->assertContains( 'separator-custom-', $menu[10][2] );
119
		$this->assertSame( 'read', $menu[15][1] );
120
		$this->assertContains( 'separator-custom-', $menu[15][2] );
121
122
		// Restore filtered $menu.
123
		$menu = $temp_menu;
124
	}
125
126
	/**
127
	 * Test_Admin_Menu.
128
	 *
129
	 * @covers ::reregister_menu_items
130
	 */
131
	public function test_admin_menu_output() {
132
		global $menu, $submenu;
133
134
		static::$admin_menu->reregister_menu_items();
135
136
		$this->assertSame(
137
			array_keys( $menu ),
138
			array( 2, '3.86682', 4, 5, 10, 15, 20, 25, 50, 51, 59, 60, 65, 70, 75, 80 ),
139
			'Admin menu should not have unexpected top menu items.'
140
		);
141
142
		$this->assertEquals( static::$submenu_data[''], $submenu[''], 'Submenu items without parent should stay the same.' );
143
	}
144
145
	/**
146
	 * Shim wpcomsh fallback site icon.
147
	 *
148
	 * @return string
149
	 */
150
	public function wpcomsh_site_icon_url() {
151
		return 'https://s0.wp.com/i/webclip.png';
152
	}
153
154
	/**
155
	 * Custom site icon.
156
	 *
157
	 * @return string
158
	 */
159
	public function custom_site_icon_url() {
160
		return 'https://s0.wp.com/i/jetpack.png';
161
	}
162
163
	/**
164
	 * Tests add_my_home_menu
165
	 *
166
	 * @covers ::add_my_home_menu
167
	 */
168
	public function test_add_my_home_menu() {
169
		global $menu, $submenu;
170
171
		static::$admin_menu->add_my_home_menu( false );
172
173
		$slug = 'https://wordpress.com/home/' . static::$domain;
174
175
		$my_home_menu_item = array(
176
			'My Home',
177
			'manage_options',
178
			$slug,
179
			'My Home',
180
			'menu-top toplevel_page_' . $slug,
181
			'toplevel_page_' . $slug,
182
			'dashicons-admin-home',
183
		);
184
		$this->assertSame( $menu[2], $my_home_menu_item );
185
186
		// Has My Home submenu item when there are other submenu items.
187
		$my_home_submenu_item = array(
188
			'My Home',
189
			'manage_options',
190
			$slug,
191
			'My Home',
192
		);
193
		$this->assertContains( $my_home_submenu_item, $submenu[ $slug ] );
194
		// Reset data.
195
		$menu    = static::$menu_data;
196
		$submenu = static::$submenu_data;
197
198
		// Has no ny Home submenu when there are no other submenus.
199
		$submenu['index.php'] = array(
200
			0 => array( 'Home', 'read', 'index.php' ),
201
		);
202
203
		static::$admin_menu->add_my_home_menu( false );
204
205
		$this->assertArrayNotHasKey( 'https://wordpress.com/home/' . static::$domain, $submenu );
206
	}
207
208
	/**
209
	 * Tests add_stats_menu
210
	 *
211
	 * @covers ::add_stats_menu
212
	 */
213
	public function test_add_stats_menu() {
214
		global $menu, $submenu;
215
216
		static::$admin_menu->add_stats_menu();
217
218
		$menu_title = __( 'Stats', 'jetpack' );
219
220
		if ( ! defined( 'TESTING_IN_JETPACK' ) || ! TESTING_IN_JETPACK ) {
221
			$menu_title .= sprintf(
222
				'<img class="sidebar-unified__sparkline" width="80" height="20" src="%1$s" alt="%2$s">',
223
				esc_url( home_url( 'wp-includes/charts/admin-bar-hours-scale-2x.php?masterbar=1&s=' . get_current_blog_id() ) ),
224
				esc_attr__( 'Hourly views', 'jetpack' )
225
			);
226
		}
227
		$stats_menu_item = array(
228
			$menu_title,
229
			'view_stats',
230
			'https://wordpress.com/stats/day/' . static::$domain,
231
			'Stats',
232
			'menu-top toplevel_page_https://wordpress.com/stats/day/' . static::$domain,
233
			'toplevel_page_https://wordpress.com/stats/day/' . static::$domain,
234
			'dashicons-chart-bar',
235
		);
236
237
		$this->assertSame( $menu['3.86682'], $stats_menu_item );
238
		$this->assertArrayNotHasKey( 'https://wordpress.com/stats/day/' . static::$domain, $submenu );
239
	}
240
241
	/**
242
	 * Tests add_upgrades_menu
243
	 *
244
	 * @covers ::add_upgrades_menu
245
	 */
246
	public function test_add_wpcom_upgrades_menu() {
247
		global $menu, $submenu;
248
249
		static::$admin_menu->add_upgrades_menu();
250
251
		$slug = 'https://wordpress.com/plans/' . static::$domain;
252
253
		$upgrades_menu_item = array(
254
			'Upgrades',
255
			'manage_options',
256
			$slug,
257
			'Upgrades',
258
			'menu-top toplevel_page_https://wordpress.com/plans/' . static::$domain,
259
			'toplevel_page_https://wordpress.com/plans/' . static::$domain,
260
			'dashicons-cart',
261
		);
262
		$this->assertSame( $menu['4.80608'], $upgrades_menu_item );
263
264
		$plans_submenu_item = array(
265
			'Plans',
266
			'manage_options',
267
			$slug,
268
			'Plans',
269
		);
270
		$this->assertContains( $plans_submenu_item, $submenu[ $slug ] );
271
272
		$purchases_submenu_item = array(
273
			'Purchases',
274
			'manage_options',
275
			'https://wordpress.com/purchases/subscriptions/' . static::$domain,
276
			'Purchases',
277
		);
278
		$this->assertContains( $purchases_submenu_item, $submenu[ $slug ] );
279
	}
280
281
	/**
282
	 * Tests add_jetpack_upgrades_menu
283
	 *
284
	 * @covers ::add_jetpack_upgrades_menu
285
	 */
286 View Code Duplication
	public function test_add_jetpack_upgrades_menu() {
287
		global $menu, $submenu;
288
289
		static::$admin_menu->add_upgrades_menu();
290
291
		$slug = 'https://wordpress.com/plans/' . static::$domain;
292
293
		$upgrades_menu_item = array(
294
			'Upgrades',
295
			'manage_options',
296
			$slug,
297
			'Upgrades',
298
			'menu-top toplevel_page_https://wordpress.com/plans/' . static::$domain,
299
			'toplevel_page_https://wordpress.com/plans/' . static::$domain,
300
			'dashicons-cart',
301
		);
302
		$this->assertSame( $menu['4.80608'], $upgrades_menu_item );
303
		$this->assertArrayNotHasKey( 'https://wordpress.com/domains/manage/' . static::$domain, $submenu );
304
	}
305
306
	/**
307
	 * Tests add_posts_menu
308
	 *
309
	 * @covers ::add_posts_menu
310
	 */
311 View Code Duplication
	public function test_add_posts_menu() {
312
		global $menu, $submenu;
313
314
		static::$admin_menu->add_posts_menu( false );
315
316
		$posts_menu_item = array(
317
			'Posts',
318
			'edit_posts',
319
			'https://wordpress.com/posts/' . static::$domain,
320
			'Posts',
321
			'menu-top toplevel_page_https://wordpress.com/posts/' . static::$domain,
322
			'toplevel_page_https://wordpress.com/posts/' . static::$domain,
323
			'dashicons-admin-post',
324
		);
325
326
		$this->assertSame( $menu[5], $posts_menu_item );
327
		$this->assertArrayNotHasKey( 'edit.php', $submenu );
328
	}
329
330
	/**
331
	 * Tests add_media_menu
332
	 *
333
	 * @covers ::add_media_menu
334
	 */
335
	public function test_add_media_menu() {
336
		global $menu, $submenu;
337
338
		static::$admin_menu->add_media_menu( false );
339
340
		$slug = 'https://wordpress.com/media/' . static::$domain;
341
342
		$media_menu_item = array(
343
			'Media',
344
			'upload_files',
345
			$slug,
346
			'Media',
347
			'menu-top toplevel_page_' . $slug,
348
			'toplevel_page_' . $slug,
349
			'dashicons-admin-media',
350
		);
351
352
		$this->assertSame( $menu[10], $media_menu_item );
353
		$this->assertArrayNotHasKey( $slug, $submenu );
354
355
		$library_submenu_item = array(
356
			'Library',
357
			'upload_files',
358
			'upload.php',
359
		);
360
		$this->assertNotContains( $library_submenu_item, $submenu['upload.php'] );
361
362
		$add_new_submenu_item = array(
363
			'Add New',
364
			'upload_files',
365
			'media-new.php',
366
		);
367
		$this->assertNotContains( $add_new_submenu_item, $submenu['upload.php'] );
368
	}
369
370
	/**
371
	 * Tests add_page_menu
372
	 *
373
	 * @covers ::add_page_menu
374
	 */
375 View Code Duplication
	public function test_add_page_menu() {
376
		global $menu, $submenu;
377
378
		static::$admin_menu->add_page_menu( false );
379
380
		$posts_menu_item = array(
381
			'Pages',
382
			'edit_pages',
383
			'https://wordpress.com/pages/' . static::$domain,
384
			'Pages',
385
			'menu-top toplevel_page_https://wordpress.com/pages/' . static::$domain,
386
			'toplevel_page_https://wordpress.com/pages/' . static::$domain,
387
			'dashicons-admin-page',
388
		);
389
390
		$this->assertSame( $menu[20], $posts_menu_item );
391
		$this->assertEmpty( $submenu['edit.php?post_type=page'] );
392
	}
393
394
	/**
395
	 * Tests add_custom_post_type_menu
396
	 *
397
	 * @covers ::add_custom_post_type_menu
398
	 */
399
	public function test_add_custom_post_type_menu() {
400
		global $menu, $submenu;
401
402
		// Don't show post types that don't want to be shown.
403
		$revision = get_post_type_object( 'revision' );
404
		static::$admin_menu->add_custom_post_type_menu( $revision, false );
405
406
		$last_item = array_pop( $menu );
407
		$this->assertNotSame( 'https://wordpress.com/types/revision/' . static::$domain, $last_item[2] );
408
409
		register_post_type(
410
			'custom_test_type',
411
			array(
412
				'label'         => 'Custom Test Types',
413
				'show_ui'       => true,
414
				'menu_position' => 2020,
415
			)
416
		);
417
		static::$admin_menu->add_custom_post_type_menu( 'custom_test_type', false );
418
419
		// Clean up.
420
		unregister_post_type( 'custom_test_type' );
421
422
		$slug = 'https://wordpress.com/types/custom_test_type/' . static::$domain;
423
424
		$custom_menu_item = array(
425
			'Custom Test Types',
426
			'edit_posts',
427
			$slug,
428
			'Custom Test Types',
429
			'menu-top toplevel_page_' . $slug,
430
			'toplevel_page_' . $slug,
431
			'dashicons-admin-post',
432
		);
433
434
		$this->assertSame( $menu[2020], $custom_menu_item );
435
436
		$custom_submenu_item = array(
437
			'Custom Test Types',
438
			'edit_posts',
439
			'https://wordpress.com/types/custom_test_type/' . static::$domain,
440
			'Custom Test Types',
441
		);
442
		$this->assertContains( $custom_submenu_item, $submenu[ $slug ] );
443
444
		$add_new_submenu_item = array(
445
			'Add New',
446
			'edit_posts',
447
			'https://wordpress.com/edit/custom_test_type/' . static::$domain,
448
			'Add New',
449
		);
450
		$this->assertContains( $add_new_submenu_item, $submenu[ $slug ] );
451
	}
452
453
	/**
454
	 * Tests add_comments_menu
455
	 *
456
	 * @covers ::add_comments_menu
457
	 */
458
	public function test_add_comments_menu() {
459
		global $menu, $submenu;
460
461
		// Only users that can edit posts get to see the comments menu.
462
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'subscriber' ) ) );
463
		$menu = array();
464
		static::$admin_menu->add_comments_menu( false );
465
		$this->assertEmpty( $menu );
466
467
		// Reset.
468
		wp_set_current_user( static::$user_id );
0 ignored issues
show
Bug introduced by
Since $user_id is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $user_id to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
469
		$menu = static::$menu_data;
470
471
		static::$admin_menu->add_comments_menu( false );
472
473
		$comments_menu_item = array(
474
			'Comments <span class="awaiting-mod count-0"><span class="pending-count" aria-hidden="true">0</span><span class="comments-in-moderation-text screen-reader-text">0 Comments in moderation</span></span>',
475
			'edit_posts',
476
			'https://wordpress.com/comments/all/' . static::$domain,
477
			'Comments',
478
			'menu-top toplevel_page_https://wordpress.com/comments/all/' . static::$domain,
479
			'toplevel_page_https://wordpress.com/comments/all/' . static::$domain,
480
			'dashicons-admin-comments',
481
		);
482
483
		$this->assertSame( $menu[25], $comments_menu_item );
484
		$this->assertEmpty( $submenu['edit-comments.php'] );
485
	}
486
487
	/**
488
	 * Tests add_appearance_menu
489
	 *
490
	 * @covers ::add_appearance_menu
491
	 */
492
	public function test_add_appearance_menu() {
493
		global $menu, $submenu;
494
		$customize_slug = 'https://wordpress.com/customize/' . static::$domain;
495
		static::$admin_menu->add_appearance_menu( false );
496
497
		$slug = 'https://wordpress.com/themes/' . static::$domain;
498
499
		$appearance_menu_item = array(
500
			'Appearance',
501
			'switch_themes',
502
			$slug,
503
			'Appearance',
504
			'menu-top toplevel_page_' . $slug,
505
			'menu-appearance',
506
			'dashicons-admin-appearance',
507
		);
508
509
		$this->assertSame( $menu[60], $appearance_menu_item );
510
		$this->assertArrayNotHasKey( 'themes.php', $submenu );
511
512
		$themes_submenu_item = array(
513
			'Themes',
514
			'switch_themes',
515
			'https://wordpress.com/themes/' . static::$domain,
516
			'Themes',
517
		);
518
		$this->assertContains( $themes_submenu_item, $submenu[ $slug ] );
519
520
		$customize_submenu_item = array(
521
			'Customize',
522
			'customize',
523
			$customize_slug,
524
			'Customize',
525
		);
526
527
		$this->assertContains( $customize_submenu_item, $submenu[ $slug ] );
528
529
		$widgets_submenu_item = array(
530
			'Widgets',
531
			'customize',
532
			$customize_slug . '?autofocus%5Bpanel%5D=widgets',
533
			'Widgets',
534
		);
535
		$this->assertContains( $widgets_submenu_item, $submenu[ $slug ] );
536
537
		$menus_submenu_item = array(
538
			'Menus',
539
			'customize',
540
			$customize_slug . '?autofocus%5Bpanel%5D=nav_menus',
541
			'Menus',
542
		);
543
		$this->assertContains( $menus_submenu_item, $submenu[ $slug ] );
544
	}
545
546
	/**
547
	 * Tests add_plugins_menu
548
	 *
549
	 * @covers ::add_plugins_menu
550
	 */
551
	public function test_add_plugins_menu() {
552
		global $menu, $submenu;
553
554
		add_filter( 'wp_get_update_data', array( $this, 'mock_update_data' ) );
555
		static::$admin_menu->add_plugins_menu( false );
556
		remove_filter( 'wp_get_update_data', array( $this, 'mock_update_data' ) );
557
558
		$slug  = 'https://wordpress.com/plugins/' . static::$domain;
559
		$label = is_multisite() ? 'Plugins ' : 'Plugins <span class="update-plugins count-0"><span class="plugin-count">0</span></span>';
560
561
		$plugins_menu_item = array(
562
			$label,
563
			'activate_plugins',
564
			$slug,
565
			'Plugins',
566
			'menu-top toplevel_page_' . $slug,
567
			'toplevel_page_' . $slug,
568
			'dashicons-admin-plugins',
569
		);
570
571
		$this->assertEquals( $plugins_menu_item, $menu[65] );
572
		$this->assertEmpty( $submenu['plugins.php'] );
573
		$this->assertArrayNotHasKey( $slug, $submenu );
574
	}
575
576
	/**
577
	 * Filters the returned array of update data for plugins, themes, and WordPress core.
578
	 */
579
	public function mock_update_data() {
580
		return array(
581
			'counts' => array(
582
				'plugins'      => 0,
583
				'themes'       => 0,
584
				'translations' => 0,
585
				'wordpress'    => 0,
586
			),
587
			'title'  => '',
588
		);
589
	}
590
591
	/**
592
	 * Tests add_users_menu
593
	 *
594
	 * @covers ::add_users_menu
595
	 */
596
	public function test_add_users_menu() {
597
		global $menu, $submenu;
598
599
		// Current user can't list users.
600
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
601
		$menu = array();
602
603
		static::$admin_menu->add_users_menu( false );
604
605
		$this->assertEmpty( $menu );
606
607
		// Reset.
608
		wp_set_current_user( static::$user_id );
0 ignored issues
show
Bug introduced by
Since $user_id is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $user_id to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
609
		$menu = static::$menu_data;
610
611
		static::$admin_menu->add_users_menu( false );
612
613
		$slug = 'https://wordpress.com/people/team/' . static::$domain;
614
615
		$users_menu_item = array(
616
			'Users',
617
			'list_users',
618
			$slug,
619
			'Users',
620
			'menu-top toplevel_page_' . $slug,
621
			'toplevel_page_' . $slug,
622
			'dashicons-admin-users',
623
		);
624
		$this->assertSame( $menu[70], $users_menu_item );
625
		$this->assertEmpty( $submenu['users.php'] );
626
627
		$all_people_submenu_item = array(
628
			'All People',
629
			'list_users',
630
			$slug,
631
			'All People',
632
		);
633
		$this->assertContains( $all_people_submenu_item, $submenu[ $slug ] );
634
635
		$add_new_submenu_item = array(
636
			'Add New',
637
			'promote_users',
638
			'https://wordpress.com/people/new/' . static::$domain,
639
			'Add New',
640
		);
641
		$this->assertContains( $add_new_submenu_item, $submenu[ $slug ] );
642
643
		$profile_submenu_item = array(
644
			'My Profile',
645
			'read',
646
			'https://wordpress.com/me',
647
			'My Profile',
648
		);
649
		$this->assertContains( $profile_submenu_item, $submenu[ $slug ] );
650
651
		$account_submenu_item = array(
652
			'Account Settings',
653
			'read',
654
			'https://wordpress.com/me/account',
655
			'Account Settings',
656
		);
657
		$this->assertContains( $account_submenu_item, $submenu[ $slug ] );
658
	}
659
660
	/**
661
	 * Tests add_tools_menu
662
	 *
663
	 * @covers ::add_tools_menu
664
	 */
665
	public function test_add_tools_menu() {
666
		global $menu, $submenu;
667
668
		$slug = 'https://wordpress.com/marketing/tools/' . static::$domain;
669
		static::$admin_menu->add_tools_menu( false, false );
670
671
		$tools_menu_item = array(
672
			'Tools',
673
			'publish_posts',
674
			$slug,
675
			'Tools',
676
			'menu-top toplevel_page_' . $slug,
677
			'toplevel_page_' . $slug,
678
			'dashicons-admin-tools',
679
		);
680
681
		$this->assertSame( $menu[75], $tools_menu_item );
682
		$this->assertArrayNotHasKey( 'tools.php', $submenu );
683
684
		// Contains the following menu items.
685
686
		$marketing_submenu_item = array(
687
			'Marketing',
688
			'publish_posts',
689
			'https://wordpress.com/marketing/tools/' . static::$domain,
690
			'Marketing',
691
		);
692
		$this->assertContains( $marketing_submenu_item, $submenu[ $slug ] );
693
694
		$earn_submenu_item = array(
695
			'Earn',
696
			'manage_options',
697
			'https://wordpress.com/earn/' . static::$domain,
698
			'Earn',
699
		);
700
		$this->assertContains( $earn_submenu_item, $submenu[ $slug ] );
701
702
		$import_submenu_item = array(
703
			'Import',
704
			'import',
705
			'https://wordpress.com/import/' . static::$domain,
706
			'Import',
707
		);
708
		$this->assertContains( $import_submenu_item, $submenu[ $slug ] );
709
710
		$export_submenu_item = array(
711
			'Export',
712
			'export',
713
			'https://wordpress.com/export/' . static::$domain,
714
			'Export',
715
		);
716
		$this->assertContains( $export_submenu_item, $submenu[ $slug ] );
717
718
		$other_tools_submenu_item = array(
719
			'Other tools',
720
			'manage_options',
721
			'tools.php',
722
			'Other tools',
723
		);
724
		$this->assertContains( $other_tools_submenu_item, $submenu[ $slug ] );
725
726
		// NOT contains the following menu items.
727
728
		$import_submenu_item = array(
729
			'Import',
730
			'import',
731
			'import.php',
732
		);
733
		$this->assertNotContains( $import_submenu_item, $submenu[ $slug ] );
734
735
		$export_submenu_item = array(
736
			'Export',
737
			'export',
738
			'export.php',
739
		);
740
		$this->assertNotContains( $export_submenu_item, $submenu[ $slug ] );
741
	}
742
743
	/**
744
	 * Tests add_options_menu
745
	 *
746
	 * @covers ::add_options_menu
747
	 */
748
	public function test_add_options_menu() {
749
		global $submenu;
750
751
		$slug = 'https://wordpress.com/settings/general/' . static::$domain;
752
		static::$admin_menu->add_options_menu( false );
753
754
		$this->assertNotContains( 'options-discussion.php', $submenu[ $slug ] );
755
		$this->assertNotContains( 'options-writing.php', $submenu[ $slug ] );
756
757
		$general_submenu_item = array(
758
			'General',
759
			'manage_options',
760
			$slug,
761
			'General',
762
		);
763
		$this->assertContains( $general_submenu_item, $submenu[ $slug ] );
764
	}
765
766
	/**
767
	 * Tests add_jetpack_menu
768
	 *
769
	 * @covers ::add_jetpack_menu
770
	 */
771
	public function add_jetpack_menu() {
772
		global $menu, $submenu;
773
774
		$slug = 'https://wordpress.com/activity-log/' . static::$domain;
775
		static::$admin_menu->add_jetpack_menu();
776
777
		// TODO: Replace with proper SVG data url.
778
		$jetpack_icon = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 32 32' %3E%3Cpath fill='%23a0a5aa' d='M16,0C7.2,0,0,7.2,0,16s7.2,16,16,16s16-7.2,16-16S24.8,0,16,0z'%3E%3C/path%3E%3Cpolygon fill='%23fff' points='15,19 7,19 15,3 '%3E%3C/polygon%3E%3Cpolygon fill='%23fff' points='17,29 17,13 25,13 '%3E%3C/polygon%3E%3C/svg%3E";
779
780
		$jetpack_menu_item = array(
781
			'Jetpack',
782
			'manage_options',
783
			$slug,
784
			'Jetpack',
785
			'menu-top toplevel_page_' . $slug,
786
			'toplevel_page_' . $slug,
787
			$jetpack_icon,
788
		);
789
790
		$this->assertSame( $menu[50], $jetpack_menu_item );
791
		$this->assertArrayNotHasKey( 'jetpack', $submenu );
792
793
		// Contains the following menu items.
794
795
		$activity_log_submenu_item = array(
796
			'Activity Log',
797
			'manage_options',
798
			'https://wordpress.com/activity-log/' . static::$domain,
799
			'Activity Log',
800
		);
801
		$this->assertContains( $activity_log_submenu_item, $submenu[ $slug ] );
802
803
		$backup_submenu_item = array(
804
			'Backup',
805
			'manage_options',
806
			'https://wordpress.com/backup/' . static::$domain,
807
			'Backup',
808
		);
809
		$this->assertContains( $backup_submenu_item, $submenu[ $slug ] );
810
811
		$search_submenu_item = array(
812
			'Search',
813
			'read',
814
			'https://wordpress.com/jetpack-search/' . static::$domain,
815
			'Search',
816
		);
817
		$this->assertContains( $search_submenu_item, $submenu[ $slug ] );
818
819
		// NOT contains the following menu items.
820
821
		$stats_submenu_item = array(
822
			'Stats',
823
			'manage_options',
824
			'stats',
825
		);
826
		$this->assertNotContains( $stats_submenu_item, $submenu[ $slug ] );
827
828
		$backups_submenu_item = array(
829
			'Backup &amp; Scan',
830
			'manage_options',
831
			esc_url( Redirect::get_url( 'calypso-backups' ) ),
832
		);
833
		$this->assertNotContains( $backups_submenu_item, $submenu[ $slug ] );
834
	}
835
836
	/**
837
	 * Tests migrate_submenus
838
	 *
839
	 * @covers ::migrate_submenus
840
	 */
841
	public function test_migrate_submenus() {
842
		global $submenu;
843
844
		$new_slug = 'made-up-slug';
845
846
		// Start with a clean slate.
847
		$temp_submenu = $submenu;
848
		$submenu      = static::$submenu_data;
849
850
		// New slug doesn't exist yet.
851
		static::$admin_menu->migrate_submenus( 'edit.php', $new_slug );
852
		$this->assertArrayNotHasKey( 'edit.php', $submenu );
853
		$this->assertSame( static::$submenu_data['edit.php'], $submenu[ $new_slug ] );
854
855
		// New slug exists.
856
		static::$admin_menu->migrate_submenus( 'upload.php', $new_slug );
857
		$this->assertArrayNotHasKey( 'upload.php', $submenu );
858
		$expected = array_replace( static::$submenu_data['edit.php'], static::$submenu_data['upload.php'] );
859
		$this->assertSame( $expected, $submenu[ $new_slug ] );
860
861
		// Old slug doesn't exist.
862
		$this->assertArrayNotHasKey( 'unkown', $submenu );
863
		$pre_migration = $submenu;
864
		static::$admin_menu->migrate_submenus( 'unkown', $new_slug );
865
		$this->assertSame( $pre_migration, $submenu );
866
867
		// Slugs are the same.
868
		$this->assertArrayHasKey( 'index.php', $submenu );
869
		$pre_migration = $submenu;
870
		static::$admin_menu->migrate_submenus( 'index.php', 'index.php' );
871
		$this->assertSame( $pre_migration, $submenu );
872
873
		// Restore filtered $submenu.
874
		$submenu = $temp_submenu;
875
	}
876
}
877