WordPress.org

Make WordPress Core


Ignore:
Timestamp:
02/02/2021 05:26:06 PM (3 months ago)
Author:
TimothyBlynJacobs
Message:

REST API: Return detailed error information from request validation.

Previously, only the first error message for each parameter was made available. Now, all error messages for a parameter are concatenated. Additionally, the detailed error for each parameter is made available in a new details section of the validation error. Each error is formatted following the standard REST API error formatting.

The WP_REST_Server::error_to_response method has been abstracted out into a standalone function rest_convert_error_to_response to allow for reuse by WP_REST_Request. The formatted errors now also contain an additional_data property which contains the additional error data provided by WP_Error::get_all_error_data.

Props dlh, xkon, TimothyBlynJacobs.
Fixes #46191.

File:
1 edited

Legend:

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

    r49547 r50150  
    463463    }
    464464
     465    /**
     466     * @ticket 46191
     467     */
     468    public function test_sanitize_params_error_multiple_messages() {
     469        $this->request->set_url_params(
     470            array(
     471                'failparam' => '123',
     472            )
     473        );
     474        $this->request->set_attributes(
     475            array(
     476                'args' => array(
     477                    'failparam' => array(
     478                        'sanitize_callback' => function () {
     479                            $error = new WP_Error( 'invalid', 'Invalid.' );
     480                            $error->add( 'invalid', 'Super Invalid.' );
     481                            $error->add( 'broken', 'Broken.' );
     482
     483                            return $error;
     484                        },
     485                    ),
     486                ),
     487            )
     488        );
     489
     490        $valid = $this->request->sanitize_params();
     491        $this->assertWPError( $valid );
     492        $data = $valid->get_error_data();
     493
     494        $this->assertInternalType( 'array', $data );
     495        $this->assertArrayHasKey( 'params', $data );
     496        $this->assertArrayHasKey( 'failparam', $data['params'] );
     497        $this->assertEquals( 'Invalid. Super Invalid. Broken.', $data['params']['failparam'] );
     498    }
     499
     500    /**
     501     * @ticket 46191
     502     */
     503    public function test_sanitize_params_provides_detailed_errors() {
     504        $this->request->set_url_params(
     505            array(
     506                'failparam' => '123',
     507            )
     508        );
     509        $this->request->set_attributes(
     510            array(
     511                'args' => array(
     512                    'failparam' => array(
     513                        'sanitize_callback' => function () {
     514                            return new WP_Error( 'invalid', 'Invalid.', 'mydata' );
     515                        },
     516                    ),
     517                ),
     518            )
     519        );
     520
     521        $valid = $this->request->sanitize_params();
     522        $this->assertWPError( $valid );
     523
     524        $data = $valid->get_error_data();
     525        $this->assertArrayHasKey( 'details', $data );
     526        $this->assertArrayHasKey( 'failparam', $data['details'] );
     527        $this->assertEquals(
     528            array(
     529                'code'    => 'invalid',
     530                'message' => 'Invalid.',
     531                'data'    => 'mydata',
     532            ),
     533            $data['details']['failparam']
     534        );
     535    }
     536
    465537    public function test_sanitize_params_with_null_callback() {
    466538        $this->request->set_url_params(
     
    651723        $this->assertSame( array( 'someinteger', 'someotherparams' ), array_keys( $error_data['params'] ) );
    652724        $this->assertSame( 'This is not valid!', $error_data['params']['someotherparams'] );
     725    }
     726
     727
     728    /**
     729     * @ticket 46191
     730     */
     731    public function test_invalid_params_error_multiple_messages() {
     732        $this->request->set_url_params(
     733            array(
     734                'failparam' => '123',
     735            )
     736        );
     737        $this->request->set_attributes(
     738            array(
     739                'args' => array(
     740                    'failparam' => array(
     741                        'validate_callback' => function () {
     742                            $error = new WP_Error( 'invalid', 'Invalid.' );
     743                            $error->add( 'invalid', 'Super Invalid.' );
     744                            $error->add( 'broken', 'Broken.' );
     745
     746                            return $error;
     747                        },
     748                    ),
     749                ),
     750            )
     751        );
     752
     753        $valid = $this->request->has_valid_params();
     754        $this->assertWPError( $valid );
     755        $data = $valid->get_error_data();
     756
     757        $this->assertInternalType( 'array', $data );
     758        $this->assertArrayHasKey( 'params', $data );
     759        $this->assertArrayHasKey( 'failparam', $data['params'] );
     760        $this->assertEquals( 'Invalid. Super Invalid. Broken.', $data['params']['failparam'] );
     761    }
     762
     763    /**
     764     * @ticket 46191
     765     */
     766    public function test_invalid_params_provides_detailed_errors() {
     767        $this->request->set_url_params(
     768            array(
     769                'failparam' => '123',
     770            )
     771        );
     772        $this->request->set_attributes(
     773            array(
     774                'args' => array(
     775                    'failparam' => array(
     776                        'validate_callback' => function () {
     777                            return new WP_Error( 'invalid', 'Invalid.', 'mydata' );
     778                        },
     779                    ),
     780                ),
     781            )
     782        );
     783
     784        $valid = $this->request->has_valid_params();
     785        $this->assertWPError( $valid );
     786
     787        $data = $valid->get_error_data();
     788        $this->assertArrayHasKey( 'details', $data );
     789        $this->assertArrayHasKey( 'failparam', $data['details'] );
     790        $this->assertEquals(
     791            array(
     792                'code'    => 'invalid',
     793                'message' => 'Invalid.',
     794                'data'    => 'mydata',
     795            ),
     796            $data['details']['failparam']
     797        );
    653798    }
    654799
Note: See TracChangeset for help on using the changeset viewer.