Make WordPress Core

Ticket #48599: 48599.diff

File 48599.diff, 3.5 KB (added by welcher, 6 years ago)

Patch with unit tests

  • src/wp-admin/includes/plugin.php

    diff --git src/wp-admin/includes/plugin.php src/wp-admin/includes/plugin.php
    index 6a33e04115..e8dd6eafa5 100644
    function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, 
    13911391                $submenu[ $parent_slug ][] = $new_sub_menu;
    13921392        } else {
    13931393                // If position is equal or higher than the number of items in the array, append the submenu.
    1394                 if ( $position >= count( $submenu[ $parent_slug ] ) ) {
     1394                if ( ! isset( $submenu[ $parent_slug ] ) || $position >= count( $submenu[ $parent_slug ] ) ) {
    13951395                        $submenu[ $parent_slug ][] = $new_sub_menu;
    13961396                } else {
    13971397                        // Test for a negative position.
  • tests/phpunit/tests/admin/includesPlugin.php

    diff --git tests/phpunit/tests/admin/includesPlugin.php tests/phpunit/tests/admin/includesPlugin.php
    index 68d8fd44b4..e333a66af2 100644
    class Tests_Admin_includesPlugin extends WP_UnitTestCase { 
    255255                );
    256256        }
    257257
     258        /**
     259         * Test that when a submenu has the same slug as a parent item, that it's just appended and ignores the priority.
     260         *
     261         * @ticket 48599
     262         */
     263        function test_priority_when_parent_slug_child_slug_are_the_same() {
     264                global $submenu, $menu;
     265
     266                // Reset menus.
     267                $submenu = array();
     268                $menu    = array();
     269                $current_user = get_current_user_id();
     270                $admin_user   = self::factory()->user->create( array( 'role' => 'administrator' ) );
     271                wp_set_current_user( $admin_user );
     272                set_current_screen( 'dashboard' );
     273
     274                // Setup a menu with some items.
     275                add_menu_page( 'Main Menu', 'Main Menu','manage_options','main_slug','main_page_callback');
     276                add_submenu_page( 'main_slug', 'SubMenu 1', 'SubMenu 1', 'manage_options', 'main_slug', 'submenu_callback_1', 1 );
     277                add_submenu_page( 'main_slug', 'SubMenu 2', 'SubMenu 2', 'manage_options', 'submenu_page2', 'submenu_callback_2', 2 );
     278                add_submenu_page( 'main_slug', 'SubMenu 3', 'SubMenu 3', 'manage_options', 'submenu_page3', 'submenu_callback_3', 3 );
     279
     280
     281                // Clean up the temporary user.
     282                wp_set_current_user( $current_user );
     283                wp_delete_user( $admin_user );
     284
     285                // Verify the menu was inserted at the expected position.
     286                $this->assertSame( 'main_slug', $submenu[ 'main_slug' ][0][2] );
     287                $this->assertSame( 'submenu_page2', $submenu[ 'main_slug' ][1][2] );
     288                $this->assertSame( 'submenu_page3', $submenu[ 'main_slug' ][2][2] );
     289        }
     290
     291        /**
     292         * Passing a string as priority will fail.
     293         *
     294         * @ticket 48599
     295         */
     296        function test_passing_string_as_priority_fires_doing_it_wrong() {
     297                $this->setExpectedIncorrectUsage('add_submenu_page' );
     298                global $submenu, $menu;
     299
     300                // Reset menus.
     301                $submenu = array();
     302                $menu    = array();
     303                $current_user = get_current_user_id();
     304                $admin_user   = self::factory()->user->create( array( 'role' => 'administrator' ) );
     305                wp_set_current_user( $admin_user );
     306                set_current_screen( 'dashboard' );
     307
     308                // Setup a menu with some items.
     309                add_menu_page( 'Main Menu', 'Main Menu','manage_options','main_slug','main_page_callback');
     310                add_submenu_page( 'main_slug', 'SubMenu 1', 'SubMenu 1', 'manage_options', 'submenu_page_1', 'submenu_callback_1', "2" );
     311
     312
     313                // Clean up the temporary user.
     314                wp_set_current_user( $current_user );
     315                wp_delete_user( $admin_user );
     316
     317                // Verify the menu was inserted at the expected position.
     318                $this->assertSame( 'submenu_page_1', $submenu[ 'main_slug' ][1][2] );
     319        }
     320
    258321        function test_is_plugin_active_true() {
    259322                activate_plugin( 'hello.php' );
    260323                $test = is_plugin_active( 'hello.php' );