Completed
Push — update/wpcom-block-editor-shor... ( 9897fe...f43ed6 )
by Jeremy
148:26 queued 138:20
created

Test_Admin_Menu::add_jetpack_menu()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 9
rs 9.9666
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\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, 30, 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();
171
172
		// Has My Home submenu item when there are other submenu items.
173
		$this->assertSame( 'https://wordpress.com/home/' . static::$domain, array_shift( $submenu['index.php'] )[2] );
174
175
		// Reset data.
176
		$menu    = static::$menu_data;
177
		$submenu = static::$submenu_data;
178
179
		// Has no ny Home submenu when there are no other submenus.
180
		$submenu['index.php'] = array(
181
			0 => array( 'Home', 'read', 'index.php' ),
182
		);
183
184
		static::$admin_menu->add_my_home_menu();
185
		$this->assertSame( 'https://wordpress.com/home/' . static::$domain, $menu[2][2] );
186
		$this->assertEmpty( $submenu['index.php'] );
187
	}
188
189
	/**
190
	 * Tests add_stats_menu
191
	 *
192
	 * @covers ::add_stats_menu
193
	 */
194
	public function test_add_stats_menu() {
195
		global $menu;
196
197
		static::$admin_menu->add_stats_menu();
198
199
		$this->assertSame( 'https://wordpress.com/stats/day/' . static::$domain, $menu['3.86682'][2] );
200
	}
201
202
	/**
203
	 * Tests add_upgrades_menu
204
	 *
205
	 * @covers ::add_upgrades_menu
206
	 */
207 View Code Duplication
	public function test_add_upgrades_menu() {
208
		global $submenu;
209
210
		static::$admin_menu->add_upgrades_menu();
211
212
		$this->assertSame( 'https://wordpress.com/plans/' . static::$domain, array_shift( $submenu['paid-upgrades.php'] )[2] );
213
		$this->assertSame( 'https://wordpress.com/purchases/subscriptions/' . static::$domain, array_shift( $submenu['paid-upgrades.php'] )[2] );
214
	}
215
216
	/**
217
	 * Tests add_posts_menu
218
	 *
219
	 * @covers ::add_posts_menu
220
	 */
221 View Code Duplication
	public function test_add_posts_menu() {
222
		global $submenu;
223
224
		static::$admin_menu->add_posts_menu();
225
226
		$this->assertSame( 'https://wordpress.com/posts/' . static::$domain, array_shift( $submenu['edit.php'] )[2] );
227
		$this->assertSame( 'https://wordpress.com/post/' . static::$domain, array_shift( $submenu['edit.php'] )[2] );
228
	}
229
230
	/**
231
	 * Tests add_media_menu
232
	 *
233
	 * @covers ::add_media_menu
234
	 */
235 View Code Duplication
	public function test_add_media_menu() {
236
		global $menu, $submenu;
237
238
		static::$admin_menu->add_media_menu();
239
240
		$this->assertSame( 'https://wordpress.com/media/' . static::$domain, $menu[10][2] );
241
		$this->assertEmpty( $submenu['upload.php'] );
242
	}
243
244
	/**
245
	 * Tests add_page_menu
246
	 *
247
	 * @covers ::add_page_menu
248
	 */
249 View Code Duplication
	public function test_add_page_menu() {
250
		global $submenu;
251
252
		static::$admin_menu->add_page_menu();
253
254
		$this->assertSame( 'https://wordpress.com/pages/' . static::$domain, array_shift( $submenu['edit.php?post_type=page'] )[2] );
255
		$this->assertSame( 'https://wordpress.com/page/' . static::$domain, array_shift( $submenu['edit.php?post_type=page'] )[2] );
256
	}
257
258
	/**
259
	 * Tests add_custom_post_type_menu
260
	 *
261
	 * @covers ::add_custom_post_type_menu
262
	 */
263
	public function test_add_custom_post_type_menu() {
264
		global $menu, $submenu;
265
266
		// Don't show post types that don't want to be shown.
267
		get_post_type_object( 'revision' );
268
		static::$admin_menu->add_custom_post_type_menu( 'revision' );
269
270
		$last_item = array_pop( $menu );
271
		$this->assertNotSame( 'https://wordpress.com/types/revision/' . static::$domain, $last_item[2] );
272
273
		register_post_type(
274
			'custom_test_type',
275
			array(
276
				'label'         => 'Custom Test Types',
277
				'show_ui'       => true,
278
				'menu_position' => 2020,
279
			)
280
		);
281
282
		static::$admin_menu->add_custom_post_type_menu( 'custom_test_type' );
283
284
		// Clean up.
285
		unregister_post_type( 'custom_test_type' );
286
287
		$this->assertSame( 'https://wordpress.com/types/custom_test_type/' . static::$domain, array_shift( $submenu['edit.php?post_type=custom_test_type'] )[2] );
288
		$this->assertSame( 'https://wordpress.com/edit/custom_test_type/' . static::$domain, array_shift( $submenu['edit.php?post_type=custom_test_type'] )[2] );
289
	}
290
291
	/**
292
	 * Tests add_comments_menu
293
	 *
294
	 * @covers ::add_comments_menu
295
	 */
296 View Code Duplication
	public function test_add_comments_menu() {
297
		global $menu, $submenu;
298
299
		static::$admin_menu->add_comments_menu();
300
301
		$this->assertSame( 'https://wordpress.com/comments/all/' . static::$domain, $menu[25][2] );
302
		$this->assertEmpty( $submenu['edit-comments.php'] );
303
	}
304
305
	/**
306
	 * Tests add_appearance_menu
307
	 *
308
	 * @covers ::add_appearance_menu
309
	 */
310 View Code Duplication
	public function test_add_appearance_menu() {
311
		global $submenu;
312
313
		static::$admin_menu->add_appearance_menu();
314
315
		$this->assertSame( 'https://wordpress.com/themes/' . static::$domain, array_shift( $submenu['themes.php'] )[2] );
316
		$this->assertSame( 'https://wordpress.com/customize/' . static::$domain, array_shift( $submenu['themes.php'] )[2] );
317
		$this->assertSame( 'https://wordpress.com/customize/' . static::$domain . '?autofocus%5Bpanel%5D=nav_menus', array_shift( $submenu['themes.php'] )[2] );
318
		$this->assertSame( 'https://wordpress.com/customize/' . static::$domain . '?autofocus%5Bpanel%5D=widgets', array_shift( $submenu['themes.php'] )[2] );
319
	}
320
321
	/**
322
	 * Tests add_plugins_menu
323
	 *
324
	 * @covers ::add_plugins_menu
325
	 */
326 View Code Duplication
	public function test_add_plugins_menu() {
327
		global $menu, $submenu;
328
329
		static::$admin_menu->add_plugins_menu();
330
331
		$this->assertSame( 'https://wordpress.com/plugins/' . static::$domain, $menu[65][2] );
332
		$this->assertEmpty( $submenu['plugins.php'] );
333
334
		// Reset.
335
		$menu    = static::$menu_data;
336
		$submenu = static::$submenu_data;
337
338
		// Check submenu are kept when using WP Admin links.
339
		static::$admin_menu->add_plugins_menu( true );
340
		$this->assertNotEmpty( $submenu['plugins.php'] );
341
	}
342
343
	/**
344
	 * Tests add_users_menu
345
	 *
346
	 * @covers ::add_users_menu
347
	 */
348
	public function test_add_users_menu() {
349
		global $menu, $submenu;
350
351
		// Current user can't list users.
352
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
353
		$menu    = array(
354
			70 => array(
355
				'Profile',
356
				'read',
357
				'profile.php',
358
				'',
359
				'menu-top menu-icon-users',
360
				'menu-users',
361
				'dashicons-admin-users',
362
			),
363
		);
364
		$submenu = array(
365
			'profile.php' => array(
366
				0 => array( 'Profile', 'read', 'profile.php' ),
367
			),
368
		);
369
370
		static::$admin_menu->add_users_menu();
371
372
		$this->assertSame( 'https://wordpress.com/me', array_shift( $submenu['profile.php'] )[2] );
373
		$this->assertSame( 'https://wordpress.com/me/account', array_shift( $submenu['profile.php'] )[2] );
374
375
		// Reset.
376
		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...
377
		$menu    = static::$menu_data;
378
		$submenu = static::$submenu_data;
379
380
		static::$admin_menu->add_users_menu();
381
382
		$this->assertSame( 'https://wordpress.com/people/team/' . static::$domain, array_shift( $submenu['users.php'] )[2] );
383
		$this->assertSame( 'https://wordpress.com/people/new/' . static::$domain, array_shift( $submenu['users.php'] )[2] );
384
		$this->assertSame( 'https://wordpress.com/me', array_shift( $submenu['users.php'] )[2] );
385
		$this->assertSame( 'https://wordpress.com/me/account', array_shift( $submenu['users.php'] )[2] );
386
	}
387
388
	/**
389
	 * Tests add_tools_menu
390
	 *
391
	 * @covers ::add_tools_menu
392
	 */
393 View Code Duplication
	public function test_add_tools_menu() {
394
		global $submenu;
395
396
		static::$admin_menu->add_tools_menu();
397
398
		$this->assertSame( 'https://wordpress.com/marketing/tools/' . static::$domain, array_shift( $submenu['tools.php'] )[2] );
399
		$this->assertSame( 'https://wordpress.com/earn/' . static::$domain, array_shift( $submenu['tools.php'] )[2] );
400
		$this->assertSame( 'https://wordpress.com/import/' . static::$domain, array_shift( $submenu['tools.php'] )[2] );
401
		$this->assertSame( 'https://wordpress.com/export/' . static::$domain, array_shift( $submenu['tools.php'] )[2] );
402
	}
403
404
	/**
405
	 * Tests add_options_menu
406
	 *
407
	 * @covers ::add_options_menu
408
	 */
409 View Code Duplication
	public function test_add_options_menu() {
410
		global $submenu;
411
412
		static::$admin_menu->add_options_menu();
413
414
		$this->assertSame( 'https://wordpress.com/settings/general/' . static::$domain, array_shift( $submenu['options-general.php'] )[2] );
415
	}
416
417
	/**
418
	 * Tests add_jetpack_menu
419
	 *
420
	 * @covers ::add_jetpack_menu
421
	 */
422
	public function add_jetpack_menu() {
423
		global $submenu;
424
425
		static::$admin_menu->add_jetpack_menu();
426
427
		$this->assertSame( 'https://wordpress.com/activity-log/' . static::$domain, $submenu['jetpack'][2][2] );
428
		$this->assertSame( 'https://wordpress.com/backup/' . static::$domain, $submenu['jetpack'][3][2] );
429
		$this->assertSame( 'https://wordpress.com/jetpack-search/' . static::$domain, $submenu['jetpack'][4][2] );
430
	}
431
}
432