Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
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' ) ); |
||
|
|||
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 ); |
||
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, 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( false ); |
||
171 | |||
172 | $slug = 'https://wordpress.com/home/' . static::$domain; |
||
173 | |||
174 | $my_home_menu_item = array( |
||
175 | 'My Home', |
||
176 | 'manage_options', |
||
177 | $slug, |
||
178 | 'My Home', |
||
179 | 'menu-top toplevel_page_' . $slug, |
||
180 | 'toplevel_page_' . $slug, |
||
181 | 'dashicons-admin-home', |
||
182 | ); |
||
183 | $this->assertSame( $menu[2], $my_home_menu_item ); |
||
184 | |||
185 | // Has My Home submenu item when there are other submenu items. |
||
186 | $my_home_submenu_item = array( |
||
187 | 'My Home', |
||
188 | 'manage_options', |
||
189 | $slug, |
||
190 | 'My Home', |
||
191 | ); |
||
192 | $this->assertContains( $my_home_submenu_item, $submenu[ $slug ] ); |
||
193 | // Reset data. |
||
194 | $menu = static::$menu_data; |
||
195 | $submenu = static::$submenu_data; |
||
196 | |||
197 | // Has no ny Home submenu when there are no other submenus. |
||
198 | $submenu['index.php'] = array( |
||
199 | 0 => array( 'Home', 'read', 'index.php' ), |
||
200 | ); |
||
201 | |||
202 | static::$admin_menu->add_my_home_menu( false ); |
||
203 | |||
204 | $this->assertArrayNotHasKey( 'https://wordpress.com/home/' . static::$domain, $submenu ); |
||
205 | } |
||
206 | |||
207 | /** |
||
208 | * Tests add_stats_menu |
||
209 | * |
||
210 | * @covers ::add_stats_menu |
||
211 | */ |
||
212 | public function test_add_stats_menu() { |
||
213 | global $menu, $submenu; |
||
214 | |||
215 | static::$admin_menu->add_stats_menu(); |
||
216 | |||
217 | $menu_title = __( 'Stats', 'jetpack' ); |
||
218 | |||
219 | if ( ! defined( 'TESTING_IN_JETPACK' ) || ! TESTING_IN_JETPACK ) { |
||
220 | $menu_title .= sprintf( |
||
221 | '<img class="sidebar-unified__sparkline" width="80" height="20" src="%1$s" alt="%2$s">', |
||
222 | esc_url( home_url( 'wp-includes/charts/admin-bar-hours-scale-2x.php?masterbar=1&s=' . get_current_blog_id() ) ), |
||
223 | esc_attr__( 'Hourly views', 'jetpack' ) |
||
224 | ); |
||
225 | } |
||
226 | $stats_menu_item = array( |
||
227 | $menu_title, |
||
228 | 'view_stats', |
||
229 | 'https://wordpress.com/stats/day/' . static::$domain, |
||
230 | 'Stats', |
||
231 | 'menu-top toplevel_page_https://wordpress.com/stats/day/' . static::$domain, |
||
232 | 'toplevel_page_https://wordpress.com/stats/day/' . static::$domain, |
||
233 | 'dashicons-chart-bar', |
||
234 | ); |
||
235 | |||
236 | $this->assertSame( $menu['3.86682'], $stats_menu_item ); |
||
237 | $this->assertArrayNotHasKey( 'https://wordpress.com/stats/day/' . static::$domain, $submenu ); |
||
238 | } |
||
239 | |||
240 | /** |
||
241 | * Tests add_upgrades_menu |
||
242 | * |
||
243 | * @covers ::add_upgrades_menu |
||
244 | */ |
||
245 | public function test_add_wpcom_upgrades_menu() { |
||
246 | global $menu, $submenu; |
||
247 | |||
248 | static::$admin_menu->add_upgrades_menu(); |
||
249 | |||
250 | $slug = 'https://wordpress.com/plans/' . static::$domain; |
||
251 | |||
252 | $upgrades_menu_item = array( |
||
253 | 'Upgrades', |
||
254 | 'manage_options', |
||
255 | $slug, |
||
256 | 'Upgrades', |
||
257 | 'menu-top toplevel_page_https://wordpress.com/plans/' . static::$domain, |
||
258 | 'toplevel_page_https://wordpress.com/plans/' . static::$domain, |
||
259 | 'dashicons-cart', |
||
260 | ); |
||
261 | $this->assertSame( $menu['4.80608'], $upgrades_menu_item ); |
||
262 | |||
263 | $plans_submenu_item = array( |
||
264 | 'Plans', |
||
265 | 'manage_options', |
||
266 | $slug, |
||
267 | 'Plans', |
||
268 | ); |
||
269 | $this->assertContains( $plans_submenu_item, $submenu[ $slug ] ); |
||
270 | |||
271 | $purchases_submenu_item = array( |
||
272 | 'Purchases', |
||
273 | 'manage_options', |
||
274 | 'https://wordpress.com/purchases/subscriptions/' . static::$domain, |
||
275 | 'Purchases', |
||
276 | ); |
||
277 | $this->assertContains( $purchases_submenu_item, $submenu[ $slug ] ); |
||
278 | } |
||
279 | |||
280 | /** |
||
281 | * Tests add_jetpack_upgrades_menu |
||
282 | * |
||
283 | * @covers ::add_jetpack_upgrades_menu |
||
284 | */ |
||
285 | View Code Duplication | public function test_add_jetpack_upgrades_menu() { |
|
286 | global $menu, $submenu; |
||
287 | |||
288 | static::$admin_menu->add_upgrades_menu(); |
||
289 | |||
290 | $slug = 'https://wordpress.com/plans/' . static::$domain; |
||
291 | |||
292 | $upgrades_menu_item = array( |
||
293 | 'Upgrades', |
||
294 | 'manage_options', |
||
295 | $slug, |
||
296 | 'Upgrades', |
||
297 | 'menu-top toplevel_page_https://wordpress.com/plans/' . static::$domain, |
||
298 | 'toplevel_page_https://wordpress.com/plans/' . static::$domain, |
||
299 | 'dashicons-cart', |
||
300 | ); |
||
301 | $this->assertSame( $menu['4.80608'], $upgrades_menu_item ); |
||
302 | $this->assertArrayNotHasKey( 'https://wordpress.com/domains/manage/' . static::$domain, $submenu ); |
||
303 | } |
||
304 | |||
305 | /** |
||
306 | * Tests add_posts_menu |
||
307 | * |
||
308 | * @covers ::add_posts_menu |
||
309 | */ |
||
310 | View Code Duplication | public function test_add_posts_menu() { |
|
311 | global $menu, $submenu; |
||
312 | |||
313 | static::$admin_menu->add_posts_menu( false ); |
||
314 | |||
315 | $posts_menu_item = array( |
||
316 | 'Posts', |
||
317 | 'edit_posts', |
||
318 | 'https://wordpress.com/posts/' . static::$domain, |
||
319 | 'Posts', |
||
320 | 'menu-top toplevel_page_https://wordpress.com/posts/' . static::$domain, |
||
321 | 'toplevel_page_https://wordpress.com/posts/' . static::$domain, |
||
322 | 'dashicons-admin-post', |
||
323 | ); |
||
324 | |||
325 | $this->assertSame( $menu[5], $posts_menu_item ); |
||
326 | $this->assertArrayNotHasKey( 'edit.php', $submenu ); |
||
327 | } |
||
328 | |||
329 | /** |
||
330 | * Tests add_media_menu |
||
331 | * |
||
332 | * @covers ::add_media_menu |
||
333 | */ |
||
334 | public function test_add_media_menu() { |
||
335 | global $menu, $submenu; |
||
336 | |||
337 | static::$admin_menu->add_media_menu( false ); |
||
338 | |||
339 | $slug = 'https://wordpress.com/media/' . static::$domain; |
||
340 | |||
341 | $media_menu_item = array( |
||
342 | 'Media', |
||
343 | 'upload_files', |
||
344 | $slug, |
||
345 | 'Media', |
||
346 | 'menu-top toplevel_page_' . $slug, |
||
347 | 'toplevel_page_' . $slug, |
||
348 | 'dashicons-admin-media', |
||
349 | ); |
||
350 | |||
351 | $this->assertSame( $menu[10], $media_menu_item ); |
||
352 | $this->assertArrayNotHasKey( $slug, $submenu ); |
||
353 | |||
354 | $library_submenu_item = array( |
||
355 | 'Library', |
||
356 | 'upload_files', |
||
357 | 'upload.php', |
||
358 | ); |
||
359 | $this->assertNotContains( $library_submenu_item, $submenu['upload.php'] ); |
||
360 | |||
361 | $add_new_submenu_item = array( |
||
362 | 'Add New', |
||
363 | 'upload_files', |
||
364 | 'media-new.php', |
||
365 | ); |
||
366 | $this->assertNotContains( $add_new_submenu_item, $submenu['upload.php'] ); |
||
367 | } |
||
368 | |||
369 | /** |
||
370 | * Tests add_page_menu |
||
371 | * |
||
372 | * @covers ::add_page_menu |
||
373 | */ |
||
374 | View Code Duplication | public function test_add_page_menu() { |
|
375 | global $menu, $submenu; |
||
376 | |||
377 | static::$admin_menu->add_page_menu( false ); |
||
378 | |||
379 | $posts_menu_item = array( |
||
380 | 'Pages', |
||
381 | 'edit_pages', |
||
382 | 'https://wordpress.com/pages/' . static::$domain, |
||
383 | 'Pages', |
||
384 | 'menu-top toplevel_page_https://wordpress.com/pages/' . static::$domain, |
||
385 | 'toplevel_page_https://wordpress.com/pages/' . static::$domain, |
||
386 | 'dashicons-admin-page', |
||
387 | ); |
||
388 | |||
389 | $this->assertSame( $menu[20], $posts_menu_item ); |
||
390 | $this->assertEmpty( $submenu['edit.php?post_type=page'] ); |
||
391 | } |
||
392 | |||
393 | /** |
||
394 | * Tests add_custom_post_type_menu |
||
395 | * |
||
396 | * @covers ::add_custom_post_type_menu |
||
397 | */ |
||
398 | public function test_add_custom_post_type_menu() { |
||
399 | global $menu, $submenu; |
||
400 | |||
401 | // Don't show post types that don't want to be shown. |
||
402 | $revision = get_post_type_object( 'revision' ); |
||
403 | static::$admin_menu->add_custom_post_type_menu( $revision, false ); |
||
404 | |||
405 | $last_item = array_pop( $menu ); |
||
406 | $this->assertNotSame( 'https://wordpress.com/types/revision/' . static::$domain, $last_item[2] ); |
||
407 | |||
408 | register_post_type( |
||
409 | 'custom_test_type', |
||
410 | array( |
||
411 | 'label' => 'Custom Test Types', |
||
412 | 'show_ui' => true, |
||
413 | 'menu_position' => 2020, |
||
414 | ) |
||
415 | ); |
||
416 | static::$admin_menu->add_custom_post_type_menu( 'custom_test_type', false ); |
||
417 | |||
418 | // Clean up. |
||
419 | unregister_post_type( 'custom_test_type' ); |
||
420 | |||
421 | $slug = 'https://wordpress.com/types/custom_test_type/' . static::$domain; |
||
422 | |||
423 | $custom_menu_item = array( |
||
424 | 'Custom Test Types', |
||
425 | 'edit_posts', |
||
426 | $slug, |
||
427 | 'Custom Test Types', |
||
428 | 'menu-top toplevel_page_' . $slug, |
||
429 | 'toplevel_page_' . $slug, |
||
430 | 'dashicons-admin-post', |
||
431 | ); |
||
432 | |||
433 | $this->assertSame( $menu[2020], $custom_menu_item ); |
||
434 | |||
435 | $custom_submenu_item = array( |
||
436 | 'Custom Test Types', |
||
437 | 'edit_posts', |
||
438 | 'https://wordpress.com/types/custom_test_type/' . static::$domain, |
||
439 | 'Custom Test Types', |
||
440 | ); |
||
441 | $this->assertContains( $custom_submenu_item, $submenu[ $slug ] ); |
||
442 | |||
443 | $add_new_submenu_item = array( |
||
444 | 'Add New', |
||
445 | 'edit_posts', |
||
446 | 'https://wordpress.com/edit/custom_test_type/' . static::$domain, |
||
447 | 'Add New', |
||
448 | ); |
||
449 | $this->assertContains( $add_new_submenu_item, $submenu[ $slug ] ); |
||
450 | } |
||
451 | |||
452 | /** |
||
453 | * Tests add_comments_menu |
||
454 | * |
||
455 | * @covers ::add_comments_menu |
||
456 | */ |
||
457 | public function test_add_comments_menu() { |
||
458 | global $menu, $submenu; |
||
459 | |||
460 | // Only users that can edit posts get to see the comments menu. |
||
461 | wp_set_current_user( $this->factory->user->create( array( 'role' => 'subscriber' ) ) ); |
||
462 | $menu = array(); |
||
463 | static::$admin_menu->add_comments_menu( false ); |
||
464 | $this->assertEmpty( $menu ); |
||
465 | |||
466 | // Reset. |
||
467 | wp_set_current_user( static::$user_id ); |
||
468 | $menu = static::$menu_data; |
||
469 | |||
470 | static::$admin_menu->add_comments_menu( false ); |
||
471 | |||
472 | $comments_menu_item = array( |
||
473 | '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>', |
||
474 | 'edit_posts', |
||
475 | 'https://wordpress.com/comments/all/' . static::$domain, |
||
476 | 'Comments', |
||
477 | 'menu-top toplevel_page_https://wordpress.com/comments/all/' . static::$domain, |
||
478 | 'toplevel_page_https://wordpress.com/comments/all/' . static::$domain, |
||
479 | 'dashicons-admin-comments', |
||
480 | ); |
||
481 | |||
482 | $this->assertSame( $menu[25], $comments_menu_item ); |
||
483 | $this->assertEmpty( $submenu['edit-comments.php'] ); |
||
484 | } |
||
485 | |||
486 | /** |
||
487 | * Tests add_appearance_menu |
||
488 | * |
||
489 | * @covers ::add_appearance_menu |
||
490 | */ |
||
491 | public function test_add_appearance_menu() { |
||
492 | global $menu, $submenu; |
||
493 | $customize_slug = 'customize.php'; |
||
494 | static::$admin_menu->add_appearance_menu( false ); |
||
495 | |||
496 | $slug = 'https://wordpress.com/themes/' . static::$domain; |
||
497 | |||
498 | $appearance_menu_item = array( |
||
499 | 'Appearance', |
||
500 | 'switch_themes', |
||
501 | $slug, |
||
502 | 'Appearance', |
||
503 | 'menu-top toplevel_page_' . $slug, |
||
504 | 'menu-appearance', |
||
505 | 'dashicons-admin-appearance', |
||
506 | ); |
||
507 | |||
508 | $this->assertSame( $menu[60], $appearance_menu_item ); |
||
509 | $this->assertArrayNotHasKey( 'themes.php', $submenu ); |
||
510 | |||
511 | $themes_submenu_item = array( |
||
512 | 'Themes', |
||
513 | 'switch_themes', |
||
514 | 'https://wordpress.com/themes/' . static::$domain, |
||
515 | 'Themes', |
||
516 | ); |
||
517 | $this->assertContains( $themes_submenu_item, $submenu[ $slug ] ); |
||
518 | |||
519 | $customize_submenu_item = array( |
||
520 | 'Customize', |
||
521 | 'customize', |
||
522 | $customize_slug, |
||
523 | 'Customize', |
||
524 | ); |
||
525 | |||
526 | $this->assertContains( $customize_submenu_item, $submenu[ $slug ] ); |
||
527 | |||
528 | $widgets_submenu_item = array( |
||
529 | 'Widgets', |
||
530 | 'customize', |
||
531 | $customize_slug . '?autofocus%5Bpanel%5D=widgets', |
||
532 | 'Widgets', |
||
533 | ); |
||
534 | $this->assertContains( $widgets_submenu_item, $submenu[ $slug ] ); |
||
535 | |||
536 | $menus_submenu_item = array( |
||
537 | 'Menus', |
||
538 | 'customize', |
||
539 | $customize_slug . '?autofocus%5Bpanel%5D=nav_menus', |
||
540 | 'Menus', |
||
541 | ); |
||
542 | $this->assertContains( $menus_submenu_item, $submenu[ $slug ] ); |
||
543 | } |
||
544 | |||
545 | /** |
||
546 | * Tests add_plugins_menu |
||
547 | * |
||
548 | * @covers ::add_plugins_menu |
||
549 | */ |
||
550 | public function test_add_plugins_menu() { |
||
574 | |||
575 | /** |
||
576 | * Filters the returned array of update data for plugins, themes, and WordPress core. |
||
577 | */ |
||
578 | public function mock_update_data() { |
||
589 | |||
590 | /** |
||
591 | * Tests add_users_menu |
||
592 | * |
||
593 | * @covers ::add_users_menu |
||
594 | */ |
||
595 | public function test_add_users_menu() { |
||
596 | global $menu, $submenu; |
||
597 | |||
598 | // Current user can't list users. |
||
599 | wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) ); |
||
600 | $menu = array(); |
||
601 | |||
602 | static::$admin_menu->add_users_menu( false ); |
||
603 | |||
604 | $this->assertEmpty( $menu ); |
||
605 | |||
606 | // Reset. |
||
607 | wp_set_current_user( static::$user_id ); |
||
608 | $menu = static::$menu_data; |
||
609 | |||
610 | static::$admin_menu->add_users_menu( false ); |
||
611 | |||
612 | $slug = 'https://wordpress.com/people/team/' . static::$domain; |
||
613 | |||
614 | $users_menu_item = array( |
||
615 | 'Users', |
||
616 | 'list_users', |
||
617 | $slug, |
||
618 | 'Users', |
||
619 | 'menu-top toplevel_page_' . $slug, |
||
620 | 'toplevel_page_' . $slug, |
||
621 | 'dashicons-admin-users', |
||
622 | ); |
||
623 | $this->assertSame( $menu[70], $users_menu_item ); |
||
624 | $this->assertEmpty( $submenu['users.php'] ); |
||
625 | |||
626 | $all_people_submenu_item = array( |
||
627 | 'All People', |
||
628 | 'list_users', |
||
629 | $slug, |
||
630 | 'All People', |
||
631 | ); |
||
632 | $this->assertContains( $all_people_submenu_item, $submenu[ $slug ] ); |
||
633 | |||
634 | $add_new_submenu_item = array( |
||
635 | 'Add New', |
||
636 | 'promote_users', |
||
637 | 'https://wordpress.com/people/new/' . static::$domain, |
||
638 | 'Add New', |
||
639 | ); |
||
640 | $this->assertContains( $add_new_submenu_item, $submenu[ $slug ] ); |
||
641 | |||
642 | $profile_submenu_item = array( |
||
643 | 'My Profile', |
||
644 | 'read', |
||
645 | 'https://wordpress.com/me', |
||
646 | 'My Profile', |
||
647 | ); |
||
648 | $this->assertContains( $profile_submenu_item, $submenu[ $slug ] ); |
||
649 | |||
650 | $account_submenu_item = array( |
||
651 | 'Account Settings', |
||
652 | 'read', |
||
653 | 'https://wordpress.com/me/account', |
||
654 | 'Account Settings', |
||
655 | ); |
||
656 | $this->assertContains( $account_submenu_item, $submenu[ $slug ] ); |
||
657 | } |
||
658 | |||
659 | /** |
||
660 | * Tests add_tools_menu |
||
661 | * |
||
662 | * @covers ::add_tools_menu |
||
663 | */ |
||
664 | public function test_add_tools_menu() { |
||
665 | global $menu, $submenu; |
||
666 | |||
667 | $slug = 'https://wordpress.com/marketing/tools/' . static::$domain; |
||
668 | static::$admin_menu->add_tools_menu( false, false ); |
||
669 | |||
670 | $tools_menu_item = array( |
||
671 | 'Tools', |
||
672 | 'publish_posts', |
||
673 | $slug, |
||
674 | 'Tools', |
||
675 | 'menu-top toplevel_page_' . $slug, |
||
676 | 'toplevel_page_' . $slug, |
||
677 | 'dashicons-admin-tools', |
||
678 | ); |
||
679 | |||
680 | $this->assertSame( $menu[75], $tools_menu_item ); |
||
681 | $this->assertArrayNotHasKey( 'tools.php', $submenu ); |
||
682 | |||
683 | // Contains the following menu items. |
||
684 | |||
685 | $marketing_submenu_item = array( |
||
686 | 'Marketing', |
||
687 | 'publish_posts', |
||
688 | 'https://wordpress.com/marketing/tools/' . static::$domain, |
||
689 | 'Marketing', |
||
690 | ); |
||
691 | $this->assertContains( $marketing_submenu_item, $submenu[ $slug ] ); |
||
692 | |||
693 | $earn_submenu_item = array( |
||
694 | 'Earn', |
||
695 | 'manage_options', |
||
696 | 'https://wordpress.com/earn/' . static::$domain, |
||
697 | 'Earn', |
||
698 | ); |
||
699 | $this->assertContains( $earn_submenu_item, $submenu[ $slug ] ); |
||
700 | |||
701 | $import_submenu_item = array( |
||
702 | 'Import', |
||
703 | 'import', |
||
704 | 'https://wordpress.com/import/' . static::$domain, |
||
705 | 'Import', |
||
706 | ); |
||
707 | $this->assertContains( $import_submenu_item, $submenu[ $slug ] ); |
||
708 | |||
709 | $export_submenu_item = array( |
||
710 | 'Export', |
||
711 | 'export', |
||
712 | 'https://wordpress.com/export/' . static::$domain, |
||
713 | 'Export', |
||
714 | ); |
||
715 | $this->assertContains( $export_submenu_item, $submenu[ $slug ] ); |
||
716 | |||
717 | $other_tools_submenu_item = array( |
||
718 | 'Other tools', |
||
719 | 'manage_options', |
||
720 | 'tools.php', |
||
721 | 'Other tools', |
||
722 | ); |
||
723 | $this->assertContains( $other_tools_submenu_item, $submenu[ $slug ] ); |
||
724 | |||
725 | // NOT contains the following menu items. |
||
726 | |||
727 | $import_submenu_item = array( |
||
728 | 'Import', |
||
729 | 'import', |
||
730 | 'import.php', |
||
731 | ); |
||
732 | $this->assertNotContains( $import_submenu_item, $submenu[ $slug ] ); |
||
733 | |||
734 | $export_submenu_item = array( |
||
735 | 'Export', |
||
736 | 'export', |
||
737 | 'export.php', |
||
738 | ); |
||
739 | $this->assertNotContains( $export_submenu_item, $submenu[ $slug ] ); |
||
740 | } |
||
741 | |||
742 | /** |
||
743 | * Tests add_options_menu |
||
744 | * |
||
745 | * @covers ::add_options_menu |
||
746 | */ |
||
747 | public function test_add_options_menu() { |
||
764 | |||
765 | /** |
||
766 | * Tests add_jetpack_menu |
||
767 | * |
||
768 | * @covers ::add_jetpack_menu |
||
769 | */ |
||
770 | public function add_jetpack_menu() { |
||
827 | |||
828 | /** |
||
829 | * Tests migrate_submenus |
||
830 | * |
||
831 | * @covers ::migrate_submenus |
||
832 | */ |
||
833 | public function test_migrate_submenus() { |
||
868 | } |
||
869 |
Let’s assume you have a class which uses late-static binding:
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:In the case above, it makes sense to update
SomeClass
to useself
instead: