Make WordPress Core

Ticket #38617: 38617.2.diff

File 38617.2.diff, 65.3 KB (added by joehoyle, 8 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

     
    594594                        'description'       => __( 'Limit result set to attachments of a particular media type.' ),
    595595                        'type'              => 'string',
    596596                        'enum'              => array_keys( $media_types ),
    597                         'validate_callback' => 'rest_validate_request_arg',
    598597                );
    599598
    600599                $params['mime_type'] = array(
  • src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

     
    11021102                                        'type'         => 'string',
    11031103                                        'format'       => 'ipv4',
    11041104                                        'context'      => array( 'edit' ),
    1105                                         'arg_options'  => array(
    1106                                                 'default'           => '127.0.0.1',
    1107                                         ),
     1105                                        'default'      => '127.0.0.1',
    11081106                                ),
    11091107                                'author_name'     => array(
    11101108                                        'description'  => __( 'Display name for the object author.' ),
     
    11761174                                        'description'  => __( 'The id for the parent of the object.' ),
    11771175                                        'type'         => 'integer',
    11781176                                        'context'      => array( 'view', 'edit', 'embed' ),
    1179                                         'arg_options'  => array(
    1180                                                 'default'           => 0,
    1181                                         ),
     1177                                        'default'      => 0,
    11821178                                ),
    11831179                                'post'             => array(
    11841180                                        'description'  => __( 'The id of the associated post object.' ),
    11851181                                        'type'         => 'integer',
    11861182                                        'context'      => array( 'view', 'edit' ),
    1187                                         'arg_options'  => array(
    1188                                                 'default'           => 0,
    1189                                         ),
     1183                                        'default'      => 0,
    11901184                                ),
    11911185                                'status'           => array(
    11921186                                        'description'  => __( 'State of the object.' ),
     
    12521246                        'description'       => __( 'Limit response to resources published after a given ISO8601 compliant date.' ),
    12531247                        'type'              => 'string',
    12541248                        'format'            => 'date-time',
    1255                         'validate_callback' => 'rest_validate_request_arg',
    12561249                );
    12571250
    12581251                $query_params['author'] = array(
    12591252                        'description'       => __( 'Limit result set to comments assigned to specific user ids. Requires authorization.' ),
    1260                         'sanitize_callback' => 'wp_parse_id_list',
    12611253                        'type'              => 'array',
     1254                        'items'             => array(
     1255                                'type'          => 'integer',
     1256                        ),
    12621257                );
    12631258
    12641259                $query_params['author_exclude'] = array(
    12651260                        'description'       => __( 'Ensure result set excludes comments assigned to specific user ids. Requires authorization.' ),
    1266                         'sanitize_callback' => 'wp_parse_id_list',
    12671261                        'type'              => 'array',
     1262                        'items'             => array(
     1263                                'type'          => 'integer',
     1264                        ),
    12681265                );
    12691266
    12701267                $query_params['author_email'] = array(
    12711268                        'default'           => null,
    12721269                        'description'       => __( 'Limit result set to that from a specific author email. Requires authorization.' ),
    12731270                        'format'            => 'email',
    1274                         'sanitize_callback' => 'sanitize_email',
    12751271                        'type'              => 'string',
    12761272                );
    12771273
     
    12791275                        'description'       => __( 'Limit response to resources published before a given ISO8601 compliant date.' ),
    12801276                        'type'              => 'string',
    12811277                        'format'            => 'date-time',
    1282                         'validate_callback' => 'rest_validate_request_arg',
    12831278                );
    12841279
    12851280                $query_params['exclude'] = array(
    12861281                        'description'        => __( 'Ensure result set excludes specific ids.' ),
    12871282                        'type'               => 'array',
     1283                        'items'             => array(
     1284                                'type'          => 'integer',
     1285                        ),
    12881286                        'default'            => array(),
    1289                         'sanitize_callback'  => 'wp_parse_id_list',
    12901287                );
    12911288
    12921289                $query_params['include'] = array(
    12931290                        'description'        => __( 'Limit result set to specific ids.' ),
    12941291                        'type'               => 'array',
     1292                        'items'             => array(
     1293                                'type'          => 'integer',
     1294                        ),
    12951295                        'default'            => array(),
    1296                         'sanitize_callback'  => 'wp_parse_id_list',
    12971296                );
    12981297
    12991298                $query_params['karma'] = array(
    13001299                        'default'           => null,
    13011300                        'description'       => __( 'Limit result set to that of a particular comment karma. Requires authorization.' ),
    1302                         'sanitize_callback' => 'absint',
    13031301                        'type'              => 'integer',
    1304                         'validate_callback'  => 'rest_validate_request_arg',
    13051302                );
    13061303
    13071304                $query_params['offset'] = array(
    13081305                        'description'        => __( 'Offset the result set by a specific number of comments.' ),
    13091306                        'type'               => 'integer',
    1310                         'sanitize_callback'  => 'absint',
    1311                         'validate_callback'  => 'rest_validate_request_arg',
    13121307                );
    13131308
    13141309                $query_params['order']      = array(
    13151310                        'description'           => __( 'Order sort attribute ascending or descending.' ),
    13161311                        'type'                  => 'string',
    1317                         'sanitize_callback'     => 'sanitize_key',
    1318                         'validate_callback'     => 'rest_validate_request_arg',
    13191312                        'default'               => 'desc',
    13201313                        'enum'                  => array(
    13211314                                'asc',
     
    13261319                $query_params['orderby']    = array(
    13271320                        'description'           => __( 'Sort collection by object attribute.' ),
    13281321                        'type'                  => 'string',
    1329                         'sanitize_callback'     => 'sanitize_key',
    1330                         'validate_callback'     => 'rest_validate_request_arg',
    13311322                        'default'               => 'date_gmt',
    13321323                        'enum'                  => array(
    13331324                                'date',
     
    13431334                $query_params['parent'] = array(
    13441335                        'default'           => array(),
    13451336                        'description'       => __( 'Limit result set to resources of specific parent ids.' ),
    1346                         'sanitize_callback' => 'wp_parse_id_list',
    13471337                        'type'              => 'array',
     1338                        'items'             => array(
     1339                                'type'          => 'integer',
     1340                        ),
    13481341                );
    13491342
    13501343                $query_params['parent_exclude'] = array(
    13511344                        'default'           => array(),
    13521345                        'description'       => __( 'Ensure result set excludes specific parent ids.' ),
    1353                         'sanitize_callback' => 'wp_parse_id_list',
    13541346                        'type'              => 'array',
     1347                        'items'             => array(
     1348                                'type'          => 'integer',
     1349                        ),
    13551350                );
    13561351
    13571352                $query_params['post']   = array(
    13581353                        'default'           => array(),
    13591354                        'description'       => __( 'Limit result set to resources assigned to specific post ids.' ),
    13601355                        'type'              => 'array',
    1361                         'sanitize_callback' => 'wp_parse_id_list',
     1356                        'items'             => array(
     1357                                'type'          => 'integer',
     1358                        ),
    13621359                );
    13631360
    13641361                $query_params['status'] = array(
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

     
    19741974                                'items'       => array(
    19751975                                        'type'    => 'integer',
    19761976                                ),
    1977                                 'arg_options' => array(
    1978                                         'sanitize_callback' => 'wp_parse_id_list',
    1979                                 ),
    1980                                 'context'     => array( 'view', 'edit' ),
    1981                         );
    1982                         $schema['properties'][ $base . '_exclude' ] = array(
    1983                                 'description' => sprintf( __( 'The terms in the %s taxonomy that should not be assigned to the object.' ), $taxonomy->name ),
    1984                                 'type'        => 'array',
    1985                                 'items'       => array(
    1986                                         'type'    => 'integer',
    1987                                 ),
    1988                                 'arg_options' => array(
    1989                                         'sanitize_callback' => 'wp_parse_id_list',
    1990                                 ),
    19911977                                'context'     => array( 'view', 'edit' ),
    19921978                        );
    19931979                }
     
    20121998                        'description'        => __( 'Limit response to resources published after a given ISO8601 compliant date.' ),
    20131999                        'type'               => 'string',
    20142000                        'format'             => 'date-time',
    2015                         'validate_callback'  => 'rest_validate_request_arg',
    20162001                );
    20172002
    20182003                if ( post_type_supports( $this->post_type, 'author' ) ) {
    20192004                        $params['author'] = array(
    20202005                                'description'         => __( 'Limit result set to posts assigned to specific authors.' ),
    20212006                                'type'                => 'array',
     2007                                'items'               => array(
     2008                                        'type'            => 'integer',
     2009                                ),
    20222010                                'default'             => array(),
    2023                                 'sanitize_callback'   => 'wp_parse_id_list',
    20242011                        );
    20252012                        $params['author_exclude'] = array(
    20262013                                'description'         => __( 'Ensure result set excludes posts assigned to specific authors.' ),
    20272014                                'type'                => 'array',
     2015                                'items'               => array(
     2016                                        'type'            => 'integer',
     2017                                ),
    20282018                                'default'             => array(),
    2029                                 'sanitize_callback'   => 'wp_parse_id_list',
    20302019                        );
    20312020                }
    20322021
     
    20342023                        'description'        => __( 'Limit response to resources published before a given ISO8601 compliant date.' ),
    20352024                        'type'               => 'string',
    20362025                        'format'             => 'date-time',
    2037                         'validate_callback'  => 'rest_validate_request_arg',
    20382026                );
    20392027
    20402028                $params['exclude'] = array(
    20412029                        'description'        => __( 'Ensure result set excludes specific ids.' ),
    20422030                        'type'               => 'array',
     2031                        'items'              => array(
     2032                                'type'           => 'integer',
     2033                        ),
    20432034                        'default'            => array(),
    2044                         'sanitize_callback'  => 'wp_parse_id_list',
    20452035                );
    20462036
    20472037                $params['include'] = array(
    20482038                        'description'        => __( 'Limit result set to specific ids.' ),
    20492039                        'type'               => 'array',
     2040                        'items'              => array(
     2041                                'type'           => 'integer',
     2042                        ),
    20502043                        'default'            => array(),
    2051                         'sanitize_callback'  => 'wp_parse_id_list',
    20522044                );
    20532045
    20542046                if ( 'page' === $this->post_type || post_type_supports( $this->post_type, 'page-attributes' ) ) {
    20552047                        $params['menu_order'] = array(
    20562048                                'description'        => __( 'Limit result set to resources with a specific menu_order value.' ),
    20572049                                'type'               => 'integer',
    2058                                 'sanitize_callback'  => 'absint',
    2059                                 'validate_callback'  => 'rest_validate_request_arg',
    20602050                        );
    20612051                }
    20622052
    20632053                $params['offset'] = array(
    20642054                        'description'        => __( 'Offset the result set by a specific number of items.' ),
    20652055                        'type'               => 'integer',
    2066                         'sanitize_callback'  => 'absint',
    2067                         'validate_callback'  => 'rest_validate_request_arg',
    20682056                );
    20692057
    20702058                $params['order'] = array(
     
    20722060                        'type'               => 'string',
    20732061                        'default'            => 'desc',
    20742062                        'enum'               => array( 'asc', 'desc' ),
    2075                         'validate_callback'  => 'rest_validate_request_arg',
    20762063                );
    20772064
    20782065                $params['orderby'] = array(
     
    20872074                                'title',
    20882075                                'slug',
    20892076                        ),
    2090                         'validate_callback'  => 'rest_validate_request_arg',
    20912077                );
    20922078
    20932079                if ( 'page' === $this->post_type || post_type_supports( $this->post_type, 'page-attributes' ) ) {
     
    21002086                        $params['parent'] = array(
    21012087                                'description'       => __( 'Limit result set to those of particular parent ids.' ),
    21022088                                'type'              => 'array',
    2103                                 'sanitize_callback' => 'wp_parse_id_list',
     2089                                'items'             => array(
     2090                                        'type'          => 'integer',
     2091                                ),
    21042092                                'default'           => array(),
    21052093                        );
    21062094                        $params['parent_exclude'] = array(
    21072095                                'description'       => __( 'Limit result set to all items except those of a particular parent id.' ),
    21082096                                'type'              => 'array',
    2109                                 'sanitize_callback' => 'wp_parse_id_list',
     2097                                'items'             => array(
     2098                                        'type'          => 'integer',
     2099                                ),
    21102100                                'default'           => array(),
    21112101                        );
    21122102                }
     
    21142104                $params['slug'] = array(
    21152105                        'description'       => __( 'Limit result set to posts with a specific slug.' ),
    21162106                        'type'              => 'string',
    2117                         'validate_callback' => 'rest_validate_request_arg',
    21182107                );
    21192108
    21202109                $params['status'] = array(
     
    21342123                        $params[ $base ] = array(
    21352124                                'description'       => sprintf( __( 'Limit result set to all items that have the specified term assigned in the %s taxonomy.' ), $base ),
    21362125                                'type'              => 'array',
    2137                                 'sanitize_callback' => 'wp_parse_id_list',
     2126                                'items'             => array(
     2127                                        'type'          => 'integer',
     2128                                ),
     2129                                'default'           => array(),
     2130                        );
     2131
     2132                        $params[ $base . '_exclude' ] = array(
     2133                                'description' => sprintf( __( 'Limit result set to all items except those that have the specified term assigned in the %s taxonomy.' ), $base ),
     2134                                'type'        => 'array',
     2135                                'items'       => array(
     2136                                        'type'    => 'integer',
     2137                                ),
    21382138                                'default'           => array(),
    21392139                        );
    21402140                }
     
    21432143                        $params['sticky'] = array(
    21442144                                'description'       => __( 'Limit result set to items that are sticky.' ),
    21452145                                'type'              => 'boolean',
    2146                                 'sanitize_callback' => 'rest_parse_request_arg',
    21472146                        );
    21482147                }
    21492148
  • src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php

     
    301301                $new_params['type'] = array(
    302302                        'description'  => __( 'Limit results to resources associated with a specific post type.' ),
    303303                        'type'         => 'string',
    304                         'validate_callback' => 'rest_validate_request_arg',
    305304                );
    306305                return $new_params;
    307306        }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

     
    887887                $query_params['exclude'] = array(
    888888                        'description'       => __( 'Ensure result set excludes specific ids.' ),
    889889                        'type'              => 'array',
     890                        'items'             => array(
     891                                'type'          => 'integer',
     892                        ),
    890893                        'default'           => array(),
    891                         'sanitize_callback' => 'wp_parse_id_list',
    892894                );
    893895
    894896                $query_params['include'] = array(
    895897                        'description'       => __( 'Limit result set to specific ids.' ),
    896898                        'type'              => 'array',
     899                        'items'             => array(
     900                                'type'          => 'integer',
     901                        ),
    897902                        'default'           => array(),
    898                         'sanitize_callback' => 'wp_parse_id_list',
    899903                );
    900904
    901905                if ( ! $taxonomy->hierarchical ) {
    902906                        $query_params['offset'] = array(
    903907                                'description'       => __( 'Offset the result set by a specific number of items.' ),
    904908                                'type'              => 'integer',
    905                                 'sanitize_callback' => 'absint',
    906                                 'validate_callback' => 'rest_validate_request_arg',
    907909                        );
    908910                }
    909911
    910912                $query_params['order'] = array(
    911913                        'description'       => __( 'Order sort attribute ascending or descending.' ),
    912914                        'type'              => 'string',
    913                         'sanitize_callback' => 'sanitize_key',
    914915                        'default'           => 'asc',
    915916                        'enum'              => array(
    916917                                'asc',
    917918                                'desc',
    918919                        ),
    919                         'validate_callback' => 'rest_validate_request_arg',
    920920                );
    921921
    922922                $query_params['orderby'] = array(
    923923                        'description'       => __( 'Sort collection by resource attribute.' ),
    924924                        'type'              => 'string',
    925                         'sanitize_callback' => 'sanitize_key',
    926925                        'default'           => 'name',
    927926                        'enum'              => array(
    928927                                'id',
     
    933932                                'description',
    934933                                'count',
    935934                        ),
    936                         'validate_callback' => 'rest_validate_request_arg',
    937935                );
    938936
    939937                $query_params['hide_empty'] = array(
    940938                        'description'       => __( 'Whether to hide resources not assigned to any posts.' ),
    941939                        'type'              => 'boolean',
    942940                        'default'           => false,
    943                         'sanitize_callback' => 'rest_sanitize_request_arg',
    944                         'validate_callback' => 'rest_validate_request_arg',
    945941                );
    946942
    947943                if ( $taxonomy->hierarchical ) {
    948944                        $query_params['parent'] = array(
    949945                                'description'       => __( 'Limit result set to resources assigned to a specific parent.' ),
    950946                                'type'              => 'integer',
    951                                 'sanitize_callback' => 'absint',
    952                                 'validate_callback' => 'rest_validate_request_arg',
    953947                        );
    954948                }
    955949
     
    957951                        'description'       => __( 'Limit result set to resources assigned to a specific post.' ),
    958952                        'type'              => 'integer',
    959953                        'default'           => null,
    960                         'validate_callback' => 'rest_validate_request_arg',
    961954                );
    962955
    963956                $query_params['slug'] = array(
    964957                        'description'       => __( 'Limit result set to resources with a specific slug.' ),
    965958                        'type'              => 'string',
    966                         'validate_callback' => 'rest_validate_request_arg',
    967959                );
    968960
    969961                return $query_params;
  • src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

     
    10221022                                                'type'    => 'string',
    10231023                                        ),
    10241024                                        'context'     => array( 'edit' ),
    1025                                         'arg_options' => array(
    1026                                                 'sanitize_callback' => 'wp_parse_slug_list',
    1027                                         ),
    10281025                                ),
    10291026                                'password'        => array(
    10301027                                        'description' => __( 'Password for the resource (never included).' ),
     
    10911088                $query_params['exclude'] = array(
    10921089                        'description'        => __( 'Ensure result set excludes specific ids.' ),
    10931090                        'type'               => 'array',
     1091                        'items'              => array(
     1092                                'type'           => 'integer',
     1093                        ),
    10941094                        'default'            => array(),
    1095                         'sanitize_callback'  => 'wp_parse_id_list',
    10961095                );
    10971096
    10981097                $query_params['include'] = array(
    10991098                        'description'        => __( 'Limit result set to specific ids.' ),
    11001099                        'type'               => 'array',
     1100                        'items'              => array(
     1101                                'type'           => 'integer',
     1102                        ),
    11011103                        'default'            => array(),
    1102                         'sanitize_callback'  => 'wp_parse_id_list',
    11031104                );
    11041105
    11051106                $query_params['offset'] = array(
    11061107                        'description'        => __( 'Offset the result set by a specific number of items.' ),
    11071108                        'type'               => 'integer',
    1108                         'sanitize_callback'  => 'absint',
    1109                         'validate_callback'  => 'rest_validate_request_arg',
    11101109                );
    11111110
    11121111                $query_params['order'] = array(
    11131112                        'default'            => 'asc',
    11141113                        'description'        => __( 'Order sort attribute ascending or descending.' ),
    11151114                        'enum'               => array( 'asc', 'desc' ),
    1116                         'sanitize_callback'  => 'sanitize_key',
    11171115                        'type'               => 'string',
    1118                         'validate_callback'  => 'rest_validate_request_arg',
    11191116                );
    11201117
    11211118                $query_params['orderby'] = array(
     
    11301127                                'email',
    11311128                                'url',
    11321129                        ),
    1133                         'sanitize_callback'  => 'sanitize_key',
    11341130                        'type'               => 'string',
    1135                         'validate_callback'  => 'rest_validate_request_arg',
    11361131                );
    11371132
    11381133                $query_params['slug']    = array(
    11391134                        'description'        => __( 'Limit result set to resources with a specific slug.' ),
    11401135                        'type'               => 'string',
    1141                         'validate_callback'  => 'rest_validate_request_arg',
    11421136                );
    11431137
    11441138                $query_params['roles']   = array(
    11451139                        'description'        => __( 'Limit result set to resources matching at least one specific role provided. Accepts csv list or single role.' ),
    11461140                        'type'               => 'array',
    1147                         'sanitize_callback'  => 'wp_parse_slug_list',
     1141                        'items'              => array(
     1142                                'type'           => 'string',
     1143                        ),
    11481144                );
    11491145
    11501146                return $query_params;
  • tests/phpunit/tests/rest-api/rest-categories-controller.php

     
    428428                $this->assertEquals( 'Child', $data[0]['name'] );
    429429        }
    430430
     431        public function test_get_terms_invalid_parent_arg() {
     432                $category1 = $this->factory->category->create( array( 'name' => 'Parent' ) );
     433                $this->factory->category->create( array( 'name' => 'Child', 'parent' => $category1 ) );
     434                $request = new WP_REST_Request( 'GET', '/wp/v2/categories' );
     435                $request->set_param( 'parent', 'invalid-parent' );
     436                $response = $this->server->dispatch( $request );
     437                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     438        }
     439
    431440        public function test_get_terms_private_taxonomy() {
    432441                register_taxonomy( 'robin', 'post', array( 'public' => false ) );
    433442                $this->factory->term->create( array( 'name' => 'Cape', 'taxonomy' => 'robin' ) );
  • tests/phpunit/tests/rest-api/rest-comments-controller.php

     
    3232                        'role' => 'subscriber',
    3333                ) );
    3434                self::$author_id = $factory->user->create( array(
    35                         'role'        => 'author',
     35                        'role'          => 'author',
    3636                        'display_name' => 'Sea Captain',
    3737                        'first_name'   => 'Horatio',
    38                         'last_name'    => 'McCallister',
     38                        'last_name'     => 'McCallister',
    3939                        'user_email'   => 'captain@thefryingdutchman.com',
    40                         'user_url'    => 'http://thefryingdutchman.com',
     40                        'user_url'      => 'http://thefryingdutchman.com',
    4141                ) );
    4242
    4343                self::$post_id = $factory->post->create();
     
    5454                self::$approved_id = $factory->comment->create( array(
    5555                        'comment_approved' => 1,
    5656                        'comment_post_ID'  => self::$post_id,
    57                         'user_id'          => 0,
     57                        'user_id'                 => 0,
    5858                ) );
    5959                self::$hold_id = $factory->comment->create( array(
    6060                        'comment_approved' => 0,
    6161                        'comment_post_ID'  => self::$post_id,
    62                         'user_id'          => self::$subscriber_id,
     62                        'user_id'                 => self::$subscriber_id,
    6363                ) );
    6464        }
    6565
     
    300300                $data = $response->get_data();
    301301                $this->assertEquals( 2, count( $data ) );
    302302                $this->assertEquals( $id3, $data[0]['id'] );
     303                // Orderby=>invalid should fail
     304                $request->set_param( 'orderby', 'invalid' );
     305                $response = $this->server->dispatch( $request );
     306                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     307                // fails on invalid id
     308                $request->set_param( 'orderby', array( 'include' ) );
     309                $request->set_param( 'include', array( 'invalid' ) );
     310                $response = $this->server->dispatch( $request );
     311                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    303312        }
    304313
    305314        public function test_get_items_exclude_query() {
     
    320329                $data = $response->get_data();
    321330                $this->assertTrue( in_array( $id1, wp_list_pluck( $data, 'id' ), true ) );
    322331                $this->assertFalse( in_array( $id2, wp_list_pluck( $data, 'id' ), true ) );
     332
     333                // fails on invalid id
     334                $request->set_param( 'exclude', array( 'invalid' ) );
     335                $response = $this->server->dispatch( $request );
     336                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    323337        }
    324338
    325339        public function test_get_items_offset_query() {
     
    343357                $request->set_param( 'page', 3 );
    344358                $response = $this->server->dispatch( $request );
    345359                $this->assertCount( 2, $response->get_data() );
     360                // 'offset' with invalid value errors
     361                $request->set_param( 'offset', 'moreplease' );
     362                $response = $this->server->dispatch( $request );
     363                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    346364        }
    347365
    348366        public function test_get_items_order_query() {
     
    364382                $response = $this->server->dispatch( $request );
    365383                $data = $response->get_data();
    366384                $this->assertEquals( self::$approved_id, $data[0]['id'] );
     385                // order=>asc,id should fail
     386                $request->set_param( 'order', 'asc,id' );
     387                $response = $this->server->dispatch( $request );
     388                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    367389        }
    368390
    369391        public function test_get_items_private_post_no_permissions() {
     
    381403                $args = array(
    382404                        'comment_approved' => 1,
    383405                        'comment_post_ID'  => self::$post_id,
    384                         'user_id'          => self::$author_id,
     406                        'user_id'                 => self::$author_id,
    385407                );
    386408                $this->factory->comment->create( $args );
    387409                $args['user_id'] = self::$subscriber_id;
     
    402424                $this->assertEquals( 200, $response->get_status() );
    403425                $comments = $response->get_data();
    404426                $this->assertCount( 2, $comments );
     427                // Invalid author param errors
     428                $request->set_param( 'author', 'skippy' );
     429                $response = $this->server->dispatch( $request );
     430                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    405431                // Unavailable to unauthenticated; defaults to error
    406432                wp_set_current_user( 0 );
     433                $request->set_param( 'author', array( self::$author_id, self::$subscriber_id ) );
    407434                $response = $this->server->dispatch( $request );
    408435                $this->assertErrorResponse( 'rest_forbidden_param', $response, 401 );
    409436        }
     
    414441                $args = array(
    415442                        'comment_approved' => 1,
    416443                        'comment_post_ID'  => self::$post_id,
    417                         'user_id'          => self::$author_id,
     444                        'user_id'                 => self::$author_id,
    418445                );
    419446                $this->factory->comment->create( $args );
    420447                $args['user_id'] = self::$subscriber_id;
     
    441468                $this->assertEquals( 200, $response->get_status() );
    442469                $comments = $response->get_data();
    443470                $this->assertCount( 2, $comments );
     471                // 'author_exclude' for both invalid author
     472                $request = new WP_REST_Request( 'GET', '/wp/v2/comments' );
     473                $request->set_param( 'author_exclude', 'skippy' );
     474                $response = $this->server->dispatch( $request );
     475                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    444476                // Unavailable to unauthenticated; defaults to error
    445477                wp_set_current_user( 0 );
     478                $request->set_param( 'author_exclude', array( self::$author_id, self::$subscriber_id ) );
    446479                $response = $this->server->dispatch( $request );
    447480                $this->assertErrorResponse( 'rest_forbidden_param', $response, 401 );
    448481        }
     
    470503                $request->set_param( 'parent', array( $parent_id, $parent_id2 ) );
    471504                $response = $this->server->dispatch( $request );
    472505                $this->assertCount( 2, $response->get_data() );
     506                // Invalid parent should error
     507                $request->set_param( 'parent', 'invalid' );
     508                $response = $this->server->dispatch( $request );
     509                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    473510        }
    474511
    475512        public function test_get_items_parent_exclude_arg() {
     
    495532                $request->set_param( 'parent_exclude', array( $parent_id, $parent_id2 ) );
    496533                $response = $this->server->dispatch( $request );
    497534                $this->assertCount( 3, $response->get_data() );
     535                // Invalid parent id should error
     536                $request->set_param( 'parent_exclude', 'invalid' );
     537                $response = $this->server->dispatch( $request );
     538                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    498539        }
    499540
    500541        public function test_get_items_search_query() {
     
    537578                $this->assertEquals( 50, $headers['X-WP-Total'] );
    538579                $this->assertEquals( 5, $headers['X-WP-TotalPages'] );
    539580                $next_link = add_query_arg( array(
    540                         'page'    => 2,
     581                        'page'  => 2,
    541582                        ), rest_url( '/wp/v2/comments' ) );
    542583                $this->assertFalse( stripos( $headers['Link'], 'rel="prev"' ) );
    543584                $this->assertContains( '<' . $next_link . '>; rel="next"', $headers['Link'] );
     
    553594                $this->assertEquals( 51, $headers['X-WP-Total'] );
    554595                $this->assertEquals( 6, $headers['X-WP-TotalPages'] );
    555596                $prev_link = add_query_arg( array(
    556                         'page'    => 2,
     597                        'page'  => 2,
    557598                        ), rest_url( '/wp/v2/comments' ) );
    558599                $this->assertContains( '<' . $prev_link . '>; rel="prev"', $headers['Link'] );
    559600                $next_link = add_query_arg( array(
    560                         'page'    => 4,
     601                        'page'  => 4,
    561602                        ), rest_url( '/wp/v2/comments' ) );
    562603                $this->assertContains( '<' . $next_link . '>; rel="next"', $headers['Link'] );
    563604                // Last page
     
    568609                $this->assertEquals( 51, $headers['X-WP-Total'] );
    569610                $this->assertEquals( 6, $headers['X-WP-TotalPages'] );
    570611                $prev_link = add_query_arg( array(
    571                         'page'    => 5,
     612                        'page'  => 5,
    572613                        ), rest_url( '/wp/v2/comments' ) );
    573614                $this->assertContains( '<' . $prev_link . '>; rel="prev"', $headers['Link'] );
    574615                $this->assertFalse( stripos( $headers['Link'], 'rel="next"' ) );
     
    580621                $this->assertEquals( 51, $headers['X-WP-Total'] );
    581622                $this->assertEquals( 6, $headers['X-WP-TotalPages'] );
    582623                $prev_link = add_query_arg( array(
    583                         'page'    => 6,
     624                        'page'  => 6,
    584625                        ), rest_url( '/wp/v2/comments' ) );
    585626                $this->assertContains( '<' . $prev_link . '>; rel="prev"', $headers['Link'] );
    586627                $this->assertFalse( stripos( $headers['Link'], 'rel="next"' ) );
     
    596637
    597638        public function test_get_comments_valid_date() {
    598639                $comment1 = $this->factory->comment->create( array(
    599                         'comment_date'    => '2016-01-15T00:00:00Z',
     640                        'comment_date'  => '2016-01-15T00:00:00Z',
    600641                        'comment_post_ID' => self::$post_id,
    601642                ) );
    602643                $comment2 = $this->factory->comment->create( array(
    603                         'comment_date'    => '2016-01-16T00:00:00Z',
     644                        'comment_date'  => '2016-01-16T00:00:00Z',
    604645                        'comment_post_ID' => self::$post_id,
    605646                ) );
    606647                $comment3 = $this->factory->comment->create( array(
    607                         'comment_date'    => '2016-01-17T00:00:00Z',
     648                        'comment_date'  => '2016-01-17T00:00:00Z',
    608649                        'comment_post_ID' => self::$post_id,
    609650                ) );
    610651
     
    720761                $comment_id_1 = $this->factory->comment->create( array(
    721762                        'comment_approved' => 1,
    722763                        'comment_post_ID'  => self::$post_id,
    723                         'user_id'          => self::$subscriber_id,
     764                        'user_id'                 => self::$subscriber_id,
    724765                ) );
    725766
    726767                $child_comment = $this->factory->comment->create( array(
    727768                        'comment_approved' => 1,
    728769                        'comment_parent'   => $comment_id_1,
    729770                        'comment_post_ID'  => self::$post_id,
    730                         'user_id'          => self::$subscriber_id,
     771                        'user_id'                 => self::$subscriber_id,
    731772                ) );
    732773
    733774                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/comments/%s', $comment_id_1 ) );
     
    740781                $comment_id_1 = $this->factory->comment->create( array(
    741782                        'comment_approved' => 1,
    742783                        'comment_post_ID'  => self::$post_id,
    743                         'user_id'          => self::$subscriber_id,
     784                        'user_id'                 => self::$subscriber_id,
    744785                ) );
    745786
    746787                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/comments/%s', $comment_id_1 ) );
     
    753794                wp_set_current_user( 0 );
    754795
    755796                $params = array(
    756                         'post'    => self::$post_id,
     797                        'post'  => self::$post_id,
    757798                        'author_name'  => 'Comic Book Guy',
    758799                        'author_email' => 'cbg@androidsdungeon.com',
    759800                        'author_url'   => 'http://androidsdungeon.com',
    760801                        'content' => 'Worst Comment Ever!',
    761                         'date'    => '2014-11-07T10:14:25',
     802                        'date'  => '2014-11-07T10:14:25',
    762803                );
    763804
    764805                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    779820                wp_set_current_user( 0 );
    780821
    781822                $params = array(
    782                         'post'        => self::$post_id,
     823                        'post'          => self::$post_id,
    783824                        'author_name'  => 'Reverend Lovejoy',
    784825                        'author_email' => 'lovejoy@example.com',
    785826                        'author_url'   => 'http://timothylovejoy.jr',
    786                         'content'      => array(
     827                        'content'         => array(
    787828                                'raw' => 'Once something has been approved by the government, it\'s no longer immoral.',
    788829                        ),
    789830                );
     
    804845                update_option( 'require_name_email', 1 );
    805846
    806847                $params = array(
    807                         'post'    => self::$post_id,
     848                        'post'  => self::$post_id,
    808849                        'content' => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
    809850                );
    810851
     
    822863                update_option( 'require_name_email', 1 );
    823864
    824865                $params = array(
    825                         'post'        => self::$post_id,
     866                        'post'          => self::$post_id,
    826867                        'author_email' => 'ekrabappel@springfield-elementary.edu',
    827                         'content'      => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     868                        'content'         => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
    828869                );
    829870
    830871                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    841882                update_option( 'require_name_email', 1 );
    842883
    843884                $params = array(
    844                         'post'        => self::$post_id,
     885                        'post'          => self::$post_id,
    845886                        'author_name' => 'Edna Krabappel',
    846                         'content'    => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     887                        'content'        => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
    847888                );
    848889
    849890                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    860901                wp_set_current_user( 0 );
    861902
    862903                $params = array(
    863                         'post'        => self::$post_id,
     904                        'post'          => self::$post_id,
    864905                        'author_name'  => 'Reverend Lovejoy',
    865906                        'author_email' => 'lovejoy@example.com',
    866907                        'author_url'   => 'http://timothylovejoy.jr',
    867                         'content'      => '',
     908                        'content'         => '',
    868909                );
    869910
    870911                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    879920                wp_set_current_user( 0 );
    880921
    881922                $params = array(
    882                         'post'        => self::$post_id,
     923                        'post'          => self::$post_id,
    883924                        'author_name'  => 'Reverend Lovejoy',
    884925                        'author_email' => 'lovejoy@example.com',
    885926                        'author_url'   => 'http://timothylovejoy.jr',
    886                         'content'      => 'It\'s all over\, people! We don\'t have a prayer!',
    887                         'date'        => rand_str(),
     927                        'content'         => 'It\'s all over\, people! We don\'t have a prayer!',
     928                        'date'          => rand_str(),
    888929                );
    889930
    890931                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    904945
    905946                wp_set_current_user( self::$admin_id );
    906947                $params = array(
    907                         'post'    => self::$post_id,
     948                        'post'  => self::$post_id,
    908949                        'author_name'  => 'Comic Book Guy',
    909950                        'author_email' => 'cbg@androidsdungeon.com',
    910951                        'author_url'   => 'http://androidsdungeon.com',
    911952                        'author' => $subscriber_id,
    912953                        'content' => 'Worst Comment Ever!',
    913                         'date'    => '2014-11-07T10:14:25',
     954                        'date'  => '2014-11-07T10:14:25',
    914955                );
    915956                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    916957                $request->add_header( 'content-type', 'application/json' );
     
    928969                wp_set_current_user( self::$admin_id );
    929970
    930971                $params = array(
    931                         'post'    => $post_id,
    932                         'author'       => self::$admin_id,
     972                        'post'  => $post_id,
     973                        'author'           => self::$admin_id,
    933974                        'author_name'  => 'Comic Book Guy',
    934975                        'author_email' => 'cbg@androidsdungeon.com',
    935976                        'author_url'   => 'http://androidsdungeon.com',
    936977                        'content' => 'Worst Comment Ever!',
    937                         'date'    => '2014-11-07T10:14:25',
     978                        'date'  => '2014-11-07T10:14:25',
    938979                );
    939980
    940981                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    957998                $this->assertEquals( $comment_id, $collection_data[0]['id'] );
    958999        }
    9591000
     1001        public function test_create_comment_invalid_email() {
     1002                $post_id = $this->factory->post->create();
     1003                wp_set_current_user( self::$admin_id );
     1004
     1005                $params = array(
     1006                        'post'  => $post_id,
     1007                        'author'           => self::$admin_id,
     1008                        'author_name'  => 'Comic Book Guy',
     1009                        'author_email' => 'hello:)',
     1010                        'author_url'   => 'http://androidsdungeon.com',
     1011                        'content' => 'Worst Comment Ever!',
     1012                        'date'  => '2014-11-07T10:14:25',
     1013                );
     1014
     1015                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     1016                $request->add_header( 'content-type', 'application/json' );
     1017                $request->set_body( wp_json_encode( $params ) );
     1018
     1019                $response = $this->server->dispatch( $request );
     1020                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     1021        }
     1022
    9601023        public function test_create_item_current_user() {
    9611024                $user_id = $this->factory->user->create( array(
    9621025                        'role' => 'subscriber',
     
    9951058                wp_set_current_user( self::$admin_id );
    9961059
    9971060                $params = array(
    998                         'post'    => self::$post_id,
     1061                        'post'  => self::$post_id,
    9991062                        'author_name'  => 'Homer Jay Simpson',
    10001063                        'author_email' => 'chunkylover53@aol.com',
    10011064                        'author_url'   => 'http://compuglobalhypermeganet.com',
    10021065                        'content' => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
    1003                         'author'    => self::$subscriber_id,
     1066                        'author'        => self::$subscriber_id,
    10041067                );
    10051068
    10061069                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    10201083                wp_set_current_user( self::$subscriber_id );
    10211084
    10221085                $params = array(
    1023                         'post'        => self::$post_id,
     1086                        'post'          => self::$post_id,
    10241087                        'author_name'  => 'Homer Jay Simpson',
    10251088                        'author_email' => 'chunkylover53@aol.com',
    10261089                        'author_url'   => 'http://compuglobalhypermeganet.com',
    1027                         'content'      => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
    1028                         'author'       => self::$admin_id,
     1090                        'content'         => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
     1091                        'author'           => self::$admin_id,
    10291092                );
    10301093
    10311094                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    10401103                wp_set_current_user( self::$subscriber_id );
    10411104
    10421105                $params = array(
    1043                         'post'        => self::$post_id,
     1106                        'post'          => self::$post_id,
    10441107                        'author_name'  => 'Homer Jay Simpson',
    10451108                        'author_email' => 'chunkylover53@aol.com',
    10461109                        'author_url'   => 'http://compuglobalhypermeganet.com',
    1047                         'content'      => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
    1048                         'author'       => self::$subscriber_id,
    1049                         'karma'        => 100,
     1110                        'content'         => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
     1111                        'author'           => self::$subscriber_id,
     1112                        'karma'         => 100,
    10501113                );
    10511114
    10521115                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    10571120                $this->assertErrorResponse( 'rest_comment_invalid_karma', $response, 403 );
    10581121        }
    10591122
     1123        public function test_create_comment_invalid_post() {
     1124                wp_set_current_user( self::$subscriber_id );
     1125
     1126                $params = array(
     1127                        'post'             => 'some-slug',
     1128                        'author_name'  => 'Homer Jay Simpson',
     1129                        'author_email' => 'chunkylover53@aol.com',
     1130                        'author_url'   => 'http://compuglobalhypermeganet.com',
     1131                        'content'          => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
     1132                        'author'           => self::$subscriber_id,
     1133                );
     1134
     1135                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     1136                $request->add_header( 'content-type', 'application/json' );
     1137                $request->set_body( wp_json_encode( $params ) );
     1138                $response = $this->server->dispatch( $request );
     1139
     1140                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     1141        }
     1142
     1143        public function test_create_comment_karma_invalid_value() {
     1144                wp_set_current_user( self::$subscriber_id );
     1145
     1146                $params = array(
     1147                        'post'           => self::$post_id,
     1148                        'author_name'  => 'Homer Jay Simpson',
     1149                        'author_email' => 'chunkylover53@aol.com',
     1150                        'author_url'   => 'http://compuglobalhypermeganet.com',
     1151                        'content'         => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
     1152                        'author'           => self::$subscriber_id,
     1153                        'karma'         => 'themostkarmaever',
     1154                );
     1155
     1156                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     1157                $request->add_header( 'content-type', 'application/json' );
     1158                $request->set_body( wp_json_encode( $params ) );
     1159                $response = $this->server->dispatch( $request );
     1160
     1161                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     1162        }
     1163
    10601164        public function test_create_comment_status_without_permission() {
    10611165                wp_set_current_user( self::$subscriber_id );
    10621166
    10631167                $params = array(
    1064                         'post'        => self::$post_id,
     1168                        'post'          => self::$post_id,
    10651169                        'author_name'  => 'Homer Jay Simpson',
    10661170                        'author_email' => 'chunkylover53@aol.com',
    10671171                        'author_url'   => 'http://compuglobalhypermeganet.com',
    1068                         'content'      => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
    1069                         'author'       => self::$subscriber_id,
    1070                         'status'        => 'approved',
     1172                        'content'         => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
     1173                        'author'           => self::$subscriber_id,
     1174                        'status'                => 'approved',
    10711175                );
    10721176
    10731177                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    10831187                wp_set_current_user( self::$admin_id );
    10841188
    10851189                $params = array(
    1086                         'post'        => $post_id,
     1190                        'post'          => $post_id,
    10871191                        'author_name'  => 'Comic Book Guy',
    10881192                        'author_email' => 'cbg@androidsdungeon.com',
    1089                         'author_ip'    => '139.130.4.5',
     1193                        'author_ip'     => '139.130.4.5',
    10901194                        'author_url'   => 'http://androidsdungeon.com',
    10911195                        'author_user_agent' => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
    1092                         'content'      => 'Worst Comment Ever!',
    1093                         'status'       => 'approved',
     1196                        'content'         => 'Worst Comment Ever!',
     1197                        'status'           => 'approved',
    10941198                );
    10951199
    10961200                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    11131217                        'author_name'  => 'Comic Book Guy',
    11141218                        'author_email' => 'cbg@androidsdungeon.com',
    11151219                        'author_url'   => 'http://androidsdungeon.com',
    1116                         'author_ip'    => '867.5309',
    1117                         'content'      => 'Worst Comment Ever!',
    1118                         'status'       => 'approved',
     1220                        'author_ip'     => '867.5309',
     1221                        'content'         => 'Worst Comment Ever!',
     1222                        'status'           => 'approved',
    11191223                );
    11201224                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    11211225                $request->add_header( 'content-type', 'application/json' );
     
    11331237                        'author_name'  => 'Comic Book Guy',
    11341238                        'author_email' => 'cbg@androidsdungeon.com',
    11351239                        'author_url'   => 'http://androidsdungeon.com',
    1136                         'content'      => 'Worst Comment Ever!',
    1137                         'status'       => 'approved',
     1240                        'content'         => 'Worst Comment Ever!',
     1241                        'status'           => 'approved',
    11381242                );
    11391243                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    11401244                $request->add_header( 'content-type', 'application/json' );
     
    11511255                        'author_name'  => 'Homer Jay Simpson',
    11521256                        'author_email' => 'chunkylover53@aol.com',
    11531257                        'author_url'   => 'http://compuglobalhypermeganet.com',
    1154                         'content'      => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
    1155                         'author'       => self::$subscriber_id,
     1258                        'content'         => 'Here\’s to alcohol: the cause of, and solution to, all of life\’s problems.',
     1259                        'author'           => self::$subscriber_id,
    11561260                );
    11571261                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    11581262                $request->add_header( 'content-type', 'application/json' );
     
    11671271                wp_set_current_user( self::$subscriber_id );
    11681272
    11691273                $params = array(
    1170                         'post'        => self::$draft_id,
     1274                        'post'          => self::$draft_id,
    11711275                        'author_name'  => 'Ishmael',
    11721276                        'author_email' => 'herman-melville@earthlink.net',
    11731277                        'author_url'   => 'https://en.wikipedia.org/wiki/Herman_Melville',
    1174                         'content'      => 'Call me Ishmael.',
    1175                         'author'       => self::$subscriber_id,
     1278                        'content'         => 'Call me Ishmael.',
     1279                        'author'           => self::$subscriber_id,
    11761280                );
    11771281                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    11781282                $request->add_header( 'content-type', 'application/json' );
     
    11871291                wp_set_current_user( self::$subscriber_id );
    11881292
    11891293                $params = array(
    1190                         'post'        => self::$trash_id,
     1294                        'post'          => self::$trash_id,
    11911295                        'author_name'  => 'Ishmael',
    11921296                        'author_email' => 'herman-melville@earthlink.net',
    11931297                        'author_url'   => 'https://en.wikipedia.org/wiki/Herman_Melville',
    1194                         'content'      => 'Call me Ishmael.',
    1195                         'author'       => self::$subscriber_id,
     1298                        'content'         => 'Call me Ishmael.',
     1299                        'author'           => self::$subscriber_id,
    11961300                );
    11971301                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    11981302                $request->add_header( 'content-type', 'application/json' );
     
    12071311                wp_set_current_user( self::$subscriber_id );
    12081312
    12091313                $params = array(
    1210                         'post'        => self::$private_id,
     1314                        'post'          => self::$private_id,
    12111315                        'author_name'  => 'Homer Jay Simpson',
    12121316                        'author_email' => 'chunkylover53@aol.com',
    12131317                        'author_url'   => 'http://compuglobalhypermeganet.com',
    1214                         'content'      => 'I\’d be a vegetarian if bacon grew on trees.',
    1215                         'author'       => self::$subscriber_id,
     1318                        'content'         => 'I\’d be a vegetarian if bacon grew on trees.',
     1319                        'author'           => self::$subscriber_id,
    12161320                );
    12171321                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    12181322                $request->add_header( 'content-type', 'application/json' );
     
    12261330        public function test_create_item_duplicate() {
    12271331                $this->factory->comment->create(
    12281332                        array(
    1229                                 'comment_post_ID'      => self::$post_id,
    1230                                 'comment_author'       => 'Guy N. Cognito',
     1333                                'comment_post_ID'         => self::$post_id,
     1334                                'comment_author'           => 'Guy N. Cognito',
    12311335                                'comment_author_email' => 'chunkylover53@aol.co.uk',
    1232                                 'comment_content'      => 'Homer? Who is Homer? My name is Guy N. Cognito.',
     1336                                'comment_content'         => 'Homer? Who is Homer? My name is Guy N. Cognito.',
    12331337                        )
    12341338                );
    12351339                wp_set_current_user( 0 );
    12361340
    12371341                $params = array(
    1238                         'post'    => self::$post_id,
     1342                        'post'  => self::$post_id,
    12391343                        'author_name'  => 'Guy N. Cognito',
    12401344                        'author_email' => 'chunkylover53@aol.co.uk',
    12411345                        'content' => 'Homer? Who is Homer? My name is Guy N. Cognito.',
     
    12561360                wp_set_current_user( 0 );
    12571361
    12581362                $params = array(
    1259                         'post'      => $post_id,
     1363                        'post'    => $post_id,
    12601364                );
    12611365
    12621366                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    12821386                wp_set_current_user( self::$admin_id );
    12831387
    12841388                $params = array(
    1285                         'post'        => self::$post_id,
    1286                         'author'       => REST_TESTS_IMPOSSIBLY_HIGH_NUMBER,
    1287                         'content'      => 'It\'s all over\, people! We don\'t have a prayer!',
     1389                        'post'          => self::$post_id,
     1390                        'author'           => REST_TESTS_IMPOSSIBLY_HIGH_NUMBER,
     1391                        'content'         => 'It\'s all over\, people! We don\'t have a prayer!',
    12881392                );
    12891393
    12901394                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    13001404
    13011405                $author = new WP_User( self::$author_id );
    13021406                $params = array(
    1303                         'post'        => self::$post_id,
    1304                         'author'       => self::$author_id,
    1305                         'content'      => 'It\'s all over\, people! We don\'t have a prayer!',
     1407                        'post'          => self::$post_id,
     1408                        'author'           => self::$author_id,
     1409                        'content'         => 'It\'s all over\, people! We don\'t have a prayer!',
    13061410                );
    13071411
    13081412                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    13221426                wp_set_current_user( 0 );
    13231427
    13241428                $params = array(
    1325                         'post'    => self::$post_id,
     1429                        'post'  => self::$post_id,
    13261430                        'author_name'  => 'Comic Book Guy',
    13271431                        'author_email' => 'cbg@androidsdungeon.com',
    13281432                        'author_url'   => 'http://androidsdungeon.com',
     
    13371441                $this->assertEquals( 201, $response->get_status() );
    13381442
    13391443                $params = array(
    1340                         'post'    => self::$post_id,
     1444                        'post'  => self::$post_id,
    13411445                        'author_name'  => 'Comic Book Guy',
    13421446                        'author_email' => 'cbg@androidsdungeon.com',
    13431447                        'author_url'   => 'http://androidsdungeon.com',
    1344                         'content'      => 'Shakes fist at sky',
     1448                        'content'         => 'Shakes fist at sky',
    13451449                );
    13461450
    13471451                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     
    13581462                wp_set_current_user( self::$admin_id );
    13591463
    13601464                $params = array(
    1361                         'author'       => self::$subscriber_id,
     1465                        'author'           => self::$subscriber_id,
    13621466                        'author_name'  => 'Disco Stu',
    13631467                        'author_url'   => 'http://stusdisco.com',
    13641468                        'author_email' => 'stu@stusdisco.com',
    1365                         'author_ip'    => '4.4.4.4',
    1366                         'content'      => 'Testing.',
    1367                         'date'        => '2014-11-07T10:14:25',
    1368                         'karma'        => 100,
    1369                         'post'        => $post_id,
     1469                        'author_ip'     => '4.4.4.4',
     1470                        'content'         => 'Testing.',
     1471                        'date'          => '2014-11-07T10:14:25',
     1472                        'karma'         => 100,
     1473                        'post'          => $post_id,
    13701474                );
    13711475                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
    13721476                $request->add_header( 'content-type', 'application/json' );
     
    15001604
    15011605                $params = array(
    15021606                        'content' => rand_str(),
    1503                         'date'    => rand_str(),
     1607                        'date'  => rand_str(),
    15041608                );
    15051609
    15061610                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     
    15591663                $private_comment_id = $this->factory->comment->create( array(
    15601664                        'comment_approved' => 1,
    15611665                        'comment_post_ID'  => self::$private_id,
    1562                         'user_id'          => 0,
     1666                        'user_id'                 => 0,
    15631667                ));
    15641668
    15651669                wp_set_current_user( self::$subscriber_id );
     
    15801684                $comment_id_1 = $this->factory->comment->create( array(
    15811685                        'comment_approved' => 1,
    15821686                        'comment_post_ID'  => self::$post_id,
    1583                         'user_id'          => self::$subscriber_id,
     1687                        'user_id'                 => self::$subscriber_id,
    15841688                ) );
    15851689
    15861690                $child_comment = $this->factory->comment->create( array(
    15871691                        'comment_approved' => 1,
    15881692                        'comment_post_ID'  => self::$post_id,
    1589                         'user_id'          => self::$subscriber_id,
     1693                        'user_id'                 => self::$subscriber_id,
    15901694                ) );
    15911695
    15921696                // Check if comment 1 does not have the child link.
     
    16151719                $comment_id = $this->factory->comment->create( array(
    16161720                        'comment_approved' => 1,
    16171721                        'comment_post_ID'  => self::$post_id,
    1618                         'user_id'          => self::$subscriber_id,
     1722                        'user_id'                 => self::$subscriber_id,
    16191723                ));
    16201724                $request = new WP_REST_Request( 'DELETE', sprintf( '/wp/v2/comments/%d', $comment_id ) );
    16211725
     
    16311735                $comment_id = $this->factory->comment->create( array(
    16321736                        'comment_approved' => 1,
    16331737                        'comment_post_ID'  => self::$post_id,
    1634                         'user_id'          => self::$subscriber_id,
     1738                        'user_id'                 => self::$subscriber_id,
    16351739                ));
    16361740                $request = new WP_REST_Request( 'DELETE', sprintf( '/wp/v2/comments/%d', $comment_id ) );
    16371741                $request['force'] = true;
     
    16481752                $comment_id = $this->factory->comment->create( array(
    16491753                        'comment_approved' => 1,
    16501754                        'comment_post_ID'  => self::$post_id,
    1651                         'user_id'          => self::$subscriber_id,
     1755                        'user_id'                 => self::$subscriber_id,
    16521756                ));
    16531757                $request = new WP_REST_Request( 'DELETE', sprintf( '/wp/v2/comments/%d', $comment_id ) );
    16541758                $response = $this->server->dispatch( $request );
     
    16811785                $comment_id_1 = $this->factory->comment->create( array(
    16821786                        'comment_approved' => 1,
    16831787                        'comment_post_ID'  => self::$post_id,
    1684                         'user_id'          => self::$subscriber_id,
     1788                        'user_id'                 => self::$subscriber_id,
    16851789                ) );
    16861790
    16871791                $child_comment = $this->factory->comment->create( array(
    16881792                        'comment_approved' => 1,
    16891793                        'comment_parent'   => $comment_id_1,
    16901794                        'comment_post_ID'  => self::$post_id,
    1691                         'user_id'          => self::$subscriber_id,
     1795                        'user_id'                 => self::$subscriber_id,
    16921796                ) );
    16931797
    16941798                $request = new WP_REST_Request( 'DELETE', sprintf( '/wp/v2/comments/%s', $child_comment ) );
     
    17261830                $this->assertArrayHasKey( 'post', $properties );
    17271831                $this->assertArrayHasKey( 'status', $properties );
    17281832                $this->assertArrayHasKey( 'type', $properties );
     1833
     1834                $this->assertEquals( '127.0.0.1', $properties['author_ip']['default'] );
     1835                $this->assertEquals( 0, $properties['parent']['default'] );
     1836                $this->assertEquals( 0, $properties['post']['default'] );
    17291837        }
    17301838
    17311839        public function test_get_item_schema_show_avatar() {
     
    17411849        public function test_get_additional_field_registration() {
    17421850
    17431851                $schema = array(
    1744                         'type'        => 'integer',
     1852                        'type'          => 'integer',
    17451853                        'description' => 'Some integer of mine',
    1746                         'enum'        => array( 1, 2, 3, 4 ),
    1747                         'context'    => array( 'view', 'edit' ),
     1854                        'enum'          => array( 1, 2, 3, 4 ),
     1855                        'context'        => array( 'view', 'edit' ),
    17481856                );
    17491857
    17501858                register_rest_field( 'comment', 'my_custom_int', array(
    1751                         'schema'          => $schema,
    1752                         'get_callback'    => array( $this, 'additional_field_get_callback' ),
     1859                        'schema'                  => $schema,
     1860                        'get_callback'  => array( $this, 'additional_field_get_callback' ),
    17531861                        'update_callback' => array( $this, 'additional_field_update_callback' ),
    17541862                ) );
    17551863
     
    17691877                $request = new WP_REST_Request( 'POST', '/wp/v2/comments/' . self::$approved_id );
    17701878                $request->set_body_params(array(
    17711879                        'my_custom_int' => 123,
    1772                         'content'       => 'abc',
     1880                        'content'          => 'abc',
    17731881                ));
    17741882
    17751883                wp_set_current_user( 1 );
     
    17791887                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    17801888                $request->set_body_params(array(
    17811889                        'my_custom_int' => 123,
    1782                         'title'        => 'hello',
    1783                         'content'       => 'goodbye',
    1784                         'post'          => self::$post_id,
     1890                        'title'          => 'hello',
     1891                        'content'          => 'goodbye',
     1892                        'post'            => self::$post_id,
    17851893                ));
    17861894
    17871895                $response = $this->server->dispatch( $request );
     
    17941902
    17951903        public function test_additional_field_update_errors() {
    17961904                $schema = array(
    1797                         'type'        => 'integer',
     1905                        'type'          => 'integer',
    17981906                        'description' => 'Some integer of mine',
    1799                         'enum'        => array( 1, 2, 3, 4 ),
    1800                         'context'    => array( 'view', 'edit' ),
     1907                        'enum'          => array( 1, 2, 3, 4 ),
     1908                        'context'        => array( 'view', 'edit' ),
    18011909                );
    18021910
    18031911                register_rest_field( 'comment', 'my_custom_int', array(
    1804                         'schema'          => $schema,
    1805                         'get_callback'    => array( $this, 'additional_field_get_callback' ),
     1912                        'schema'                  => $schema,
     1913                        'get_callback'  => array( $this, 'additional_field_get_callback' ),
    18061914                        'update_callback' => array( $this, 'additional_field_update_callback' ),
    18071915                ) );
    18081916
  • tests/phpunit/tests/rest-api/rest-pages-controller.php

     
    9595                $data = $response->get_data();
    9696                $this->assertEquals( 1, count( $data ) );
    9797                $this->assertEquals( $id2, $data[0]['id'] );
     98                // Invalid parent should fail
     99                $request->set_param( 'parent', 'some-slug' );
     100                $response = $this->server->dispatch( $request );
     101                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    98102        }
    99103
    100104        public function test_get_items_parents_query() {
     
    129133                $data = $response->get_data();
    130134                $this->assertEquals( 1, count( $data ) );
    131135                $this->assertEquals( $id1, $data[0]['id'] );
     136                // Invalid parent_exclude should error
     137                $request->set_param( 'parent_exclude', 'some-slug' );
     138                $response = $this->server->dispatch( $request );
     139                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    132140        }
    133141
    134142        public function test_get_items_menu_order_query() {
     
    156164                $this->assertEquals( $id4, $data[1]['id'] );
    157165                $this->assertEquals( $id2, $data[2]['id'] );
    158166                $this->assertEquals( $id3, $data[3]['id'] );
     167                // Invalid menu_order should fail
     168                $request = new WP_REST_Request( 'GET', '/wp/v2/pages' );
     169                $request->set_param( 'menu_order', 'top-first' );
     170                $response = $this->server->dispatch( $request );
     171                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    159172        }
    160173
    161174        public function test_get_items_min_max_pages_query() {
     
    234247
    235248                $request = new WP_REST_Request( 'POST', '/wp/v2/pages' );
    236249                $params = $this->set_post_data( array(
    237                         'template'       => 'page-my-test-template.php',
     250                        'template'         => 'page-my-test-template.php',
    238251                ) );
    239252                $request->set_body_params( $params );
    240253                $response = $this->server->dispatch( $request );
     
    301314
    302315                $request = new WP_REST_Request( 'GET', '/wp/v2/pages' );
    303316                $request->set_query_params( array(
    304                         'page'           => 2,
    305                         'per_page'       => 4,
     317                        'page'             => 2,
     318                        'per_page'         => 4,
    306319                ) );
    307320                $response = $this->server->dispatch( $request );
    308321
     
    360373
    361374        public function test_get_page_with_password() {
    362375                $page_id = $this->factory->post->create( array(
    363                         'post_type'    => 'page',
     376                        'post_type'      => 'page',
    364377                        'post_password' => '$inthebananastand',
    365378                ) );
    366379
     
    376389
    377390        public function test_get_page_with_password_using_password() {
    378391                $page_id = $this->factory->post->create( array(
    379                         'post_type'    => 'page',
     392                        'post_type'      => 'page',
    380393                        'post_password' => '$inthebananastand',
    381394                        'post_content'  => 'Some secret content.',
    382395                        'post_excerpt'  => 'Some secret excerpt.',
     
    396409
    397410        public function test_get_page_with_password_using_incorrect_password() {
    398411                $page_id = $this->factory->post->create( array(
    399                         'post_type'    => 'page',
     412                        'post_type'      => 'page',
    400413                        'post_password' => '$inthebananastand',
    401414                ) );
    402415
     
    410423
    411424        public function test_get_page_with_password_without_permission() {
    412425                $page_id = $this->factory->post->create( array(
    413                         'post_type'    => 'page',
     426                        'post_type'      => 'page',
    414427                        'post_password' => '$inthebananastand',
    415428                        'post_content'  => 'Some secret content.',
    416429                        'post_excerpt'  => 'Some secret excerpt.',
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

     
    9292                        'author_exclude',
    9393                        'before',
    9494                        'categories',
     95                        'categories_exclude',
    9596                        'context',
    9697                        'exclude',
    9798                        'include',
     
    105106                        'status',
    106107                        'sticky',
    107108                        'tags',
     109                        'tags_exclude',
    108110                        ), $keys );
    109111        }
    110112
     
    183185                $this->assertEquals( 2, count( $data ) );
    184186                $this->assertNotEquals( self::$editor_id, $data[0]['author'] );
    185187                $this->assertNotEquals( self::$editor_id, $data[1]['author'] );
     188                // invalid author_exclude errors
     189                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     190                $request->set_param( 'author_exclude', 'invalid' );
     191                $response = $this->server->dispatch( $request );
     192                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    186193        }
    187194
    188195        public function test_get_items_include_query() {
     
    202209                $data = $response->get_data();
    203210                $this->assertEquals( 2, count( $data ) );
    204211                $this->assertEquals( $id1, $data[0]['id'] );
     212                // Invalid include should error
     213                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     214                $request->set_param( 'include', 'invalid' );
     215                $response = $this->server->dispatch( $request );
     216                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    205217        }
    206218
    207219        public function test_get_items_exclude_query() {
     
    224236                $data = $response->get_data();
    225237                $this->assertTrue( in_array( $id1, wp_list_pluck( $data, 'id' ), true ) );
    226238                $this->assertFalse( in_array( $id2, wp_list_pluck( $data, 'id' ), true ) );
     239
     240                $request->set_param( 'exclude', 'invalid' );
     241                $response = $this->server->dispatch( $request );
     242                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    227243        }
    228244
    229245        public function test_get_items_search_query() {
     
    316332                $response = $this->server->dispatch( $request );
    317333                $data = $response->get_data();
    318334                $this->assertEquals( 'Apple Cobbler', $data[0]['title']['rendered'] );
     335                // order=>asc,id should fail
     336                $request->set_param( 'order', 'asc,id' );
     337                $response = $this->server->dispatch( $request );
     338                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     339                // orderby=>content should fail (invalid param test)
     340                $request->set_param( 'order', 'asc' );
     341                $request->set_param( 'orderby', 'content' );
     342                $response = $this->server->dispatch( $request );
     343                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    319344        }
    320345
    321346        public function test_get_items_with_orderby_relevance() {
     
    366391                $request->set_param( 'page', 3 );
    367392                $response = $this->server->dispatch( $request );
    368393                $this->assertCount( 2, $response->get_data() );
     394                // Invalid 'offset' should error
     395                $request->set_param( 'offset', 'moreplease' );
     396                $response = $this->server->dispatch( $request );
     397                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    369398        }
    370399
    371400        public function test_get_items_tags_query() {
     
    422451
    423452                $response = $this->server->dispatch( $request );
    424453                $this->assertCount( 1, $response->get_data() );
     454
     455                $request->set_param( 'tags', array( 'my-tag' ) );
     456                $response = $this->server->dispatch( $request );
     457                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    425458        }
    426459
    427460        public function test_get_items_tags_and_categories_exclude_query() {
     
    444477                $data = $response->get_data();
    445478                $this->assertCount( 1, $data );
    446479                $this->assertEquals( $id2, $data[0]['id'] );
     480
     481                $request->set_param( 'tags_exclude', array( 'my-tag' ) );
     482                $response = $this->server->dispatch( $request );
     483                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    447484        }
    448485
    449486        public function test_get_items_sticky_query() {
     
    461498                $posts = $response->get_data();
    462499                $post = $posts[0];
    463500                $this->assertEquals( $id2, $post['id'] );
     501
     502                $request->set_param( 'sticky', 'nothanks' );
     503                $response = $this->server->dispatch( $request );
     504                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    464505        }
    465506
    466507        public function test_get_items_sticky_with_post__in_query() {
     
    18991940                $response = $this->server->dispatch( $request );
    19001941                $data = $response->get_data();
    19011942                $properties = $data['schema']['properties'];
    1902                 $this->assertEquals( 25, count( $properties ) );
     1943                $this->assertEquals( 23, count( $properties ) );
    19031944                $this->assertArrayHasKey( 'author', $properties );
    19041945                $this->assertArrayHasKey( 'comment_status', $properties );
    19051946                $this->assertArrayHasKey( 'content', $properties );
     
    19221963                $this->assertArrayHasKey( 'title', $properties );
    19231964                $this->assertArrayHasKey( 'type', $properties );
    19241965                $this->assertArrayHasKey( 'tags', $properties );
    1925                 $this->assertArrayHasKey( 'tags_exclude', $properties );
    19261966                $this->assertArrayHasKey( 'categories', $properties );
    1927                 $this->assertArrayHasKey( 'categories_exclude', $properties );
    19281967        }
    19291968
    19301969        public function test_get_additional_field_registration() {
  • tests/phpunit/tests/rest-api/rest-tags-controller.php

     
    9898                $this->assertEquals( 2, count( $data ) );
    9999                $this->assertEquals( 'Season 5', $data[0]['name'] );
    100100                $this->assertEquals( 'The Be Sharps', $data[1]['name'] );
     101                // invalid value should fail
     102                $request->set_param( 'hide_empty', 'nothanks' );
     103                $response = $this->server->dispatch( $request );
     104                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    101105        }
    102106
    103107        public function test_get_items_include_query() {
     
    117121                $data = $response->get_data();
    118122                $this->assertEquals( 2, count( $data ) );
    119123                $this->assertEquals( $id3, $data[0]['id'] );
     124                // Include invalid value shoud fail
     125                $request->set_param( 'include', array( 'myterm' ) );
     126                $response = $this->server->dispatch( $request );
     127                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    120128        }
    121129
    122130        public function test_get_items_exclude_query() {
     
    132140                $data = $response->get_data();
    133141                $this->assertTrue( in_array( $id1, wp_list_pluck( $data, 'id' ), true ) );
    134142                $this->assertFalse( in_array( $id2, wp_list_pluck( $data, 'id' ), true ) );
     143                // Invalid exclude value should fail
     144                $request->set_param( 'exclude', array( 'invalid' ) );
     145                $response = $this->server->dispatch( $request );
     146                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    135147        }
    136148
    137149        public function test_get_items_offset_query() {
     
    151163                $request->set_param( 'page', 3 );
    152164                $response = $this->server->dispatch( $request );
    153165                $this->assertCount( 2, $response->get_data() );
     166                // 'offset' invalid value shoudl fail
     167                $request->set_param( 'offset', 'moreplease' );
     168                $response = $this->server->dispatch( $request );
     169                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    154170        }
    155171
    156172
     
    181197                $data = $response->get_data();
    182198                $this->assertEquals( 2, count( $data ) );
    183199                $this->assertEquals( 'Apple', $data[0]['name'] );
     200                // Invalid orderby should fail.
     201                $request->set_param( 'orderby', 'invalid' );
     202                $response = $this->server->dispatch( $request );
     203                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    184204        }
    185205
    186206        public function test_get_items_orderby_id() {
     
    231251                $data = $response->get_data();
    232252                $this->assertEquals( 2, count( $data ) );
    233253                $this->assertEquals( 'DC', $data[0]['name'] );
     254
     255                // Invalid post should error.
     256                $request = new WP_REST_Request( 'GET', '/wp/v2/tags' );
     257                $request->set_param( 'post', 'invalid-post' );
     258                $response = $this->server->dispatch( $request );
     259                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    234260        }
    235261
    236262        public function test_get_terms_post_args_paging() {
  • tests/phpunit/tests/rest-api/rest-users-controller.php

     
    363363                $this->assertErrorResponse( 'rest_forbidden_orderby', $response, 401 );
    364364        }
    365365
     366        public function test_get_items_invalid_order() {
     367                $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     368                $request->set_param( 'order', 'asc,id' );
     369                $response = $this->server->dispatch( $request );
     370                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     371        }
     372
     373        public function test_get_items_invalid_orderby() {
     374                $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     375                $request->set_param( 'orderby', 'invalid' );
     376                $response = $this->server->dispatch( $request );
     377                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     378        }
     379
    366380        public function test_get_items_offset() {
    367381                wp_set_current_user( self::$user );
    368382                // 2 users created in __construct(), plus default user
     
    379393                $request->set_param( 'page', 3 );
    380394                $response = $this->server->dispatch( $request );
    381395                $this->assertCount( 2, $response->get_data() );
     396                // 'offset' invalid value should error
     397                $request->set_param( 'offset', 'moreplease' );
     398                $response = $this->server->dispatch( $request );
     399                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    382400        }
    383401
    384402        public function test_get_items_include_query() {
     
    399417                $data = $response->get_data();
    400418                $this->assertEquals( 2, count( $data ) );
    401419                $this->assertEquals( $id3, $data[0]['id'] );
     420                // Invalid include should fail
     421                $request->set_param( 'include', 'invalid' );
     422                $response = $this->server->dispatch( $request );
     423                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    402424                // No privileges
     425                $request->set_param( 'include', array( $id3, $id1 ) );
    403426                wp_set_current_user( 0 );
    404427                $response = $this->server->dispatch( $request );
    405428                $data = $response->get_data();
     
    421444                $data = $response->get_data();
    422445                $this->assertTrue( in_array( $id1, wp_list_pluck( $data, 'id' ), true ) );
    423446                $this->assertFalse( in_array( $id2, wp_list_pluck( $data, 'id' ), true ) );
     447                // Invalid exlude value should error.
     448                $request->set_param( 'exclude', 'none-of-those-please' );
     449                $response = $this->server->dispatch( $request );
     450                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    424451        }
    425452
    426453        public function test_get_items_search() {