WordPress.org

Make WordPress Core

Ticket #38531: 38531.diff

File 38531.diff, 20.2 KB (added by joehoyle, 5 years ago)
  • src/wp-includes/rest-api.php

    diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
    index 1a7da17..bcd982e 100644
    a b function rest_validate_request_arg( $value, $request, $param ) { 
    818818                return true;
    819819        }
    820820        $args = $attributes['args'][ $param ];
    821 
    822         if ( ! empty( $args['enum'] ) ) {
    823                 if ( ! in_array( $value, $args['enum'], true ) ) {
    824                         return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: list of valid values */ __( '%1$s is not one of %2$s.' ), $param, implode( ', ', $args['enum'] ) ) );
    825                 }
    826         }
    827 
    828         if ( 'integer' === $args['type'] && ! is_numeric( $value ) ) {
    829                 return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $param, 'integer' ) );
    830         }
    831 
    832         if ( 'boolean' === $args['type'] && ! rest_is_boolean( $value ) ) {
    833                 return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $value, 'boolean' ) );
    834         }
    835 
    836         if ( 'string' === $args['type'] && ! is_string( $value ) ) {
    837                 return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $param, 'string' ) );
    838         }
    839 
    840         if ( isset( $args['format'] ) ) {
    841                 switch ( $args['format'] ) {
    842                         case 'date-time' :
    843                                 if ( ! rest_parse_date( $value ) ) {
    844                                         return new WP_Error( 'rest_invalid_date', __( 'The date you provided is invalid.' ) );
    845                                 }
    846                                 break;
    847 
    848                         case 'email' :
    849                                 if ( ! is_email( $value ) ) {
    850                                         return new WP_Error( 'rest_invalid_email', __( 'The email address you provided is invalid.' ) );
    851                                 }
    852                                 break;
    853                         case 'ipv4' :
    854                                 if ( ! rest_is_ip_address( $value ) ) {
    855                                         return new WP_Error( 'rest_invalid_param', sprintf( __( '%s is not a valid IP address.' ), $value ) );
    856                                 }
    857                                 break;
    858                 }
    859         }
    860 
    861         if ( in_array( $args['type'], array( 'numeric', 'integer' ), true ) && ( isset( $args['minimum'] ) || isset( $args['maximum'] ) ) ) {
    862                 if ( isset( $args['minimum'] ) && ! isset( $args['maximum'] ) ) {
    863                         if ( ! empty( $args['exclusiveMinimum'] ) && $value <= $args['minimum'] ) {
    864                                 return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be greater than %2$d (exclusive)' ), $param, $args['minimum'] ) );
    865                         } elseif ( empty( $args['exclusiveMinimum'] ) && $value < $args['minimum'] ) {
    866                                 return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be greater than %2$d (inclusive)' ), $param, $args['minimum'] ) );
    867                         }
    868                 } elseif ( isset( $args['maximum'] ) && ! isset( $args['minimum'] ) ) {
    869                         if ( ! empty( $args['exclusiveMaximum'] ) && $value >= $args['maximum'] ) {
    870                                 return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be less than %2$d (exclusive)' ), $param, $args['maximum'] ) );
    871                         } elseif ( empty( $args['exclusiveMaximum'] ) && $value > $args['maximum'] ) {
    872                                 return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be less than %2$d (inclusive)' ), $param, $args['maximum'] ) );
    873                         }
    874                 } elseif ( isset( $args['maximum'] ) && isset( $args['minimum'] ) ) {
    875                         if ( ! empty( $args['exclusiveMinimum'] ) && ! empty( $args['exclusiveMaximum'] ) ) {
    876                                 if ( $value >= $args['maximum'] || $value <= $args['minimum'] ) {
    877                                         return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (exclusive) and %3$d (exclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
    878                                 }
    879                         } elseif ( empty( $args['exclusiveMinimum'] ) && ! empty( $args['exclusiveMaximum'] ) ) {
    880                                 if ( $value >= $args['maximum'] || $value < $args['minimum'] ) {
    881                                         return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (inclusive) and %3$d (exclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
    882                                 }
    883                         } elseif ( ! empty( $args['exclusiveMinimum'] ) && empty( $args['exclusiveMaximum'] ) ) {
    884                                 if ( $value > $args['maximum'] || $value <= $args['minimum'] ) {
    885                                         return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (exclusive) and %3$d (inclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
    886                                 }
    887                         } elseif ( empty( $args['exclusiveMinimum'] ) && empty( $args['exclusiveMaximum'] ) ) {
    888                                 if ( $value > $args['maximum'] || $value < $args['minimum'] ) {
    889                                         return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (inclusive) and %3$d (inclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
    890                                 }
    891                         }
    892                 }
    893         }
    894 
    895         return true;
     821        return rest_validate_value_from_schema( $value, $args, $param );
    896822}
    897823
    898824/**
    function rest_sanitize_request_arg( $value, $request, $param ) { 
    911837                return $value;
    912838        }
    913839        $args = $attributes['args'][ $param ];
    914 
    915         if ( 'integer' === $args['type'] ) {
    916                 return (int) $value;
    917         }
    918 
    919         if ( 'boolean' === $args['type'] ) {
    920                 return rest_sanitize_boolean( $value );
    921         }
    922 
    923         if ( isset( $args['format'] ) ) {
    924                 switch ( $args['format'] ) {
    925                         case 'date-time' :
    926                                 return sanitize_text_field( $value );
    927 
    928                         case 'email' :
    929                                 /*
    930                                  * sanitize_email() validates, which would be unexpected
    931                                  */
    932                                 return sanitize_text_field( $value );
    933 
    934                         case 'uri' :
    935                                 return esc_url_raw( $value );
    936 
    937                         case 'ipv4' :
    938                                 return sanitize_text_field( $value );
    939                 }
    940         }
    941 
    942         return $value;
     840        return rest_sanitize_value_from_schema( $value, $args, $param );
    943841}
    944842
    945843/**
    function rest_get_avatar_sizes() { 
    1083981         */
    1084982        return apply_filters( 'rest_avatar_sizes', array( 24, 48, 96 ) );
    1085983}
     984
     985/**
     986 * Validate a value based on a schema.
     987 *
     988 * @param  mixed  $value The value to validate.
     989 * @param  array  $args  Schema array to use for validation.
     990 * @param  string $param The parameter name, used in error messages.
     991 * @return true|WP_Error
     992 */
     993function rest_validate_value_from_schema( $value, $args, $param = '' ) {
     994        if ( 'array' === $args['type'] ) {
     995                if ( ! is_array( $value ) ) {
     996                        return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $param, 'array' ) );
     997                }
     998                if ( empty( $args['items'] ) ) {
     999                        var_dump( $value );
     1000                        var_dump( $args );
     1001                        var_dump( $param );
     1002                }
     1003                foreach ( $value as $index => $v ) {
     1004                        $is_valid = rest_validate_value_from_schema( $v, $args['items'], $param . '[' . $index . ']' );
     1005                        if ( is_wp_error( $is_valid ) ) {
     1006                                return $is_valid;
     1007                        }
     1008                }
     1009        }
     1010        if ( ! empty( $args['enum'] ) ) {
     1011                if ( ! in_array( $value, $args['enum'], true ) ) {
     1012                        return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: list of valid values */ __( '%1$s is not one of %2$s.' ), $param, implode( ', ', $args['enum'] ) ) );
     1013                }
     1014        }
     1015
     1016        if ( in_array( $args['type'], array( 'integer', 'number' ) ) && ! is_numeric( $value ) ) {
     1017                return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $param, $args['type'] ) );
     1018        }
     1019
     1020        if ( 'integer' === $args['type'] && round( floatval( $value ) ) !== floatval( $value ) ) {
     1021                return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $param, 'integer' ) );
     1022        }
     1023
     1024        if ( 'boolean' === $args['type'] && ! rest_is_boolean( $value ) ) {
     1025                return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $value, 'boolean' ) );
     1026        }
     1027
     1028        if ( 'string' === $args['type'] && ! is_string( $value ) ) {
     1029                return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: type name */ __( '%1$s is not of type %2$s.' ), $param, 'string' ) );
     1030        }
     1031
     1032        if ( isset( $args['format'] ) ) {
     1033                switch ( $args['format'] ) {
     1034                        case 'date-time' :
     1035                                if ( ! rest_parse_date( $value ) ) {
     1036                                        return new WP_Error( 'rest_invalid_date', __( 'The date you provided is invalid.' ) );
     1037                                }
     1038                                break;
     1039
     1040                        case 'email' :
     1041                                if ( ! is_email( $value ) ) {
     1042                                        return new WP_Error( 'rest_invalid_email', __( 'The email address you provided is invalid.' ) );
     1043                                }
     1044                                break;
     1045                        case 'ipv4' :
     1046                                if ( ! rest_is_ip_address( $value ) ) {
     1047                                        return new WP_Error( 'rest_invalid_param', sprintf( __( '%s is not a valid IP address.' ), $value ) );
     1048                                }
     1049                                break;
     1050                }
     1051        }
     1052
     1053        if ( in_array( $args['type'], array( 'number', 'integer' ), true ) && ( isset( $args['minimum'] ) || isset( $args['maximum'] ) ) ) {
     1054                if ( isset( $args['minimum'] ) && ! isset( $args['maximum'] ) ) {
     1055                        if ( ! empty( $args['exclusiveMinimum'] ) && $value <= $args['minimum'] ) {
     1056                                return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be greater than %2$d (exclusive)' ), $param, $args['minimum'] ) );
     1057                        } elseif ( empty( $args['exclusiveMinimum'] ) && $value < $args['minimum'] ) {
     1058                                return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be greater than %2$d (inclusive)' ), $param, $args['minimum'] ) );
     1059                        }
     1060                } elseif ( isset( $args['maximum'] ) && ! isset( $args['minimum'] ) ) {
     1061                        if ( ! empty( $args['exclusiveMaximum'] ) && $value >= $args['maximum'] ) {
     1062                                return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be less than %2$d (exclusive)' ), $param, $args['maximum'] ) );
     1063                        } elseif ( empty( $args['exclusiveMaximum'] ) && $value > $args['maximum'] ) {
     1064                                return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s must be less than %2$d (inclusive)' ), $param, $args['maximum'] ) );
     1065                        }
     1066                } elseif ( isset( $args['maximum'] ) && isset( $args['minimum'] ) ) {
     1067                        if ( ! empty( $args['exclusiveMinimum'] ) && ! empty( $args['exclusiveMaximum'] ) ) {
     1068                                if ( $value >= $args['maximum'] || $value <= $args['minimum'] ) {
     1069                                        return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (exclusive) and %3$d (exclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
     1070                                }
     1071                        } elseif ( empty( $args['exclusiveMinimum'] ) && ! empty( $args['exclusiveMaximum'] ) ) {
     1072                                if ( $value >= $args['maximum'] || $value < $args['minimum'] ) {
     1073                                        return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (inclusive) and %3$d (exclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
     1074                                }
     1075                        } elseif ( ! empty( $args['exclusiveMinimum'] ) && empty( $args['exclusiveMaximum'] ) ) {
     1076                                if ( $value > $args['maximum'] || $value <= $args['minimum'] ) {
     1077                                        return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (exclusive) and %3$d (inclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
     1078                                }
     1079                        } elseif ( empty( $args['exclusiveMinimum'] ) && empty( $args['exclusiveMaximum'] ) ) {
     1080                                if ( $value > $args['maximum'] || $value < $args['minimum'] ) {
     1081                                        return new WP_Error( 'rest_invalid_param', sprintf( /* translators: 1: parameter, 2: minimum number, 3: maximum number */ __( '%1$s must be between %2$d (inclusive) and %3$d (inclusive)' ), $param, $args['minimum'], $args['maximum'] ) );
     1082                                }
     1083                        }
     1084                }
     1085        }
     1086
     1087        return true;
     1088}
     1089
     1090/**
     1091 * Sanitize a value based on a schema.
     1092 *
     1093 * @param  mixed  $value The value to sanitize.
     1094 * @param  array  $args  Schema array to use for sanitization.
     1095 * @return true|WP_Error
     1096 */
     1097function rest_sanitize_value_from_schema( $value, $args ) {
     1098        if ( 'array' === $args['type'] ) {
     1099                if ( empty( $args['items'] ) ) {
     1100                        var_dump( $value );
     1101                        var_dump( $args );
     1102                        var_dump( $param );
     1103                }
     1104                foreach ( $value as $index => $v ) {
     1105                        $value[ $index ] = rest_sanitize_value_from_schema( $v, $args['items'] );
     1106                }
     1107                return $value;
     1108        }
     1109        if ( 'integer' === $args['type'] ) {
     1110                return (int) $value;
     1111        }
     1112
     1113        if ( 'number' === $args['type'] ) {
     1114                return (float) $value;
     1115        }
     1116
     1117        if ( 'boolean' === $args['type'] ) {
     1118                return rest_sanitize_boolean( $value );
     1119        }
     1120
     1121        if ( isset( $args['format'] ) ) {
     1122                switch ( $args['format'] ) {
     1123                        case 'date-time' :
     1124                                return sanitize_text_field( $value );
     1125
     1126                        case 'email' :
     1127                                /*
     1128                                 * sanitize_email() validates, which would be unexpected
     1129                                 */
     1130                                return sanitize_text_field( $value );
     1131
     1132                        case 'uri' :
     1133                                return esc_url_raw( $value );
     1134
     1135                        case 'ipv4' :
     1136                                return sanitize_text_field( $value );
     1137                }
     1138        }
     1139
     1140        return $value;
     1141}
  • src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php
    index 4cb19b4..257a880 100644
    a b abstract class WP_REST_Controller { 
    463463                                $endpoint_args[ $field_id ]['required'] = true;
    464464                        }
    465465
    466                         foreach ( array( 'type', 'format', 'enum' ) as $schema_prop ) {
     466                        foreach ( array( 'type', 'format', 'enum', 'items' ) as $schema_prop ) {
    467467                                if ( isset( $params[ $schema_prop ] ) ) {
    468468                                        $endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ];
    469469                                }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index 53692d8..7698c93 100644
    a b class WP_REST_Posts_Controller extends WP_REST_Controller { 
    17731773                        $schema['properties'][ $base ] = array(
    17741774                                'description' => sprintf( __( 'The terms assigned to the object in the %s taxonomy.' ), $taxonomy->name ),
    17751775                                'type'        => 'array',
     1776                                'items'       => array(
     1777                                        'type'    => 'integer',
     1778                                ),
    17761779                                'context'     => array( 'view', 'edit' ),
    17771780                        );
    17781781                        $schema['properties'][ $base . '_exclude' ] = array(
  • src/wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php
    index 921360e..4db471a 100644
    a b class WP_REST_Settings_Controller extends WP_REST_Controller { 
    220220
    221221                foreach ( $options as $option_name => $option ) {
    222222                        $schema['properties'][ $option_name ] = $option['schema'];
     223                        $schema['properties'][ $option_name ]['arg_options'] = array(
     224                                'sanitize_callback' => array( $this, 'sanitize_callback' ),
     225                        );
    223226                }
    224227
    225228                return $this->add_additional_fields_schema( $schema );
    226229        }
     230
     231        /**
     232         * Custom sanitize callback used for all options to allow the use of 'null'.
     233         *
     234         * By default, the schema of settings will throw an error if a value is set to
     235         * `null` as it's not a valid value for something like "type => string". We
     236         * provide a wrapper sanitizer to whitelist the use of `null`.
     237         *
     238         * @param  mixed           $value   The value for the setting.
     239         * @param  WP_REST_Request $request The request object.
     240         * @param  string          $param   The parameter name.
     241         * @return mixed|WP_Error
     242         */
     243        public function sanitize_callback( $value, $request, $param ) {
     244                if ( is_null( $value ) ) {
     245                        return $value;
     246                }
     247                return rest_parse_request_arg( $value, $request, $param );
     248        }
    227249}
  • src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php
    index 9430438..1362de4 100644
    a b class WP_REST_Users_Controller extends WP_REST_Controller { 
    871871                                'roles'           => array(
    872872                                        'description' => __( 'Roles assigned to the resource.' ),
    873873                                        'type'        => 'array',
     874                                        'items'       => array(
     875                                                'type'    => 'string',
     876                                        ),
    874877                                        'context'     => array( 'edit' ),
    875878                                ),
    876879                                'password'        => array(
  • new file tests/phpunit/tests/rest-api/rest-schema-validation.php

    diff --git a/tests/phpunit/tests/rest-api/rest-schema-validation.php b/tests/phpunit/tests/rest-api/rest-schema-validation.php
    new file mode 100644
    index 0000000..0df4040
    - +  
     1<?php
     2/**
     3 * Unit tests covering schema validation and sanization functionality.
     4 *
     5 * @package WordPress
     6 * @subpackage REST API
     7 */
     8
     9/**
     10 * @group restapi
     11 */
     12class WP_Test_REST_Schema_Validation extends WP_UnitTestCase {
     13
     14        public function test_type_number() {
     15                $schema = array(
     16                        'type'    => 'number',
     17                        'minimum' => 1,
     18                        'maximum' => 2,
     19                );
     20                $this->assertTrue( rest_validate_value_from_schema( 1, $schema ) );
     21                $this->assertTrue( rest_validate_value_from_schema( 2, $schema ) );
     22                $this->assertWPError( rest_validate_value_from_schema( 3, $schema ) );
     23                $this->assertWPError( rest_validate_value_from_schema( true, $schema ) );
     24        }
     25
     26        public function test_type_integer() {
     27                $schema = array(
     28                        'type' => 'integer',
     29                        'minimum' => 1,
     30                        'maximum' => 2,
     31                );
     32                $this->assertTrue( rest_validate_value_from_schema( 1, $schema ) );
     33                $this->assertTrue( rest_validate_value_from_schema( 2, $schema ) );
     34                $this->assertWPError( rest_validate_value_from_schema( 3, $schema ) );
     35                $this->assertWPError( rest_validate_value_from_schema( 1.1, $schema ) );
     36        }
     37
     38        public function test_type_string() {
     39                $schema = array(
     40                        'type' => 'string',
     41                );
     42                $this->assertTrue( rest_validate_value_from_schema( 'Hello :)', $schema ) );
     43                $this->assertTrue( rest_validate_value_from_schema( '1', $schema ) );
     44                $this->assertWPError( rest_validate_value_from_schema( 1, $schema ) );
     45                $this->assertWPError( rest_validate_value_from_schema( array(), $schema ) );
     46        }
     47
     48        public function test_type_boolean() {
     49                $schema = array(
     50                        'type' => 'boolean',
     51                );
     52                $this->assertTrue( rest_validate_value_from_schema( true, $schema ) );
     53                $this->assertTrue( rest_validate_value_from_schema( false, $schema ) );
     54                $this->assertTrue( rest_validate_value_from_schema( 1, $schema ) );
     55                $this->assertTrue( rest_validate_value_from_schema( 0, $schema ) );
     56                $this->assertTrue( rest_validate_value_from_schema( 'true', $schema ) );
     57                $this->assertTrue( rest_validate_value_from_schema( 'false', $schema ) );
     58                $this->assertWPError( rest_validate_value_from_schema( 'no', $schema ) );
     59                $this->assertWPError( rest_validate_value_from_schema( 'yes', $schema ) );
     60                $this->assertWPError( rest_validate_value_from_schema( 1123, $schema ) );
     61        }
     62
     63        public function test_format_email() {
     64                $schema = array(
     65                        'type'  => 'string',
     66                        'format' => 'email',
     67                );
     68                $this->assertTrue( rest_validate_value_from_schema( 'email@example.com', $schema ) );
     69                $this->assertTrue( rest_validate_value_from_schema( 'a@b.c', $schema ) );
     70                $this->assertWPError( rest_validate_value_from_schema( 'email', $schema ) );
     71        }
     72
     73        public function test_format_date_time() {
     74                $schema = array(
     75                        'type'  => 'string',
     76                        'format' => 'date-time',
     77                );
     78                $this->assertTrue( rest_validate_value_from_schema( '2016-06-30T05:43:21', $schema ) );
     79                $this->assertTrue( rest_validate_value_from_schema( '2016-06-30T05:43:21Z', $schema ) );
     80                $this->assertTrue( rest_validate_value_from_schema( '2016-06-30T05:43:21+00:00', $schema ) );
     81                $this->assertWPError( rest_validate_value_from_schema( '20161027T163355Z', $schema ) );
     82                $this->assertWPError( rest_validate_value_from_schema( '2016', $schema ) );
     83                $this->assertWPError( rest_validate_value_from_schema( '2016-06-30', $schema ) );
     84        }
     85
     86        public function test_format_ipv4() {
     87                $schema = array(
     88                        'type'  => 'string',
     89                        'format' => 'ipv4',
     90                );
     91                $this->assertTrue( rest_validate_value_from_schema( '127.0.0.1', $schema ) );
     92                $this->assertWPError( rest_validate_value_from_schema( '3333.3333.3333.3333', $schema ) );
     93                $this->assertWPError( rest_validate_value_from_schema( '1', $schema ) );
     94        }
     95
     96        public function test_type_array() {
     97                $schema = array(
     98                        'type' => 'array',
     99                        'items' => array(
     100                                'type' => 'number',
     101                        ),
     102                );
     103                $this->assertTrue( rest_validate_value_from_schema( array( 1 ), $schema ) );
     104                $this->assertWPError( rest_validate_value_from_schema( array( true ), $schema ) );
     105        }
     106}