Completed
Push — update/node-version ( 857559...c25464 )
by Jeremy
313:10 queued 285:45
created

Test_Admin_Menu::test_add_appearance_menu()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 10
Ratio 100 %

Importance

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