| | 328 | /** |
| | 329 | * Test that encoded URLs work when adding as an array of key=>value |
| | 330 | * @ticket 17923 |
| | 331 | */ |
| | 332 | public function test_add_query_arg_with_encoding() { |
| | 333 | $old_req_uri = $_SERVER['REQUEST_URI']; |
| | 334 | |
| | 335 | $qs_urls = array( |
| | 336 | '/?baz', |
| | 337 | '/2012/07/30/?baz', |
| | 338 | 'edit.php?baz', |
| | 339 | admin_url( 'edit.php?baz' ), |
| | 340 | admin_url( 'edit.php?baz', 'https' ), |
| | 341 | admin_url( 'edit.php?baz&za=1' ), |
| | 342 | admin_url( 'edit.php?baz=1&za=1' ), |
| | 343 | admin_url( 'edit.php?baz=0&za=0' ), |
| | 344 | ); |
| | 345 | $args = array( |
| | 346 | 'p' => '456', |
| | 347 | 'q' => 'abc', |
| | 348 | 'r' => '&s', |
| | 349 | 't' => 'u&v', |
| | 350 | 'w' => '@' |
| | 351 | ); |
| | 352 | $args_str = 'p=456&q=abc&r&s&t=u&v&w=@'; |
| | 353 | $encoded_args_str = 'p=456&q=abc&r=%26s&t=u%26v&w=%40'; |
| | 354 | foreach ( $qs_urls as $url ) { |
| | 355 | $_SERVER['REQUEST_URI'] = $url; |
| | 356 | $this->assertEquals( "$url&$args_str", add_query_arg( $args ) ); |
| | 357 | $this->assertEquals( "$url&$args_str", add_query_arg( $args, $url ) ); |
| | 358 | $this->assertEquals( "$url&$args_str", add_query_arg( $args, $url ) ); |
| | 359 | $this->assertEquals( "$url&$encoded_args_str", add_query_arg( $args, false, false, true ) ); |
| | 360 | $this->assertEquals( "$url&$encoded_args_str", add_query_arg( $args, $url, false, true ) ); |
| | 361 | } |
| | 362 | |
| | 363 | // Test that encoded URLs work when adding one-by-one |
| | 364 | $url = '/wordpress/2011/12/08/sample-post'; |
| | 365 | foreach ( $args as $_k => $_v ) |
| | 366 | $url = add_query_arg( $_k, $_v, $url, true ); |
| | 367 | $this->assertEquals( '/wordpress/2011/12/08/sample-post?p=456&q=abc&r=%26s&t=u%26v&w=%40', $url ); |
| | 368 | |
| | 369 | // Encoded URLs work (e.g. output matches rawurlencode) |
| | 370 | $url = '/wordpress/'; |
| | 371 | $args = '!@#$%^&*()_+=-[]{}\|";:\',.<>/?`~'; |
| | 372 | $this->assertEquals( $url . '?args=' . $args, add_query_arg('args', $args, $url) ); |
| | 373 | $this->assertEquals( $url . '?args=' . rawurlencode($args), add_query_arg('args', $args, $url, true) ); |
| | 374 | |
| | 380 | // Arg from the end |
| | 381 | $url = '/wordpress/?p=123'; |
| | 382 | $this->assertEquals( '/wordpress/', remove_query_arg('p', $url) ); |
| | 383 | |
| | 384 | // Arg from the middle |
| | 385 | $url = '/wordpress/?p=123&q=456&r&s'; |
| | 386 | $this->assertEquals( '/wordpress/?p=123&q=456&s', remove_query_arg('r', $url) ); |
| | 387 | |
| | 388 | // Multiple calls |
| | 389 | $url = '/wordpress/?p=123&q=456&r&s'; |
| | 390 | $url = remove_query_arg('s', $url); |
| | 391 | $url = remove_query_arg('r', $url); |
| | 392 | $url = remove_query_arg('q', $url); |
| | 393 | $url = remove_query_arg('p', $url); |
| | 394 | $this->assertEquals( '/wordpress/', $url ); |
| | 395 | |
| | 396 | // Trailing ampersand |
| | 397 | $url = '/wordpress/?p=123&'; |
| | 398 | $this->assertEquals( '/wordpress/', remove_query_arg('p', $url) ); |
| | 399 | |
| | 400 | // From REQUEST_URI |
| | 401 | $old_request_uri = $_SERVER['REQUEST_URI']; |
| | 402 | $_SERVER['REQUEST_URI'] = '/wordpress/?p=123&q=456&r&s'; |
| | 403 | $url = remove_query_arg('s'); |
| | 404 | $url = remove_query_arg('r', $url); |
| | 405 | $url = remove_query_arg('q', $url); |
| | 406 | $url = remove_query_arg('p', $url); |
| | 407 | $this->assertEquals( '/wordpress/', $url ); |
| | 408 | $_SERVER['REQUEST_URI'] = $old_request_uri; |
| | 409 | } |
| | 410 | |