mirror of
https://github.com/yiisoft/yii2.git
synced 2026-03-04 22:44:53 +01:00
* php-cs-fixer: PSR2 rule. * php-cs-fixer: PSR2 rule - fix views. * Travis setup refactoring. * Add php-cs-fixer to travis cs tests. * Fix tests on hhvm-3.12 * improve travis config * composer update * revert composer update * improve travis config * Fix CS. * Extract config to separate classes. * Extract config to separate classes. * Add file header. * Force short array syntax. * binary_operator_spaces fixer * Fix broken tests * cast_spaces fixer * concat_space fixer * dir_constant fixer * ereg_to_preg fixer * function_typehint_space fixer * hash_to_slash_comment fixer * is_null fixer * linebreak_after_opening_tag fixer * lowercase_cast fixer * magic_constant_casing fixer * modernize_types_casting fixer * native_function_casing fixer * new_with_braces fixer * no_alias_functions fixer * no_blank_lines_after_class_opening fixer * no_blank_lines_after_phpdoc fixer * no_empty_comment fixer * no_empty_phpdoc fixer * no_empty_statement fixer * no_extra_consecutive_blank_lines fixer * no_leading_import_slash fixer * no_leading_namespace_whitespace fixer * no_mixed_echo_print fixer * no_multiline_whitespace_around_double_arrow fixer * no_multiline_whitespace_before_semicolons fixer * no_php4_constructor fixer * no_short_bool_cast fixer * no_singleline_whitespace_before_semicolons fixer * no_spaces_around_offset fixer * no_trailing_comma_in_list_call fixer * no_trailing_comma_in_singleline_array fixer * no_unneeded_control_parentheses fixer * no_unused_imports fixer * no_useless_return fixer * no_whitespace_before_comma_in_array fixer * no_whitespace_in_blank_line fixer * not_operator_with_successor_space fixer * object_operator_without_whitespace fixer * ordered_imports fixer * php_unit_construct fixer * php_unit_dedicate_assert fixer * php_unit_fqcn_annotation fixer * phpdoc_indent fixer * phpdoc_no_access fixer * phpdoc_no_empty_return fixer * phpdoc_no_package fixer * phpdoc_no_useless_inheritdoc fixer * Fix broken tests * phpdoc_return_self_reference fixer * phpdoc_single_line_var_spacing fixer * phpdoc_single_line_var_spacing fixer * phpdoc_to_comment fixer * phpdoc_trim fixer * phpdoc_var_without_name fixer * psr4 fixer * self_accessor fixer * short_scalar_cast fixer * single_blank_line_before_namespace fixer * single_quote fixer * standardize_not_equals fixer * ternary_operator_spaces fixer * trailing_comma_in_multiline_array fixer * trim_array_spaces fixer * protected_to_private fixer * unary_operator_spaces fixer * whitespace_after_comma_in_array fixer * `parent::setRules()` -> `$this->setRules()` * blank_line_after_opening_tag fixer * Update finder config. * Revert changes for YiiRequirementChecker. * Fix array formatting. * Add missing import. * Fix CS for new code merged from master. * Fix some indentation issues.
296 lines
9.8 KiB
PHP
296 lines
9.8 KiB
PHP
<?php
|
|
/**
|
|
* @link http://www.yiiframework.com/
|
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
|
* @license http://www.yiiframework.com/license/
|
|
*/
|
|
|
|
namespace yiiunit\framework\web;
|
|
|
|
use yii\web\Request;
|
|
use yiiunit\TestCase;
|
|
|
|
/**
|
|
* @group web
|
|
*/
|
|
class RequestTest extends TestCase
|
|
{
|
|
public function testParseAcceptHeader()
|
|
{
|
|
$request = new Request();
|
|
|
|
$this->assertEquals([], $request->parseAcceptHeader(' '));
|
|
|
|
$this->assertEquals([
|
|
'audio/basic' => ['q' => 1],
|
|
'audio/*' => ['q' => 0.2],
|
|
], $request->parseAcceptHeader('audio/*; q=0.2, audio/basic'));
|
|
|
|
$this->assertEquals([
|
|
'application/json' => ['q' => 1, 'version' => '1.0'],
|
|
'application/xml' => ['q' => 1, 'version' => '2.0', 'x'],
|
|
'text/x-c' => ['q' => 1],
|
|
'text/x-dvi' => ['q' => 0.8],
|
|
'text/plain' => ['q' => 0.5],
|
|
], $request->parseAcceptHeader('text/plain; q=0.5,
|
|
application/json; version=1.0,
|
|
application/xml; version=2.0; x,
|
|
text/x-dvi; q=0.8, text/x-c'));
|
|
}
|
|
|
|
public function testPrefferedLanguage()
|
|
{
|
|
$this->mockApplication([
|
|
'language' => 'en',
|
|
]);
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = [];
|
|
$this->assertEquals('en', $request->getPreferredLanguage());
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['de'];
|
|
$this->assertEquals('en', $request->getPreferredLanguage());
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['en-us', 'de', 'ru-RU'];
|
|
$this->assertEquals('en', $request->getPreferredLanguage(['en']));
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['en-us', 'de', 'ru-RU'];
|
|
$this->assertEquals('de', $request->getPreferredLanguage(['ru', 'de']));
|
|
$this->assertEquals('de-DE', $request->getPreferredLanguage(['ru', 'de-DE']));
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['en-us', 'de', 'ru-RU'];
|
|
$this->assertEquals('de', $request->getPreferredLanguage(['de', 'ru']));
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['en-us', 'de', 'ru-RU'];
|
|
$this->assertEquals('ru-ru', $request->getPreferredLanguage(['ru-ru']));
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['en-us', 'de'];
|
|
$this->assertEquals('ru-ru', $request->getPreferredLanguage(['ru-ru', 'pl']));
|
|
$this->assertEquals('ru-RU', $request->getPreferredLanguage(['ru-RU', 'pl']));
|
|
|
|
$request = new Request();
|
|
$request->acceptableLanguages = ['en-us', 'de'];
|
|
$this->assertEquals('pl', $request->getPreferredLanguage(['pl', 'ru-ru']));
|
|
}
|
|
|
|
public function testCsrfTokenValidation()
|
|
{
|
|
$this->mockWebApplication();
|
|
|
|
$request = new Request();
|
|
$request->enableCsrfCookie = false;
|
|
|
|
$token = $request->getCsrfToken();
|
|
|
|
// accept any value if CSRF validation is disabled
|
|
$request->enableCsrfValidation = false;
|
|
$this->assertTrue($request->validateCsrfToken($token));
|
|
$this->assertTrue($request->validateCsrfToken($token . 'a'));
|
|
$this->assertTrue($request->validateCsrfToken([]));
|
|
$this->assertTrue($request->validateCsrfToken([$token]));
|
|
$this->assertTrue($request->validateCsrfToken(0));
|
|
$this->assertTrue($request->validateCsrfToken(null));
|
|
|
|
// enable validation
|
|
$request->enableCsrfValidation = true;
|
|
|
|
// accept any value on GET request
|
|
foreach (['GET', 'HEAD', 'OPTIONS'] as $method) {
|
|
$_POST[$request->methodParam] = $method;
|
|
$this->assertTrue($request->validateCsrfToken($token));
|
|
$this->assertTrue($request->validateCsrfToken($token . 'a'));
|
|
$this->assertTrue($request->validateCsrfToken([]));
|
|
$this->assertTrue($request->validateCsrfToken([$token]));
|
|
$this->assertTrue($request->validateCsrfToken(0));
|
|
$this->assertTrue($request->validateCsrfToken(null));
|
|
}
|
|
|
|
// only accept valid token on POST
|
|
foreach (['POST', 'PUT', 'DELETE'] as $method) {
|
|
$_POST[$request->methodParam] = $method;
|
|
$this->assertTrue($request->validateCsrfToken($token));
|
|
$this->assertFalse($request->validateCsrfToken($token . 'a'));
|
|
$this->assertFalse($request->validateCsrfToken([]));
|
|
$this->assertFalse($request->validateCsrfToken([$token]));
|
|
$this->assertFalse($request->validateCsrfToken(0));
|
|
$this->assertFalse($request->validateCsrfToken(null));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* test CSRF token validation by POST param
|
|
*/
|
|
public function testCsrfTokenPost()
|
|
{
|
|
$this->mockWebApplication();
|
|
|
|
$request = new Request();
|
|
$request->enableCsrfCookie = false;
|
|
|
|
$token = $request->getCsrfToken();
|
|
|
|
// accept no value on GET request
|
|
foreach (['GET', 'HEAD', 'OPTIONS'] as $method) {
|
|
$_POST[$request->methodParam] = $method;
|
|
$this->assertTrue($request->validateCsrfToken());
|
|
}
|
|
|
|
// only accept valid token on POST
|
|
foreach (['POST', 'PUT', 'DELETE'] as $method) {
|
|
$_POST[$request->methodParam] = $method;
|
|
$request->setBodyParams([]);
|
|
$this->assertFalse($request->validateCsrfToken());
|
|
$request->setBodyParams([$request->csrfParam => $token]);
|
|
$this->assertTrue($request->validateCsrfToken());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* test CSRF token validation by POST param
|
|
*/
|
|
public function testCsrfTokenHeader()
|
|
{
|
|
$this->mockWebApplication();
|
|
|
|
$request = new Request();
|
|
$request->enableCsrfCookie = false;
|
|
|
|
$token = $request->getCsrfToken();
|
|
|
|
// accept no value on GET request
|
|
foreach (['GET', 'HEAD', 'OPTIONS'] as $method) {
|
|
$_POST[$request->methodParam] = $method;
|
|
$this->assertTrue($request->validateCsrfToken());
|
|
}
|
|
|
|
// only accept valid token on POST
|
|
foreach (['POST', 'PUT', 'DELETE'] as $method) {
|
|
$_POST[$request->methodParam] = $method;
|
|
$request->setBodyParams([]);
|
|
$request->headers->remove(Request::CSRF_HEADER);
|
|
$this->assertFalse($request->validateCsrfToken());
|
|
$request->headers->add(Request::CSRF_HEADER, $token);
|
|
$this->assertTrue($request->validateCsrfToken());
|
|
}
|
|
}
|
|
|
|
public function testResolve()
|
|
{
|
|
$this->mockWebApplication([
|
|
'components' => [
|
|
'urlManager' => [
|
|
'enablePrettyUrl' => true,
|
|
'showScriptName' => false,
|
|
'cache' => null,
|
|
'rules' => [
|
|
'posts' => 'post/list',
|
|
'post/<id>' => 'post/view',
|
|
],
|
|
],
|
|
],
|
|
]);
|
|
|
|
$request = new Request();
|
|
$request->pathInfo = 'posts';
|
|
|
|
$_GET['page'] = 1;
|
|
$result = $request->resolve();
|
|
$this->assertEquals(['post/list', ['page' => 1]], $result);
|
|
$this->assertEquals($_GET, ['page' => 1]);
|
|
|
|
$request->setQueryParams(['page' => 5]);
|
|
$result = $request->resolve();
|
|
$this->assertEquals(['post/list', ['page' => 5]], $result);
|
|
$this->assertEquals($_GET, ['page' => 1]);
|
|
|
|
$request->setQueryParams(['custom-page' => 5]);
|
|
$result = $request->resolve();
|
|
$this->assertEquals(['post/list', ['custom-page' => 5]], $result);
|
|
$this->assertEquals($_GET, ['page' => 1]);
|
|
|
|
unset($_GET['page']);
|
|
|
|
$request = new Request();
|
|
$request->pathInfo = 'post/21';
|
|
|
|
$this->assertEquals($_GET, []);
|
|
$result = $request->resolve();
|
|
$this->assertEquals(['post/view', ['id' => 21]], $result);
|
|
$this->assertEquals($_GET, ['id' => 21]);
|
|
|
|
$_GET['id'] = 42;
|
|
$result = $request->resolve();
|
|
$this->assertEquals(['post/view', ['id' => 21]], $result);
|
|
$this->assertEquals($_GET, ['id' => 21]);
|
|
|
|
$_GET['id'] = 63;
|
|
$request->setQueryParams(['token' => 'secret']);
|
|
$result = $request->resolve();
|
|
$this->assertEquals(['post/view', ['id' => 21, 'token' => 'secret']], $result);
|
|
$this->assertEquals($_GET, ['id' => 63]);
|
|
}
|
|
|
|
public function testGetHostInfo()
|
|
{
|
|
$request = new Request();
|
|
|
|
unset($_SERVER['SERVER_NAME'], $_SERVER['HTTP_HOST']);
|
|
$this->assertNull($request->getHostInfo());
|
|
$this->assertNull($request->getHostName());
|
|
|
|
$request->setHostInfo('http://servername.com:80');
|
|
$this->assertSame('http://servername.com:80', $request->getHostInfo());
|
|
$this->assertSame('servername.com', $request->getHostName());
|
|
}
|
|
|
|
/**
|
|
* @expectedException \yii\base\InvalidConfigException
|
|
*/
|
|
public function testGetScriptFileWithEmptyServer()
|
|
{
|
|
$request = new Request();
|
|
$_SERVER = [];
|
|
|
|
$request->getScriptFile();
|
|
}
|
|
|
|
/**
|
|
* @expectedException \yii\base\InvalidConfigException
|
|
*/
|
|
public function testGetScriptUrlWithEmptyServer()
|
|
{
|
|
$request = new Request();
|
|
$_SERVER = [];
|
|
|
|
$request->getScriptUrl();
|
|
}
|
|
|
|
public function testGetServerName()
|
|
{
|
|
$request = new Request();
|
|
|
|
$_SERVER['SERVER_NAME'] = 'servername';
|
|
$this->assertEquals('servername', $request->getServerName());
|
|
|
|
unset($_SERVER['SERVER_NAME']);
|
|
$this->assertEquals(null, $request->getServerName());
|
|
}
|
|
|
|
public function testGetServerPort()
|
|
{
|
|
$request = new Request();
|
|
|
|
$_SERVER['SERVER_PORT'] = 33;
|
|
$this->assertEquals(33, $request->getServerPort());
|
|
|
|
unset($_SERVER['SERVER_PORT']);
|
|
$this->assertEquals(null, $request->getServerPort());
|
|
}
|
|
}
|