Completed
Push — renovate/slack-web-api-6.x ( 1d54b7...bfe495 )
by
unknown
193:23 queued 183:13
created

Test_Admin_Menu::test_add_tools_menu()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 77

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 77
rs 8.5018
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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\Status;
10
11
require_jetpack_file( 'modules/masterbar/admin-menu/class-admin-menu.php' );
12
require_jetpack_file( 'tests/php/modules/masterbar/data/admin-menu.php' );
13
14
/**
15
 * Class Test_Admin_Menu
16
 *
17
 * @coversDefaultClass Automattic\Jetpack\Dashboard_Customizations\Admin_Menu
18
 */
19
class Test_Admin_Menu extends WP_UnitTestCase {
20
21
	/**
22
	 * Menu data fixture.
23
	 *
24
	 * @var array
25
	 */
26
	public static $menu_data;
27
28
	/**
29
	 * Submenu data fixture.
30
	 *
31
	 * @var array
32
	 */
33
	public static $submenu_data;
34
35
	/**
36
	 * Test domain.
37
	 *
38
	 * @var string
39
	 */
40
	public static $domain;
41
42
	/**
43
	 * Admin menu instance.
44
	 *
45
	 * @var Admin_Menu
46
	 */
47
	public static $admin_menu;
48
49
	/**
50
	 * Mock user ID.
51
	 *
52
	 * @var int
53
	 */
54
	private static $user_id = 0;
55
56
	/**
57
	 * Create shared fixtures.
58
	 *
59
	 * @param WP_UnitTest_Factory $factory Fixture factory.
60
	 */
61 View Code Duplication
	public static function wpSetUpBeforeClass( $factory ) {
62
		static::$domain       = ( new Status() )->get_site_suffix();
63
		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...
64
		static::$menu_data    = get_menu_fixture();
65
		static::$submenu_data = get_submenu_fixture();
66
	}
67
68
	/**
69
	 * Set up data.
70
	 */
71 View Code Duplication
	public function setUp() {
72
		parent::setUp();
73
		global $menu, $submenu;
74
75
		// Initialize in setUp so it registers hooks for every test.
76
		static::$admin_menu = Admin_Menu::get_instance();
77
78
		$menu    = static::$menu_data;
79
		$submenu = static::$submenu_data;
80
81
		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...
82
	}
83
84
	/**
85
	 * Test get_instance.
86
	 *
87
	 * @covers ::get_instance
88
	 * @covers ::__construct
89
	 */
90 View Code Duplication
	public function test_get_instance() {
91
		$instance = Admin_Menu::get_instance();
92
93
		$this->assertInstanceOf( Admin_Menu::class, $instance );
94
		$this->assertSame( $instance, static::$admin_menu );
95
96
		$this->assertSame( 99999, has_action( 'admin_menu', array( $instance, 'reregister_menu_items' ) ) );
97
		$this->assertSame( 10, has_action( 'admin_enqueue_scripts', array( $instance, 'enqueue_scripts' ) ) );
98
	}
99
100
	/**
101
	 * Tests add_admin_menu_separator
102
	 *
103
	 * @covers ::add_admin_menu_separator
104
	 */
105
	public function test_add_admin_menu_separator() {
106
		global $menu;
107
108
		// Start with a clean slate.
109
		$temp_menu = $menu;
110
		$menu      = array();
111
112
		static::$admin_menu->add_admin_menu_separator( 15 );
113
		static::$admin_menu->add_admin_menu_separator( 10, 'manage_options' );
114
115
		$this->assertSame( array( 10, 15 ), array_keys( $menu ), 'Menu should be ordered by position parameter.' );
116
		$this->assertSame( 'manage_options', $menu[10][1] );
117
		$this->assertContains( 'separator-custom-', $menu[10][2] );
118
		$this->assertSame( 'read', $menu[15][1] );
119
		$this->assertContains( 'separator-custom-', $menu[15][2] );
120
121
		// Restore filtered $menu.
122
		$menu = $temp_menu;
123
	}
124
125
	/**
126
	 * Test_Admin_Menu.
127
	 *
128
	 * @covers ::reregister_menu_items
129
	 */
130
	public function test_admin_menu_output() {
131
		global $menu, $submenu;
132
133
		static::$admin_menu->reregister_menu_items();
134
135
		$this->assertSame(
136
			array_keys( $menu ),
137
			array( 2, '3.86682', 4, 5, 10, 15, 20, 25, 50, 51, 59, 60, 65, 70, 75, 80 ),
138
			'Admin menu should not have unexpected top menu items.'
139
		);
140
141
		$this->assertEquals( static::$submenu_data[''], $submenu[''], 'Submenu items without parent should stay the same.' );
142
	}
143
144
	/**
145
	 * Shim wpcomsh fallback site icon.
146
	 *
147
	 * @return string
148
	 */
149
	public function wpcomsh_site_icon_url() {
150
		return 'https://s0.wp.com/i/webclip.png';
151
	}
152
153
	/**
154
	 * Custom site icon.
155
	 *
156
	 * @return string
157
	 */
158
	public function custom_site_icon_url() {
159
		return 'https://s0.wp.com/i/jetpack.png';
160
	}
161
162
	/**
163
	 * Tests add_my_home_menu
164
	 *
165
	 * @covers ::add_my_home_menu
166
	 */
167
	public function test_add_my_home_menu() {
168
		global $menu, $submenu;
169
170
		static::$admin_menu->add_my_home_menu( false );
171
172
		$slug = 'https://wordpress.com/home/' . static::$domain;
173
174
		$my_home_menu_item = array(
175
			'My Home',
176
			'manage_options',
177
			$slug,
178
			'My Home',
179
			'menu-top toplevel_page_' . $slug,
180
			'toplevel_page_' . $slug,
181
			'dashicons-admin-home',
182
		);
183
		$this->assertSame( $menu[2], $my_home_menu_item );
184
185
		// Has My Home submenu item when there are other submenu items.
186
		$my_home_submenu_item = array(
187
			'My Home',
188
			'manage_options',
189
			$slug,
190
			'My Home',
191
		);
192
		$this->assertContains( $my_home_submenu_item, $submenu[ $slug ] );
193
		// Reset data.
194
		$menu    = static::$menu_data;
195
		$submenu = static::$submenu_data;
196
197
		// Has no ny Home submenu when there are no other submenus.
198
		$submenu['index.php'] = array(
199
			0 => array( 'Home', 'read', 'index.php' ),
200
		);
201
202
		static::$admin_menu->add_my_home_menu( false );
203
204
		$this->assertArrayNotHasKey( 'https://wordpress.com/home/' . static::$domain, $submenu );
205
	}
206
207
	/**
208
	 * Tests add_stats_menu
209
	 *
210
	 * @covers ::add_stats_menu
211
	 */
212
	public function test_add_stats_menu() {
213
		global $menu, $submenu;
214
215
		static::$admin_menu->add_stats_menu();
216
217
		$menu_title = __( 'Stats', 'jetpack' );
218
219
		if ( ! defined( 'TESTING_IN_JETPACK' ) || ! TESTING_IN_JETPACK ) {
220
			$menu_title .= sprintf(
221
				'<img class="sidebar-unified__sparkline" width="80" height="20" src="%1$s" alt="%2$s">',
222
				esc_url( home_url( 'wp-includes/charts/admin-bar-hours-scale-2x.php?masterbar=1&s=' . get_current_blog_id() ) ),
223
				esc_attr__( 'Hourly views', 'jetpack' )
224
			);
225
		}
226
		$stats_menu_item = array(
227
			$menu_title,
228
			'view_stats',
229
			'https://wordpress.com/stats/day/' . static::$domain,
230
			'Stats',
231
			'menu-top toplevel_page_https://wordpress.com/stats/day/' . static::$domain,
232
			'toplevel_page_https://wordpress.com/stats/day/' . static::$domain,
233
			'dashicons-chart-bar',
234
		);
235
236
		$this->assertSame( $menu['3.86682'], $stats_menu_item );
237
		$this->assertArrayNotHasKey( 'https://wordpress.com/stats/day/' . static::$domain, $submenu );
238
	}
239
240
	/**
241
	 * Tests add_upgrades_menu
242
	 *
243
	 * @covers ::add_upgrades_menu
244
	 */
245
	public function test_add_wpcom_upgrades_menu() {
246
		global $menu, $submenu;
247
248
		static::$admin_menu->add_upgrades_menu();
249
250
		$slug = 'https://wordpress.com/plans/' . static::$domain;
251
252
		$upgrades_menu_item = array(
253
			'Upgrades',
254
			'manage_options',
255
			$slug,
256
			'Upgrades',
257
			'menu-top toplevel_page_https://wordpress.com/plans/' . static::$domain,
258
			'toplevel_page_https://wordpress.com/plans/' . static::$domain,
259
			'dashicons-cart',
260
		);
261
		$this->assertSame( $menu['4.80608'], $upgrades_menu_item );
262
263
		$plans_submenu_item = array(
264
			'Plans',
265
			'manage_options',
266
			$slug,
267
			'Plans',
268
		);
269
		$this->assertContains( $plans_submenu_item, $submenu[ $slug ] );
270
271
		$purchases_submenu_item = array(
272
			'Purchases',
273
			'manage_options',
274
			'https://wordpress.com/purchases/subscriptions/' . static::$domain,
275
			'Purchases',
276
		);
277
		$this->assertContains( $purchases_submenu_item, $submenu[ $slug ] );
278
	}
279
280
	/**
281
	 * Tests add_jetpack_upgrades_menu
282
	 *
283
	 * @covers ::add_jetpack_upgrades_menu
284
	 */
285 View Code Duplication
	public function test_add_jetpack_upgrades_menu() {
286
		global $menu, $submenu;
287
288
		static::$admin_menu->add_upgrades_menu();
289
290
		$slug = 'https://wordpress.com/plans/' . static::$domain;
291
292
		$upgrades_menu_item = array(
293
			'Upgrades',
294
			'manage_options',
295
			$slug,
296
			'Upgrades',
297
			'menu-top toplevel_page_https://wordpress.com/plans/' . static::$domain,
298
			'toplevel_page_https://wordpress.com/plans/' . static::$domain,
299
			'dashicons-cart',
300
		);
301
		$this->assertSame( $menu['4.80608'], $upgrades_menu_item );
302
		$this->assertArrayNotHasKey( 'https://wordpress.com/domains/manage/' . static::$domain, $submenu );
303
	}
304
305
	/**
306
	 * Tests add_posts_menu
307
	 *
308
	 * @covers ::add_posts_menu
309
	 */
310 View Code Duplication
	public function test_add_posts_menu() {
311
		global $menu, $submenu;
312
313
		static::$admin_menu->add_posts_menu( false );
314
315
		$posts_menu_item = array(
316
			'Posts',
317
			'edit_posts',
318
			'https://wordpress.com/posts/' . static::$domain,
319
			'Posts',
320
			'menu-top toplevel_page_https://wordpress.com/posts/' . static::$domain,
321
			'toplevel_page_https://wordpress.com/posts/' . static::$domain,
322
			'dashicons-admin-post',
323
		);
324
325
		$this->assertSame( $menu[5], $posts_menu_item );
326
		$this->assertArrayNotHasKey( 'edit.php', $submenu );
327
	}
328
329
	/**
330
	 * Tests add_media_menu
331
	 *
332
	 * @covers ::add_media_menu
333
	 */
334
	public function test_add_media_menu() {
335
		global $menu, $submenu;
336
337
		static::$admin_menu->add_media_menu( false );
338
339
		$slug = 'https://wordpress.com/media/' . static::$domain;
340
341
		$media_menu_item = array(
342
			'Media',
343
			'upload_files',
344
			$slug,
345
			'Media',
346
			'menu-top toplevel_page_' . $slug,
347
			'toplevel_page_' . $slug,
348
			'dashicons-admin-media',
349
		);
350
351
		$this->assertSame( $menu[10], $media_menu_item );
352
		$this->assertArrayNotHasKey( $slug, $submenu );
353
354
		$library_submenu_item = array(
355
			'Library',
356
			'upload_files',
357
			'upload.php',
358
		);
359
		$this->assertNotContains( $library_submenu_item, $submenu['upload.php'] );
360
361
		$add_new_submenu_item = array(
362
			'Add New',
363
			'upload_files',
364
			'media-new.php',
365
		);
366
		$this->assertNotContains( $add_new_submenu_item, $submenu['upload.php'] );
367
	}
368
369
	/**
370
	 * Tests add_page_menu
371
	 *
372
	 * @covers ::add_page_menu
373
	 */
374 View Code Duplication
	public function test_add_page_menu() {
375
		global $menu, $submenu;
376
377
		static::$admin_menu->add_page_menu( false );
378
379
		$posts_menu_item = array(
380
			'Pages',
381
			'edit_pages',
382
			'https://wordpress.com/pages/' . static::$domain,
383
			'Pages',
384
			'menu-top toplevel_page_https://wordpress.com/pages/' . static::$domain,
385
			'toplevel_page_https://wordpress.com/pages/' . static::$domain,
386
			'dashicons-admin-page',
387
		);
388
389
		$this->assertSame( $menu[20], $posts_menu_item );
390
		$this->assertEmpty( $submenu['edit.php?post_type=page'] );
391
	}
392
393
	/**
394
	 * Tests add_custom_post_type_menu
395
	 *
396
	 * @covers ::add_custom_post_type_menu
397
	 */
398
	public function test_add_custom_post_type_menu() {
399
		global $menu, $submenu;
400
401
		// Don't show post types that don't want to be shown.
402
		$revision = get_post_type_object( 'revision' );
403
		static::$admin_menu->add_custom_post_type_menu( $revision, false );
404
405
		$last_item = array_pop( $menu );
406
		$this->assertNotSame( 'https://wordpress.com/types/revision/' . static::$domain, $last_item[2] );
407
408
		register_post_type(
409
			'custom_test_type',
410
			array(
411
				'label'         => 'Custom Test Types',
412
				'show_ui'       => true,
413
				'menu_position' => 2020,
414
			)
415
		);
416
		static::$admin_menu->add_custom_post_type_menu( 'custom_test_type', false );
417
418
		// Clean up.
419
		unregister_post_type( 'custom_test_type' );
420
421
		$slug = 'https://wordpress.com/types/custom_test_type/' . static::$domain;
422
423
		$custom_menu_item = array(
424
			'Custom Test Types',
425
			'edit_posts',
426
			$slug,
427
			'Custom Test Types',
428
			'menu-top toplevel_page_' . $slug,
429
			'toplevel_page_' . $slug,
430
			'dashicons-admin-post',
431
		);
432
433
		$this->assertSame( $menu[2020], $custom_menu_item );
434
435
		$custom_submenu_item = array(
436
			'Custom Test Types',
437
			'edit_posts',
438
			'https://wordpress.com/types/custom_test_type/' . static::$domain,
439
			'Custom Test Types',
440
		);
441
		$this->assertContains( $custom_submenu_item, $submenu[ $slug ] );
442
443
		$add_new_submenu_item = array(
444
			'Add New',
445
			'edit_posts',
446
			'https://wordpress.com/edit/custom_test_type/' . static::$domain,
447
			'Add New',
448
		);
449
		$this->assertContains( $add_new_submenu_item, $submenu[ $slug ] );
450
	}
451
452
	/**
453
	 * Tests add_comments_menu
454
	 *
455
	 * @covers ::add_comments_menu
456
	 */
457
	public function test_add_comments_menu() {
458
		global $menu, $submenu;
459
460
		// Only users that can edit posts get to see the comments menu.
461
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'subscriber' ) ) );
462
		$menu = array();
463
		static::$admin_menu->add_comments_menu( false );
464
		$this->assertEmpty( $menu );
465
466
		// Reset.
467
		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...
468
		$menu = static::$menu_data;
469
470
		static::$admin_menu->add_comments_menu( false );
471
472
		$comments_menu_item = array(
473
			'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>',
474
			'edit_posts',
475
			'https://wordpress.com/comments/all/' . static::$domain,
476
			'Comments',
477
			'menu-top toplevel_page_https://wordpress.com/comments/all/' . static::$domain,
478
			'toplevel_page_https://wordpress.com/comments/all/' . static::$domain,
479
			'dashicons-admin-comments',
480
		);
481
482
		$this->assertSame( $menu[25], $comments_menu_item );
483
		$this->assertEmpty( $submenu['edit-comments.php'] );
484
	}
485
486
	/**
487
	 * Tests add_appearance_menu
488
	 *
489
	 * @covers ::add_appearance_menu
490
	 */
491
	public function test_add_appearance_menu() {
492
		global $menu, $submenu;
493
		$customize_slug = 'customize.php';
494
		static::$admin_menu->add_appearance_menu( false );
495
496
		$slug = 'https://wordpress.com/themes/' . static::$domain;
497
498
		$appearance_menu_item = array(
499
			'Appearance',
500
			'switch_themes',
501
			$slug,
502
			'Appearance',
503
			'menu-top toplevel_page_' . $slug,
504
			'menu-appearance',
505
			'dashicons-admin-appearance',
506
		);
507
508
		$this->assertSame( $menu[60], $appearance_menu_item );
509
		$this->assertArrayNotHasKey( 'themes.php', $submenu );
510
511
		$themes_submenu_item = array(
512
			'Themes',
513
			'switch_themes',
514
			'https://wordpress.com/themes/' . static::$domain,
515
			'Themes',
516
		);
517
		$this->assertContains( $themes_submenu_item, $submenu[ $slug ] );
518
519
		$customize_submenu_item = array(
520
			'Customize',
521
			'customize',
522
			$customize_slug,
523
			'Customize',
524
		);
525
526
		$this->assertContains( $customize_submenu_item, $submenu[ $slug ] );
527
528
		$widgets_submenu_item = array(
529
			'Widgets',
530
			'customize',
531
			$customize_slug . '?autofocus%5Bpanel%5D=widgets',
532
			'Widgets',
533
		);
534
		$this->assertContains( $widgets_submenu_item, $submenu[ $slug ] );
535
536
		$menus_submenu_item = array(
537
			'Menus',
538
			'customize',
539
			$customize_slug . '?autofocus%5Bpanel%5D=nav_menus',
540
			'Menus',
541
		);
542
		$this->assertContains( $menus_submenu_item, $submenu[ $slug ] );
543
	}
544
545
	/**
546
	 * Tests add_plugins_menu
547
	 *
548
	 * @covers ::add_plugins_menu
549
	 */
550
	public function test_add_plugins_menu() {
551
		global $menu, $submenu;
552
553
		add_filter( 'wp_get_update_data', array( $this, 'mock_update_data' ) );
554
		static::$admin_menu->add_plugins_menu( false );
555
		remove_filter( 'wp_get_update_data', array( $this, 'mock_update_data' ) );
556
557
		$slug  = 'https://wordpress.com/plugins/' . static::$domain;
558
		$label = is_multisite() ? 'Plugins ' : 'Plugins <span class="update-plugins count-0"><span class="plugin-count">0</span></span>';
559
560
		$plugins_menu_item = array(
561
			$label,
562
			'activate_plugins',
563
			$slug,
564
			'Plugins',
565
			'menu-top toplevel_page_' . $slug,
566
			'toplevel_page_' . $slug,
567
			'dashicons-admin-plugins',
568
		);
569
570
		$this->assertEquals( $plugins_menu_item, $menu[65] );
571
		$this->assertEmpty( $submenu['plugins.php'] );
572
		$this->assertArrayNotHasKey( $slug, $submenu );
573
	}
574
575
	/**
576
	 * Filters the returned array of update data for plugins, themes, and WordPress core.
577
	 */
578
	public function mock_update_data() {
579
		return array(
580
			'counts' => array(
581
				'plugins'      => 0,
582
				'themes'       => 0,
583
				'translations' => 0,
584
				'wordpress'    => 0,
585
			),
586
			'title'  => '',
587
		);
588
	}
589
590
	/**
591
	 * Tests add_users_menu
592
	 *
593
	 * @covers ::add_users_menu
594
	 */
595
	public function test_add_users_menu() {
596
		global $menu, $submenu;
597
598
		// Current user can't list users.
599
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
600
		$menu = array();
601
602
		static::$admin_menu->add_users_menu( false );
603
604
		$this->assertEmpty( $menu );
605
606
		// Reset.
607
		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...
608
		$menu = static::$menu_data;
609
610
		static::$admin_menu->add_users_menu( false );
611
612
		$slug = 'https://wordpress.com/people/team/' . static::$domain;
613
614
		$users_menu_item = array(
615
			'Users',
616
			'list_users',
617
			$slug,
618
			'Users',
619
			'menu-top toplevel_page_' . $slug,
620
			'toplevel_page_' . $slug,
621
			'dashicons-admin-users',
622
		);
623
		$this->assertSame( $menu[70], $users_menu_item );
624
		$this->assertEmpty( $submenu['users.php'] );
625
626
		$all_people_submenu_item = array(
627
			'All People',
628
			'list_users',
629
			$slug,
630
			'All People',
631
		);
632
		$this->assertContains( $all_people_submenu_item, $submenu[ $slug ] );
633
634
		$add_new_submenu_item = array(
635
			'Add New',
636
			'promote_users',
637
			'https://wordpress.com/people/new/' . static::$domain,
638
			'Add New',
639
		);
640
		$this->assertContains( $add_new_submenu_item, $submenu[ $slug ] );
641
642
		$profile_submenu_item = array(
643
			'My Profile',
644
			'read',
645
			'https://wordpress.com/me',
646
			'My Profile',
647
		);
648
		$this->assertContains( $profile_submenu_item, $submenu[ $slug ] );
649
650
		$account_submenu_item = array(
651
			'Account Settings',
652
			'read',
653
			'https://wordpress.com/me/account',
654
			'Account Settings',
655
		);
656
		$this->assertContains( $account_submenu_item, $submenu[ $slug ] );
657
	}
658
659
	/**
660
	 * Tests add_tools_menu
661
	 *
662
	 * @covers ::add_tools_menu
663
	 */
664
	public function test_add_tools_menu() {
665
		global $menu, $submenu;
666
667
		$slug = 'https://wordpress.com/marketing/tools/' . static::$domain;
668
		static::$admin_menu->add_tools_menu( false, false );
669
670
		$tools_menu_item = array(
671
			'Tools',
672
			'publish_posts',
673
			$slug,
674
			'Tools',
675
			'menu-top toplevel_page_' . $slug,
676
			'toplevel_page_' . $slug,
677
			'dashicons-admin-tools',
678
		);
679
680
		$this->assertSame( $menu[75], $tools_menu_item );
681
		$this->assertArrayNotHasKey( 'tools.php', $submenu );
682
683
		// Contains the following menu items.
684
685
		$marketing_submenu_item = array(
686
			'Marketing',
687
			'publish_posts',
688
			'https://wordpress.com/marketing/tools/' . static::$domain,
689
			'Marketing',
690
		);
691
		$this->assertContains( $marketing_submenu_item, $submenu[ $slug ] );
692
693
		$earn_submenu_item = array(
694
			'Earn',
695
			'manage_options',
696
			'https://wordpress.com/earn/' . static::$domain,
697
			'Earn',
698
		);
699
		$this->assertContains( $earn_submenu_item, $submenu[ $slug ] );
700
701
		$import_submenu_item = array(
702
			'Import',
703
			'import',
704
			'https://wordpress.com/import/' . static::$domain,
705
			'Import',
706
		);
707
		$this->assertContains( $import_submenu_item, $submenu[ $slug ] );
708
709
		$export_submenu_item = array(
710
			'Export',
711
			'export',
712
			'https://wordpress.com/export/' . static::$domain,
713
			'Export',
714
		);
715
		$this->assertContains( $export_submenu_item, $submenu[ $slug ] );
716
717
		$other_tools_submenu_item = array(
718
			'Other tools',
719
			'manage_options',
720
			'tools.php',
721
			'Other tools',
722
		);
723
		$this->assertContains( $other_tools_submenu_item, $submenu[ $slug ] );
724
725
		// NOT contains the following menu items.
726
727
		$import_submenu_item = array(
728
			'Import',
729
			'import',
730
			'import.php',
731
		);
732
		$this->assertNotContains( $import_submenu_item, $submenu[ $slug ] );
733
734
		$export_submenu_item = array(
735
			'Export',
736
			'export',
737
			'export.php',
738
		);
739
		$this->assertNotContains( $export_submenu_item, $submenu[ $slug ] );
740
	}
741
742
	/**
743
	 * Tests add_options_menu
744
	 *
745
	 * @covers ::add_options_menu
746
	 */
747
	public function test_add_options_menu() {
748
		global $submenu;
749
750
		$slug = 'https://wordpress.com/settings/general/' . static::$domain;
751
		static::$admin_menu->add_options_menu( false );
752
753
		$this->assertNotContains( 'options-discussion.php', $submenu[ $slug ] );
754
		$this->assertNotContains( 'options-writing.php', $submenu[ $slug ] );
755
756
		$general_submenu_item = array(
757
			'General',
758
			'manage_options',
759
			$slug,
760
			'General',
761
		);
762
		$this->assertContains( $general_submenu_item, $submenu[ $slug ] );
763
	}
764
765
	/**
766
	 * Tests add_jetpack_menu
767
	 *
768
	 * @covers ::add_jetpack_menu
769
	 */
770
	public function add_jetpack_menu() {
771
		global $menu, $submenu;
772
773
		$slug = 'https://wordpress.com/activity-log/' . static::$domain;
774
		static::$admin_menu->add_jetpack_menu();
775
776
		// TODO: Replace with proper SVG data url.
777
		$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";
778
779
		$jetpack_menu_item = array(
780
			'Jetpack',
781
			'manage_options',
782
			$slug,
783
			'Jetpack',
784
			'menu-top toplevel_page_' . $slug,
785
			'toplevel_page_' . $slug,
786
			$jetpack_icon,
787
		);
788
789
		$this->assertSame( $menu[50], $jetpack_menu_item );
790
		$this->assertArrayNotHasKey( 'jetpack', $submenu );
791
792
		// Contains the following menu items.
793
794
		$activity_log_submenu_item = array(
795
			'Activity Log',
796
			'manage_options',
797
			'https://wordpress.com/activity-log/' . static::$domain,
798
			'Activity Log',
799
		);
800
		$this->assertContains( $activity_log_submenu_item, $submenu[ $slug ] );
801
802
		$backup_submenu_item = array(
803
			'Backup',
804
			'manage_options',
805
			'https://wordpress.com/backup/' . static::$domain,
806
			'Backup',
807
		);
808
		$this->assertContains( $backup_submenu_item, $submenu[ $slug ] );
809
810
		$search_submenu_item = array(
811
			'Search',
812
			'read',
813
			'https://wordpress.com/jetpack-search/' . static::$domain,
814
			'Search',
815
		);
816
		$this->assertContains( $search_submenu_item, $submenu[ $slug ] );
817
818
		// NOT contains the following menu items.
819
820
		$stats_submenu_item = array(
821
			'Stats',
822
			'manage_options',
823
			'stats',
824
		);
825
		$this->assertNotContains( $stats_submenu_item, $submenu[ $slug ] );
826
	}
827
828
	/**
829
	 * Tests migrate_submenus
830
	 *
831
	 * @covers ::migrate_submenus
832
	 */
833
	public function test_migrate_submenus() {
834
		global $submenu;
835
836
		$new_slug = 'made-up-slug';
837
838
		// Start with a clean slate.
839
		$temp_submenu = $submenu;
840
		$submenu      = static::$submenu_data;
841
842
		// New slug doesn't exist yet.
843
		static::$admin_menu->migrate_submenus( 'edit.php', $new_slug );
844
		$this->assertArrayNotHasKey( 'edit.php', $submenu );
845
		$this->assertSame( static::$submenu_data['edit.php'], $submenu[ $new_slug ] );
846
847
		// New slug exists.
848
		static::$admin_menu->migrate_submenus( 'upload.php', $new_slug );
849
		$this->assertArrayNotHasKey( 'upload.php', $submenu );
850
		$expected = array_replace( static::$submenu_data['edit.php'], static::$submenu_data['upload.php'] );
851
		$this->assertSame( $expected, $submenu[ $new_slug ] );
852
853
		// Old slug doesn't exist.
854
		$this->assertArrayNotHasKey( 'unkown', $submenu );
855
		$pre_migration = $submenu;
856
		static::$admin_menu->migrate_submenus( 'unkown', $new_slug );
857
		$this->assertSame( $pre_migration, $submenu );
858
859
		// Slugs are the same.
860
		$this->assertArrayHasKey( 'index.php', $submenu );
861
		$pre_migration = $submenu;
862
		static::$admin_menu->migrate_submenus( 'index.php', 'index.php' );
863
		$this->assertSame( $pre_migration, $submenu );
864
865
		// Restore filtered $submenu.
866
		$submenu = $temp_submenu;
867
	}
868
}
869