Make WordPress Core


Ignore:
Timestamp:
04/09/2020 07:28:58 PM (6 years ago)
Author:
kadamwhite
Message:

REST API: Handle parameter types consistently within set_param().

A request has multiple parameter types, including "query" and "json." Updating a parameter could previously modify a key's value in the wrong parameter type, leading to confusing and self-contradictory response objects.

Props mnelson4, TimothyBlynJacobs, vagios, jnylen0.
Fixes #40838.

File:
1 edited

Legend:

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

    r46586 r47559  
    651651                );
    652652        }
     653
     654        /**
     655         * @ticket 40838
     656         */
     657        public function test_set_param_updates_param_in_json_and_query() {
     658                $request = new WP_REST_Request();
     659                $request->add_header( 'content-type', 'application/json' );
     660                $request->set_method( 'POST' );
     661                $request->set_body(
     662                        wp_json_encode(
     663                                array(
     664                                        'param' => 'value_body',
     665                                )
     666                        )
     667                );
     668                $request->set_query_params(
     669                        array(
     670                                'param' => 'value_query',
     671                        )
     672                );
     673                $request->set_param( 'param', 'new_value' );
     674
     675                $this->assertEquals( 'new_value', $request->get_param( 'param' ) );
     676                $this->assertEquals( array(), $request->get_body_params() );
     677                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_json_params() );
     678                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_query_params() );
     679        }
     680
     681        /**
     682         * @ticket 40838
     683         */
     684        public function test_set_param_updates_param_if_already_exists_in_query() {
     685                $request = new WP_REST_Request();
     686                $request->add_header( 'content-type', 'application/json' );
     687                $request->set_method( 'POST' );
     688                $request->set_body(
     689                        wp_json_encode(
     690                                array(
     691                                        'param_body' => 'value_body',
     692                                )
     693                        )
     694                );
     695                $original_defaults = array(
     696                        'param_query' => 'default_query_value',
     697                        'param_body'  => 'default_body_value',
     698                );
     699                $request->set_default_params( $original_defaults );
     700                $request->set_query_params(
     701                        array(
     702                                'param_query' => 'value_query',
     703                        )
     704                );
     705                $request->set_param( 'param_query', 'new_value' );
     706
     707                $this->assertEquals( 'new_value', $request->get_param( 'param_query' ) );
     708                $this->assertEquals( array(), $request->get_body_params() );
     709                $this->assertEquals( array( 'param_body' => 'value_body' ), $request->get_json_params() );
     710                $this->assertEquals( array( 'param_query' => 'new_value' ), $request->get_query_params() );
     711                // Verify the default wasn't overwritten.
     712                $this->assertEquals( $original_defaults, $request->get_default_params() );
     713        }
     714
     715        /**
     716         * @ticket 40838
     717         */
     718        public function test_set_param_to_null_updates_param_in_json_and_query() {
     719                $request = new WP_REST_Request();
     720                $request->add_header( 'content-type', 'application/json' );
     721                $request->set_method( 'POST' );
     722                $request->set_body(
     723                        wp_json_encode(
     724                                array(
     725                                        'param' => 'value_body',
     726                                )
     727                        )
     728                );
     729                $request->set_query_params(
     730                        array(
     731                                'param' => 'value_query',
     732                        )
     733                );
     734                $request->set_param( 'param', null );
     735
     736                $this->assertEquals( null, $request->get_param( 'param' ) );
     737                $this->assertEquals( array(), $request->get_body_params() );
     738                $this->assertEquals( array( 'param' => null ), $request->get_json_params() );
     739                $this->assertEquals( array( 'param' => null ), $request->get_query_params() );
     740        }
     741
     742        /**
     743         * @ticket 40838
     744         */
     745        public function test_set_param_from_null_updates_param_in_json_and_query_with_null() {
     746                $request = new WP_REST_Request();
     747                $request->add_header( 'content-type', 'application/json' );
     748                $request->set_method( 'POST' );
     749                $request->set_body(
     750                        wp_json_encode(
     751                                array(
     752                                        'param' => null,
     753                                )
     754                        )
     755                );
     756                $request->set_query_params(
     757                        array(
     758                                'param' => null,
     759                        )
     760                );
     761                $request->set_param( 'param', 'new_value' );
     762
     763                $this->assertEquals( 'new_value', $request->get_param( 'param' ) );
     764                $this->assertEquals( array(), $request->get_body_params() );
     765                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_json_params() );
     766                $this->assertEquals( array( 'param' => 'new_value' ), $request->get_query_params() );
     767        }
    653768}
Note: See TracChangeset for help on using the changeset viewer.