Completed
Push — fix/markdown-parser-breaking-s... ( 6ae5e6...f00a12 )
by Jeremy
222:51 queued 212:00
created

Test_Admin_Menu::wpSetUpBeforeClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 6
Ratio 100 %

Importance

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