Make WordPress Core

Changeset 33322


Ignore:
Timestamp:
07/18/2015 11:19:33 PM (9 years ago)
Author:
westonruter
Message:

Customizer: Finish unit tests for nav menus.

Removes object_type restriction to allow for future extensibility. Refactors some methods to improve testability. Includes new tests for Ajax requests.

Fixes #32687.
Props valendesigns, welcher, westonruter.

Location:
trunk
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-customize-nav-menus.php

    r33256 r33322  
    8181
    8282        $obj_type = sanitize_key( $_POST['obj_type'] );
    83         if ( ! in_array( $obj_type, array( 'post_type', 'taxonomy' ) ) ) {
    84             wp_send_json_error( 'nav_menus_invalid_obj_type' );
    85         }
    86 
    87         $taxonomy_or_post_type = sanitize_key( $_POST['type'] );
    88         $page = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 0;
     83        $obj_name = sanitize_key( $_POST['type'] );
     84        $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );
     85        $items = $this->load_available_items_query( $obj_type, $obj_name, $page );
     86
     87        if ( is_wp_error( $items ) ) {
     88            wp_send_json_error( $items->get_error_code() );
     89        } else {
     90            wp_send_json_success( array( 'items' => $items ) );
     91        }
     92    }
     93
     94    /**
     95     * Performs the post_type and taxonomy queries for loading available menu items.
     96     *
     97     * @since 4.3.0
     98     * @access public
     99     *
     100     * @param string $obj_type Optional. Accepts any custom object type and has built-in support for
     101     *                         'post_type' and 'taxonomy'. Default is 'post_type'.
     102     * @param string $obj_name Optional. Accepts any registered taxonomy or post type name. Default is 'page'.
     103     * @param int    $page     Optional. The page number used to generate the query offset. Default is '0'.
     104     * @return WP_Error|array Returns either a WP_Error object or an array of menu items.
     105     */
     106    public function load_available_items_query( $obj_type = 'post_type', $obj_name = 'page', $page = 0 ) {
    89107        $items = array();
    90108
    91109        if ( 'post_type' === $obj_type ) {
    92             if ( ! get_post_type_object( $taxonomy_or_post_type ) ) {
    93                 wp_send_json_error( 'nav_menus_invalid_post_type' );
     110            if ( ! get_post_type_object( $obj_name ) ) {
     111                return new WP_Error( 'nav_menus_invalid_post_type' );
    94112            }
    95113
    96             if ( 0 === $page && 'page' === $taxonomy_or_post_type ) {
     114            if ( 0 === $page && 'page' === $obj_name ) {
    97115                // Add "Home" link. Treat as a page, but switch to custom on add.
    98116                $items[] = array(
     
    111129                'orderby'     => 'date',
    112130                'order'       => 'DESC',
    113                 'post_type'   => $taxonomy_or_post_type,
     131                'post_type'   => $obj_name,
    114132            ) );
    115133            foreach ( $posts as $post ) {
     
    130148            }
    131149        } elseif ( 'taxonomy' === $obj_type ) {
    132             $terms = get_terms( $taxonomy_or_post_type, array(
     150            $terms = get_terms( $obj_name, array(
    133151                'child_of'     => 0,
    134152                'exclude'      => '',
     
    143161            ) );
    144162            if ( is_wp_error( $terms ) ) {
    145                 wp_send_json_error( $terms->get_error_code() );
     163                return $terms;
    146164            }
    147165
     
    159177        }
    160178
    161         wp_send_json_success( array( 'items' => $items ) );
     179        return $items;
    162180    }
    163181
     
    185203
    186204        $s = sanitize_text_field( wp_unslash( $_POST['search'] ) );
    187         $results = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) );
    188 
    189         if ( empty( $results ) ) {
    190             wp_send_json_error( array( 'message' => __( 'No results found.' ) ) );
     205        $items = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) );
     206
     207        if ( empty( $items ) ) {
     208            wp_send_json_error( array( 'message' => __( 'No menu items found.' ) ) );
    191209        } else {
    192             wp_send_json_success( array( 'items' => $results ) );
     210            wp_send_json_success( array( 'items' => $items ) );
    193211        }
    194212    }
     
    203221     *
    204222     * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments.
    205      * @return array Results.
     223     * @return array Menu items.
    206224     */
    207225    public function search_available_items_query( $args = array() ) {
    208         $results = array();
     226        $items = array();
    209227
    210228        $post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
     
    236254                    $post_title = sprintf( __( '#%d (no title)' ), $post->ID );
    237255                }
    238                 $results[] = array(
     256                $items[] = array(
    239257                    'id'         => 'post-' . $post->ID,
    240258                    'title'      => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ),
     
    259277        if ( ! empty( $terms ) ) {
    260278            foreach ( $terms as $term ) {
    261                 $results[] = array(
     279                $items[] = array(
    262280                    'id'         => 'term-' . $term->term_id,
    263281                    'title'      => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ),
     
    271289        }
    272290
    273         return $results;
     291        return $items;
    274292    }
    275293
  • trunk/tests/phpunit/tests/customize/nav-menus.php

    r33138 r33322  
    5050
    5151    /**
    52      * Test the test_load_available_items_ajax method.
    53      *
    54      * @see WP_Customize_Nav_Menus::load_available_items_ajax()
    55      */
    56     function test_load_available_items_ajax() {
    57 
    58         $this->markTestIncomplete( 'This test has not been implemented.' );
    59 
    60     }
    61 
    62     /**
    63      * Test the search_available_items_ajax method.
    64      *
    65      * @see WP_Customize_Nav_Menus::search_available_items_ajax()
    66      */
    67     function test_search_available_items_ajax() {
    68 
    69         $this->markTestIncomplete( 'This test has not been implemented.' );
    70 
     52     * Test that the load_available_items_query method returns a WP_Error object.
     53     *
     54     * @see WP_Customize_Nav_Menus::load_available_items_query()
     55     */
     56    function test_load_available_items_query_returns_wp_error() {
     57        $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
     58
     59        // Invalid post type $obj_name.
     60        $items = $menus->load_available_items_query( 'post_type', 'invalid' );
     61        $this->assertInstanceOf( 'WP_Error', $items );
     62        $this->assertEquals( 'nav_menus_invalid_post_type', $items->get_error_code() );
     63
     64        // Invalid taxonomy $obj_name.
     65        $items = $menus->load_available_items_query( 'taxonomy', 'invalid' );
     66        $this->assertInstanceOf( 'WP_Error', $items );
     67        $this->assertEquals( 'invalid_taxonomy', $items->get_error_code() );
     68    }
     69
     70    /**
     71     * Test the load_available_items_query method maybe returns the home page item.
     72     *
     73     * @see WP_Customize_Nav_Menus::load_available_items_query()
     74     */
     75    function test_load_available_items_query_maybe_returns_home() {
     76        $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
     77
     78        // Expected menu item array.
     79        $expected = array(
     80            'id'         => 'home',
     81            'title'      => _x( 'Home', 'nav menu home label' ),
     82            'type'       => 'custom',
     83            'type_label' => __( 'Custom Link' ),
     84            'object'     => '',
     85            'url'        => home_url(),
     86        );
     87
     88        // Create pages.
     89        $this->factory->post->create_many( 15, array( 'post_type' => 'page' ) );
     90
     91        // Home is included in menu items when page is zero.
     92        $items = $menus->load_available_items_query( 'post_type', 'page', 0 );
     93        $this->assertContains( $expected, $items );
     94
     95        // Home is not included in menu items when page is larger than zero.
     96        $items = $menus->load_available_items_query( 'post_type', 'page', 1 );
     97        $this->assertNotEmpty( $items );
     98        $this->assertNotContains( $expected, $items );
     99    }
     100
     101    /**
     102     * Test the load_available_items_query method returns post item.
     103     *
     104     * @see WP_Customize_Nav_Menus::load_available_items_query()
     105     */
     106    function test_load_available_items_query_returns_post_item_with_page_number() {
     107        $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
     108
     109        // Create page.
     110        $post_id = $this->factory->post->create( array( 'post_title' => 'Post Title' ) );
     111
     112        // Create pages.
     113        $this->factory->post->create_many( 10 );
     114
     115        // Expected menu item array.
     116        $expected = array(
     117            'id'         => "post-{$post_id}",
     118            'title'      => 'Post Title',
     119            'type'       => 'post_type',
     120            'type_label' => 'Post',
     121            'object'     => 'post',
     122            'object_id'  => intval( $post_id ),
     123            'url'        => get_permalink( intval( $post_id ) ),
     124        );
     125
     126        // Offset the query and get the second page of menu items.
     127        $items = $menus->load_available_items_query( 'post_type', 'post', 1 );
     128        $this->assertContains( $expected, $items );
     129    }
     130
     131    /**
     132     * Test the load_available_items_query method returns page item.
     133     *
     134     * @see WP_Customize_Nav_Menus::load_available_items_query()
     135     */
     136    function test_load_available_items_query_returns_page_item() {
     137        $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
     138
     139        // Create page.
     140        $page_id = $this->factory->post->create( array( 'post_title' => 'Page Title', 'post_type' => 'page' ) );
     141
     142        // Expected menu item array.
     143        $expected = array(
     144            'id'         => "post-{$page_id}",
     145            'title'      => 'Page Title',
     146            'type'       => 'post_type',
     147            'type_label' => 'Page',
     148            'object'     => 'page',
     149            'object_id'  => intval( $page_id ),
     150            'url'        => get_permalink( intval( $page_id ) ),
     151        );
     152
     153        $items = $menus->load_available_items_query( 'post_type', 'page', 0 );
     154        $this->assertContains( $expected, $items );
     155    }
     156
     157    /**
     158     * Test the load_available_items_query method returns post item.
     159     *
     160     * @see WP_Customize_Nav_Menus::load_available_items_query()
     161     */
     162    function test_load_available_items_query_returns_post_item() {
     163        $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
     164
     165        // Create post.
     166        $post_id = $this->factory->post->create( array( 'post_title' => 'Post Title' ) );
     167
     168        // Expected menu item array.
     169        $expected = array(
     170            'id'         => "post-{$post_id}",
     171            'title'      => 'Post Title',
     172            'type'       => 'post_type',
     173            'type_label' => 'Post',
     174            'object'     => 'post',
     175            'object_id'  => intval( $post_id ),
     176            'url'        => get_permalink( intval( $post_id ) ),
     177        );
     178
     179        $items = $menus->load_available_items_query( 'post_type', 'post', 0 );
     180        $this->assertContains( $expected, $items );
     181    }
     182
     183    /**
     184     * Test the load_available_items_query method returns term item.
     185     *
     186     * @see WP_Customize_Nav_Menus::load_available_items_query()
     187     */
     188    function test_load_available_items_query_returns_term_item() {
     189        $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
     190
     191        // Create term.
     192        $term_id = $this->factory->category->create( array( 'name' => 'Term Title' ) );
     193
     194        // Expected menu item array.
     195        $expected = array(
     196            'id'         => "term-{$term_id}",
     197            'title'      => 'Term Title',
     198            'type'       => 'taxonomy',
     199            'type_label' => 'Category',
     200            'object'     => 'category',
     201            'object_id'  => intval( $term_id ),
     202            'url'        => get_term_link( intval( $term_id ), 'category' ),
     203        );
     204
     205        $items = $menus->load_available_items_query( 'taxonomy', 'category', 0 );
     206        $this->assertContains( $expected, $items );
    71207    }
    72208
     
    455591    }
    456592
    457     /**
    458      * Test the render_menu method.
    459      *
    460      * @see WP_Customize_Nav_Menus::render_menu()
    461      */
    462     function test_render_menu() {
    463 
    464         $this->markTestIncomplete( 'This test has not been implemented.' );
    465     }
    466 
    467593}
Note: See TracChangeset for help on using the changeset viewer.