Make WordPress Core


Ignore:
Timestamp:
09/05/2020 06:07:46 PM (3 years ago)
Author:
TimothyBlynJacobs
Message:

REST API: Support a route-level validation callback.

Most request data is validated on a per-parameter basis. Often, however, additional validation is needed that operates on the entire request object. Currently, this is done in the route callback and often in the prepare_item_for_database method specifically.

#50244 aims to introduce batch processing in the REST API. An important feature is the ability to enforce that all requests have valid data before executing the route callbacks in "pre-validate" mode.

This patch introduces support for calling a validate_callback after all parameter validation has succeeded. That allows moving more validation outside of the route callback and into WP_REST_Request which will improve "pre-validate" support.

Props TimothyBlynJacobs, zieladam.
Fixes #51255.
See #50244.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/rest-api/rest-request.php

    r48939 r48945  
    780780        $this->assertSame( 'value', $request->get_param( 'param' ) );
    781781    }
     782
     783    /**
     784     * @ticket 51255
     785     */
     786    public function test_route_level_validate_callback() {
     787        $request = new WP_REST_Request();
     788        $request->set_query_params( array( 'test' => 'value' ) );
     789
     790        $error    = new WP_Error( 'error_code', __( 'Error Message' ), array( 'status' => 400 ) );
     791        $callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
     792        $callback->expects( self::once() )->method( '__invoke' )->with( self::identicalTo( $request ) )->willReturn( $error );
     793        $request->set_attributes(
     794            array(
     795                'args'              => array(
     796                    'test' => array(
     797                        'validate_callback' => '__return_true',
     798                    ),
     799                ),
     800                'validate_callback' => $callback,
     801            )
     802        );
     803
     804        $this->assertSame( $error, $request->has_valid_params() );
     805    }
     806
     807    /**
     808     * @ticket 51255
     809     */
     810    public function test_route_level_validate_callback_no_parameter_callbacks() {
     811        $request = new WP_REST_Request();
     812        $request->set_query_params( array( 'test' => 'value' ) );
     813
     814        $error    = new WP_Error( 'error_code', __( 'Error Message' ), array( 'status' => 400 ) );
     815        $callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
     816        $callback->expects( self::once() )->method( '__invoke' )->with( self::identicalTo( $request ) )->willReturn( $error );
     817        $request->set_attributes(
     818            array(
     819                'validate_callback' => $callback,
     820            )
     821        );
     822
     823        $this->assertSame( $error, $request->has_valid_params() );
     824    }
     825
     826    /**
     827     * @ticket 51255
     828     */
     829    public function test_route_level_validate_callback_is_not_executed_if_parameter_validation_fails() {
     830        $request = new WP_REST_Request();
     831        $request->set_query_params( array( 'test' => 'value' ) );
     832
     833        $callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
     834        $callback->expects( self::never() )->method( '__invoke' );
     835        $request->set_attributes(
     836            array(
     837                'validate_callback' => $callback,
     838                'args'              => array(
     839                    'test' => array(
     840                        'validate_callback' => '__return_false',
     841                    ),
     842                ),
     843            )
     844        );
     845
     846        $valid = $request->has_valid_params();
     847        $this->assertWPError( $valid );
     848        $this->assertEquals( 'rest_invalid_param', $valid->get_error_code() );
     849    }
    782850}
Note: See TracChangeset for help on using the changeset viewer.