Completed
Push — fix/undefined_blog_name ( 3f4435...c044a3 )
by
unknown
143:52 queued 132:58
created

Test_Admin_Menu::test_add_media_menu()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 34
rs 9.376
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 menu-top-first menu-icon-dashboard',
181
			'menu-dashboard',
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
		// Reset.
576
		$menu    = static::$menu_data;
577
		$submenu = static::$submenu_data;
578
579
		// Check submenu are kept when using WP Admin links.
580
		static::$admin_menu->add_plugins_menu( true );
581
		$this->assertNotEmpty( $submenu['plugins.php'] );
582
	}
583
584
	/**
585
	 * Filters the returned array of update data for plugins, themes, and WordPress core.
586
	 */
587
	public function mock_update_data() {
588
		return array(
589
			'counts' => array(
590
				'plugins'      => 0,
591
				'themes'       => 0,
592
				'translations' => 0,
593
				'wordpress'    => 0,
594
			),
595
			'title'  => '',
596
		);
597
	}
598
599
	/**
600
	 * Tests add_users_menu
601
	 *
602
	 * @covers ::add_users_menu
603
	 */
604
	public function test_add_users_menu() {
605
		global $menu, $submenu;
606
607
		// Current user can't list users.
608
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
609
		$menu = array();
610
611
		static::$admin_menu->add_users_menu( false );
612
613
		$profile_menu_item = array(
614
			'My Profile',
615
			'read',
616
			'https://wordpress.com/me',
617
			'My Profile',
618
			'menu-top toplevel_page_https://wordpress.com/me',
619
			'toplevel_page_https://wordpress.com/me',
620
			'dashicons-admin-users',
621
		);
622
		$this->assertSame( $menu[70], $profile_menu_item );
623
624
		$account_submenu_item = array(
625
			'Account Settings',
626
			'read',
627
			'https://wordpress.com/me/account',
628
			'Account Settings',
629
		);
630
		$this->assertContains( $account_submenu_item, $submenu['https://wordpress.com/me'] );
631
		$this->assertArrayNotHasKey( 'profile.php', $submenu );
632
633
		// Reset.
634
		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...
635
		$menu = static::$menu_data;
636
637
		static::$admin_menu->add_users_menu( false );
638
639
		$slug = 'https://wordpress.com/people/team/' . static::$domain;
640
641
		$users_menu_item = array(
642
			'Users',
643
			'list_users',
644
			$slug,
645
			'Users',
646
			'menu-top toplevel_page_' . $slug,
647
			'toplevel_page_' . $slug,
648
			'dashicons-admin-users',
649
		);
650
		$this->assertSame( $menu[70], $users_menu_item );
651
		$this->assertEmpty( $submenu['users.php'] );
652
653
		$all_people_submenu_item = array(
654
			'All People',
655
			'list_users',
656
			$slug,
657
			'All People',
658
		);
659
		$this->assertContains( $all_people_submenu_item, $submenu[ $slug ] );
660
661
		$add_new_submenu_item = array(
662
			'Add New',
663
			'promote_users',
664
			'https://wordpress.com/people/new/' . static::$domain,
665
			'Add New',
666
		);
667
		$this->assertContains( $add_new_submenu_item, $submenu[ $slug ] );
668
669
		$profile_submenu_item = array(
670
			'My Profile',
671
			'read',
672
			'https://wordpress.com/me',
673
			'My Profile',
674
		);
675
		$this->assertContains( $profile_submenu_item, $submenu[ $slug ] );
676
677
		$account_submenu_item = array(
678
			'Account Settings',
679
			'read',
680
			'https://wordpress.com/me/account',
681
			'Account Settings',
682
		);
683
		$this->assertContains( $account_submenu_item, $submenu[ $slug ] );
684
	}
685
686
	/**
687
	 * Tests add_tools_menu
688
	 *
689
	 * @covers ::add_tools_menu
690
	 */
691
	public function test_add_tools_menu() {
692
		global $menu, $submenu;
693
694
		$slug = 'https://wordpress.com/marketing/tools/' . static::$domain;
695
		static::$admin_menu->add_tools_menu( false, false );
696
697
		$tools_menu_item = array(
698
			'Tools',
699
			'publish_posts',
700
			$slug,
701
			'Tools',
702
			'menu-top toplevel_page_' . $slug,
703
			'toplevel_page_' . $slug,
704
			'dashicons-admin-tools',
705
		);
706
707
		$this->assertSame( $menu[75], $tools_menu_item );
708
		$this->assertArrayNotHasKey( 'tools.php', $submenu );
709
710
		// Contains the following menu items.
711
712
		$marketing_submenu_item = array(
713
			'Marketing',
714
			'publish_posts',
715
			'https://wordpress.com/marketing/tools/' . static::$domain,
716
			'Marketing',
717
		);
718
		$this->assertContains( $marketing_submenu_item, $submenu[ $slug ] );
719
720
		$earn_submenu_item = array(
721
			'Earn',
722
			'manage_options',
723
			'https://wordpress.com/earn/' . static::$domain,
724
			'Earn',
725
		);
726
		$this->assertContains( $earn_submenu_item, $submenu[ $slug ] );
727
728
		$import_submenu_item = array(
729
			'Import',
730
			'import',
731
			'https://wordpress.com/import/' . static::$domain,
732
			'Import',
733
		);
734
		$this->assertContains( $import_submenu_item, $submenu[ $slug ] );
735
736
		$export_submenu_item = array(
737
			'Export',
738
			'export',
739
			'https://wordpress.com/export/' . static::$domain,
740
			'Export',
741
		);
742
		$this->assertContains( $export_submenu_item, $submenu[ $slug ] );
743
744
		$other_tools_submenu_item = array(
745
			'Other tools',
746
			'manage_options',
747
			'tools.php',
748
			'Other tools',
749
		);
750
		$this->assertContains( $other_tools_submenu_item, $submenu[ $slug ] );
751
752
		// NOT contains the following menu items.
753
754
		$import_submenu_item = array(
755
			'Import',
756
			'import',
757
			'import.php',
758
		);
759
		$this->assertNotContains( $import_submenu_item, $submenu[ $slug ] );
760
761
		$export_submenu_item = array(
762
			'Export',
763
			'export',
764
			'export.php',
765
		);
766
		$this->assertNotContains( $export_submenu_item, $submenu[ $slug ] );
767
	}
768
769
	/**
770
	 * Tests add_options_menu
771
	 *
772
	 * @covers ::add_options_menu
773
	 */
774
	public function test_add_options_menu() {
775
		global $submenu;
776
777
		$slug = 'https://wordpress.com/settings/general/' . static::$domain;
778
		static::$admin_menu->add_options_menu( false );
779
780
		$this->assertNotContains( 'options-discussion.php', $submenu[ $slug ] );
781
		$this->assertNotContains( 'options-writing.php', $submenu[ $slug ] );
782
783
		$general_submenu_item = array(
784
			'General',
785
			'manage_options',
786
			$slug,
787
			'General',
788
		);
789
		$this->assertContains( $general_submenu_item, $submenu[ $slug ] );
790
	}
791
792
	/**
793
	 * Tests add_jetpack_menu
794
	 *
795
	 * @covers ::add_jetpack_menu
796
	 */
797
	public function add_jetpack_menu() {
798
		global $menu, $submenu;
799
800
		$slug = 'https://wordpress.com/activity-log/' . static::$domain;
801
		static::$admin_menu->add_jetpack_menu();
802
803
		// TODO: Replace with proper SVG data url.
804
		$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";
805
806
		$jetpack_menu_item = array(
807
			'Jetpack',
808
			'manage_options',
809
			$slug,
810
			'Jetpack',
811
			'menu-top toplevel_page_' . $slug,
812
			'toplevel_page_' . $slug,
813
			$jetpack_icon,
814
		);
815
816
		$this->assertSame( $menu[50], $jetpack_menu_item );
817
		$this->assertArrayNotHasKey( 'jetpack', $submenu );
818
819
		// Contains the following menu items.
820
821
		$activity_log_submenu_item = array(
822
			'Activity Log',
823
			'manage_options',
824
			'https://wordpress.com/activity-log/' . static::$domain,
825
			'Activity Log',
826
		);
827
		$this->assertContains( $activity_log_submenu_item, $submenu[ $slug ] );
828
829
		$backup_submenu_item = array(
830
			'Backup',
831
			'manage_options',
832
			'https://wordpress.com/backup/' . static::$domain,
833
			'Backup',
834
		);
835
		$this->assertContains( $backup_submenu_item, $submenu[ $slug ] );
836
837
		$search_submenu_item = array(
838
			'Search',
839
			'read',
840
			'https://wordpress.com/jetpack-search/' . static::$domain,
841
			'Search',
842
		);
843
		$this->assertContains( $search_submenu_item, $submenu[ $slug ] );
844
845
		// NOT contains the following menu items.
846
847
		$stats_submenu_item = array(
848
			'Stats',
849
			'manage_options',
850
			'stats',
851
		);
852
		$this->assertNotContains( $stats_submenu_item, $submenu[ $slug ] );
853
854
		$backups_submenu_item = array(
855
			'Backup &amp; Scan',
856
			'manage_options',
857
			esc_url( Redirect::get_url( 'calypso-backups' ) ),
858
		);
859
		$this->assertNotContains( $backups_submenu_item, $submenu[ $slug ] );
860
	}
861
862
	/**
863
	 * Tests migrate_submenus
864
	 *
865
	 * @covers ::migrate_submenus
866
	 */
867
	public function test_migrate_submenus() {
868
		global $submenu;
869
870
		$new_slug = 'made-up-slug';
871
872
		// Start with a clean slate.
873
		$temp_submenu = $submenu;
874
		$submenu      = static::$submenu_data;
875
876
		// New slug doesn't exist yet.
877
		static::$admin_menu->migrate_submenus( 'edit.php', $new_slug );
878
		$this->assertArrayNotHasKey( 'edit.php', $submenu );
879
		$this->assertSame( static::$submenu_data['edit.php'], $submenu[ $new_slug ] );
880
881
		// New slug exists.
882
		static::$admin_menu->migrate_submenus( 'upload.php', $new_slug );
883
		$this->assertArrayNotHasKey( 'upload.php', $submenu );
884
		$expected = array_replace( static::$submenu_data['edit.php'], static::$submenu_data['upload.php'] );
885
		$this->assertSame( $expected, $submenu[ $new_slug ] );
886
887
		// Old slug doesn't exist.
888
		$this->assertArrayNotHasKey( 'unkown', $submenu );
889
		$pre_migration = $submenu;
890
		static::$admin_menu->migrate_submenus( 'unkown', $new_slug );
891
		$this->assertSame( $pre_migration, $submenu );
892
893
		// Slugs are the same.
894
		$this->assertArrayHasKey( 'index.php', $submenu );
895
		$pre_migration = $submenu;
896
		static::$admin_menu->migrate_submenus( 'index.php', 'index.php' );
897
		$this->assertSame( $pre_migration, $submenu );
898
899
		// Restore filtered $submenu.
900
		$submenu = $temp_submenu;
901
	}
902
}
903