Completed
Push — update/improve-stats-widget ( 108ed5...efa494 )
by Jeremy
60:09 queued 47:39
created

Test_Admin_Menu::test_add_media_menu()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 8
Ratio 100 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 8
loc 8
rs 10
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\Dashboard_Customizations\Base_Admin_Menu;
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_Admin_Menu.
87
	 *
88
	 * @covers ::reregister_menu_items
89
	 */
90
	public function test_admin_menu_output() {
91
		global $menu, $submenu;
92
93
		static::$admin_menu->reregister_menu_items();
94
95
		$this->assertSame(
96
			array_keys( $menu ),
97
			array( 2, '3.86682', 4, 5, 10, 15, 20, 25, 30, 50, 51, 59, 60, 61, 65, 70, 75, 80 ),
98
			'Admin menu should not have unexpected top menu items.'
99
		);
100
101
		$this->assertEquals( static::$submenu_data[''], $submenu[''], 'Submenu items without parent should stay the same.' );
102
	}
103
104
	/**
105
	 * Shim wpcomsh fallback site icon.
106
	 *
107
	 * @return string
108
	 */
109
	public function wpcomsh_site_icon_url() {
110
		return 'https://s0.wp.com/i/webclip.png';
111
	}
112
113
	/**
114
	 * Custom site icon.
115
	 *
116
	 * @return string
117
	 */
118
	public function custom_site_icon_url() {
119
		return 'https://s0.wp.com/i/jetpack.png';
120
	}
121
122
	/**
123
	 * Tests add_my_home_menu
124
	 *
125
	 * @covers ::add_my_home_menu
126
	 */
127
	public function test_add_my_home_menu() {
128
		global $menu, $submenu;
129
130
		static::$admin_menu->add_my_home_menu();
131
132
		// Has My Home submenu item when there are other submenu items.
133
		$this->assertSame( 'https://wordpress.com/home/' . static::$domain, array_shift( $submenu['index.php'] )[2] );
134
135
		// Reset data.
136
		$menu    = static::$menu_data;
137
		$submenu = static::$submenu_data;
138
139
		// Has no ny Home submenu when there are no other submenus.
140
		$submenu['index.php'] = array(
141
			0 => array( 'Home', 'read', 'index.php' ),
142
		);
143
144
		static::$admin_menu->add_my_home_menu();
145
146
		$this->assertSame( 'https://wordpress.com/home/' . static::$domain, $menu[2][2] );
147
		$this->assertSame( Base_Admin_Menu::HIDE_CSS_CLASS, $submenu['index.php'][0][4] );
148
	}
149
150
	/**
151
	 * Tests add_stats_menu
152
	 *
153
	 * @covers ::add_stats_menu
154
	 */
155
	public function test_add_stats_menu() {
156
		global $menu;
157
158
		static::$admin_menu->add_stats_menu();
159
160
		$this->assertSame( 'https://wordpress.com/stats/day/' . static::$domain, $menu['3.86682'][2] );
161
	}
162
163
	/**
164
	 * Tests add_upgrades_menu
165
	 *
166
	 * @covers ::add_upgrades_menu
167
	 */
168 View Code Duplication
	public function test_add_upgrades_menu() {
169
		global $submenu;
170
171
		static::$admin_menu->add_upgrades_menu( 'Test Plan' );
172
173
		$this->assertSame( 'Upgrades<span class="inline-text" style="display:none">Test Plan</span>', $submenu['paid-upgrades.php'][0][0] );
174
		$this->assertSame( 'https://wordpress.com/plans/my-plan/' . static::$domain, $submenu['paid-upgrades.php'][1][2] );
175
		$this->assertSame( 'https://wordpress.com/purchases/subscriptions/' . static::$domain, $submenu['paid-upgrades.php'][2][2] );
176
	}
177
178
	/**
179
	 * Tests add_posts_menu
180
	 *
181
	 * @covers ::add_posts_menu
182
	 */
183 View Code Duplication
	public function test_add_posts_menu() {
184
		global $submenu;
185
186
		static::$admin_menu->add_posts_menu();
187
188
		$this->assertSame( 'https://wordpress.com/posts/' . static::$domain, $submenu['edit.php'][0][2] );
189
		$this->assertSame( 'https://wordpress.com/post/' . static::$domain, $submenu['edit.php'][1][2] );
190
	}
191
192
	/**
193
	 * Tests add_media_menu
194
	 *
195
	 * @covers ::add_media_menu
196
	 */
197 View Code Duplication
	public function test_add_media_menu() {
198
		global $menu, $submenu;
199
200
		static::$admin_menu->add_media_menu();
201
202
		$this->assertSame( 'https://wordpress.com/media/' . static::$domain, $menu[10][2] );
203
		$this->assertFalse( static::$admin_menu->has_visible_items( $submenu['upload.php'] ) );
204
	}
205
206
	/**
207
	 * Tests add_page_menu
208
	 *
209
	 * @covers ::add_page_menu
210
	 */
211 View Code Duplication
	public function test_add_page_menu() {
212
		global $submenu;
213
214
		static::$admin_menu->add_page_menu();
215
216
		$this->assertSame( 'https://wordpress.com/pages/' . static::$domain, $submenu['edit.php?post_type=page'][0][2] );
217
		$this->assertSame( 'https://wordpress.com/page/' . static::$domain, $submenu['edit.php?post_type=page'][1][2] );
218
	}
219
220
	/**
221
	 * Tests add_custom_post_type_menu
222
	 *
223
	 * @covers ::add_custom_post_type_menu
224
	 */
225
	public function test_add_custom_post_type_menu() {
226
		global $menu, $submenu;
227
228
		// Don't show post types that don't want to be shown.
229
		get_post_type_object( 'revision' );
230
		static::$admin_menu->add_custom_post_type_menu( 'revision' );
231
232
		$last_item = array_pop( $menu );
233
		$this->assertNotSame( 'https://wordpress.com/types/revision/' . static::$domain, $last_item[2] );
234
235
		register_post_type(
236
			'custom_test_type',
237
			array(
238
				'label'         => 'Custom Test Types',
239
				'show_ui'       => true,
240
				'menu_position' => 2020,
241
			)
242
		);
243
244
		static::$admin_menu->add_custom_post_type_menu( 'custom_test_type' );
245
246
		// Clean up.
247
		unregister_post_type( 'custom_test_type' );
248
249
		$this->assertSame( 'https://wordpress.com/types/custom_test_type/' . static::$domain, array_shift( $submenu['edit.php?post_type=custom_test_type'] )[2] );
250
		$this->assertSame( 'https://wordpress.com/edit/custom_test_type/' . static::$domain, array_shift( $submenu['edit.php?post_type=custom_test_type'] )[2] );
251
	}
252
253
	/**
254
	 * Tests add_comments_menu
255
	 *
256
	 * @covers ::add_comments_menu
257
	 */
258 View Code Duplication
	public function test_add_comments_menu() {
259
		global $menu, $submenu;
260
261
		static::$admin_menu->add_comments_menu();
262
263
		$this->assertSame( 'https://wordpress.com/comments/all/' . static::$domain, $menu[25][2] );
264
		$this->assertFalse( self::$admin_menu->has_visible_items( $submenu['edit-comments.php'] ) );
265
	}
266
267
	/**
268
	 * Tests add_appearance_menu
269
	 *
270
	 * @covers ::add_appearance_menu
271
	 */
272
	public function test_add_appearance_menu() {
273
		global $submenu;
274
275
		static::$admin_menu->add_appearance_menu();
276
277
		$this->assertSame( 'https://wordpress.com/themes/' . static::$domain, array_shift( $submenu['themes.php'] )[2] );
278
		$this->assertSame( 'https://wordpress.com/customize/' . static::$domain, array_shift( $submenu['themes.php'] )[2] );
279
		$this->assertSame( 'https://wordpress.com/customize/' . static::$domain . '?autofocus%5Bpanel%5D=nav_menus', array_shift( $submenu['themes.php'] )[2] );
280
		$this->assertSame( 'https://wordpress.com/customize/' . static::$domain . '?autofocus%5Bpanel%5D=widgets', array_shift( $submenu['themes.php'] )[2] );
281
	}
282
283
	/**
284
	 * Tests add_plugins_menu
285
	 *
286
	 * @covers ::add_plugins_menu
287
	 */
288
	public function test_add_plugins_menu() {
289
		global $menu, $submenu;
290
291
		static::$admin_menu->add_plugins_menu();
292
293
		$this->assertSame( 'https://wordpress.com/plugins/' . static::$domain, $menu[65][2] );
294
		$this->assertFalse( self::$admin_menu->has_visible_items( $submenu['plugins.php'] ) );
295
296
		// Reset.
297
		$menu    = static::$menu_data;
298
		$submenu = static::$submenu_data;
299
300
		// Check submenu are kept when using WP Admin links.
301
		static::$admin_menu->add_plugins_menu( true );
302
		$this->assertNotEmpty( $submenu['plugins.php'] );
303
	}
304
305
	/**
306
	 * Tests add_users_menu
307
	 *
308
	 * @covers ::add_users_menu
309
	 */
310
	public function test_add_users_menu() {
311
		global $menu, $submenu;
312
313
		// Current user can't list users.
314
		wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
315
		$menu    = array(
316
			70 => array(
317
				'Profile',
318
				'read',
319
				'profile.php',
320
				'',
321
				'menu-top menu-icon-users',
322
				'menu-users',
323
				'dashicons-admin-users',
324
			),
325
		);
326
		$submenu = array(
327
			'profile.php' => array(
328
				0 => array( 'Profile', 'read', 'profile.php' ),
329
			),
330
		);
331
332
		static::$admin_menu->add_users_menu();
333
334
		$this->assertSame( 'https://wordpress.com/me', $submenu['profile.php'][0][2] );
335
		$this->assertSame( 'https://wordpress.com/me/account', $submenu['profile.php'][2][2] );
336
337
		// Reset.
338
		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...
339
		$menu    = static::$menu_data;
340
		$submenu = static::$submenu_data;
341
342
		// On multisite the administrator is not allowed to create users.
343
		grant_super_admin( self::$user_id );
344
		static::$admin_menu->add_users_menu();
345
346
		$this->assertSame( 'https://wordpress.com/people/team/' . static::$domain, $submenu['users.php'][0][2] );
347
		$this->assertSame( 'https://wordpress.com/people/new/' . static::$domain, $submenu['users.php'][1][2] );
348
		$this->assertSame( 'https://wordpress.com/me', $submenu['users.php'][2][2] );
349
		$this->assertSame( 'https://wordpress.com/me/account', $submenu['users.php'][6][2] );
350
	}
351
352
	/**
353
	 * Tests add_tools_menu
354
	 *
355
	 * @covers ::add_tools_menu
356
	 */
357
	public function test_add_tools_menu() {
358
		global $submenu;
359
360
		static::$admin_menu->add_tools_menu();
361
362
		$this->assertSame( 'https://wordpress.com/marketing/tools/' . static::$domain, $submenu['tools.php'][0][2] );
363
		$this->assertSame( 'https://wordpress.com/earn/' . static::$domain, $submenu['tools.php'][1][2] );
364
		$this->assertSame( 'https://wordpress.com/import/' . static::$domain, $submenu['tools.php'][3][2] );
365
		$this->assertSame( 'https://wordpress.com/export/' . static::$domain, $submenu['tools.php'][4][2] );
366
	}
367
368
	/**
369
	 * Tests add_options_menu
370
	 *
371
	 * @covers ::add_options_menu
372
	 */
373 View Code Duplication
	public function test_add_options_menu() {
374
		global $submenu;
375
376
		static::$admin_menu->add_options_menu();
377
378
		$this->assertSame( 'https://wordpress.com/settings/general/' . static::$domain, array_shift( $submenu['options-general.php'] )[2] );
379
	}
380
381
	/**
382
	 * Tests add_jetpack_menu
383
	 *
384
	 * @covers ::add_jetpack_menu
385
	 */
386 View Code Duplication
	public function test_add_jetpack_menu() {
387
		global $submenu;
388
389
		static::$admin_menu->add_jetpack_menu();
390
391
		$this->assertSame( 'https://wordpress.com/activity-log/' . static::$domain, $submenu['jetpack'][3][2] );
392
		$this->assertSame( 'https://wordpress.com/backup/' . static::$domain, $submenu['jetpack'][4][2] );
393
		$this->assertSame( 'https://wordpress.com/jetpack-search/' . static::$domain, $submenu['jetpack'][5][2] );
394
	}
395
396
	/**
397
	 * Tests add_gutenberg_menus
398
	 *
399
	 * @covers ::add_gutenberg_menus
400
	 */
401
	public function test_add_gutenberg_menus() {
402
		global $menu;
403
		static::$admin_menu->add_gutenberg_menus( false );
404
405
		// FSE is no longer where it was put by default.
406
		$this->assertArrayNotHasKey( 100, $menu );
407
		$this->assertArrayHasKey( 61, $menu );
408
409
		$fse_link = 'https://wordpress.com/site-editor/' . static::$domain;
410
		$fse_menu = array(
411
			'Site Editor',
412
			'edit_theme_options',
413
			$fse_link,
414
			'Site Editor',
415
			'menu-top toplevel_page_' . $fse_link,
416
			'toplevel_page_' . $fse_link,
417
			'dashicons-layout',
418
		);
419
		$this->assertSame( $menu[61], $fse_menu );
420
	}
421
}
422