You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
9.4 KiB
310 lines
9.4 KiB
<?php |
|
namespace yiiunit\framework\web; |
|
|
|
use yii\web\Request; |
|
use yii\web\UrlManager; |
|
use yiiunit\TestCase; |
|
|
|
/** |
|
* @group web |
|
*/ |
|
class UrlManagerTest extends TestCase |
|
{ |
|
protected function setUp() |
|
{ |
|
parent::setUp(); |
|
$this->mockApplication(); |
|
} |
|
|
|
public function testCreateUrl() |
|
{ |
|
// default setting with '/' as base url |
|
$manager = new UrlManager([ |
|
'baseUrl' => '/', |
|
'cache' => null, |
|
]); |
|
$url = $manager->createUrl('post/view'); |
|
$this->assertEquals('?r=post/view', $url); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('?r=post/view&id=1&title=sample+post', $url); |
|
|
|
// default setting with '/test/' as base url |
|
$manager = new UrlManager([ |
|
'baseUrl' => '/test/', |
|
'cache' => null, |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('/test?r=post/view&id=1&title=sample+post', $url); |
|
|
|
// pretty URL without rules |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'baseUrl' => '/', |
|
'cache' => null, |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('/post/view?id=1&title=sample+post', $url); |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'baseUrl' => '/test/', |
|
'cache' => null, |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('/test/post/view?id=1&title=sample+post', $url); |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'baseUrl' => '/test/index.php', |
|
'cache' => null, |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('/test/index.php/post/view?id=1&title=sample+post', $url); |
|
|
|
// todo: test showScriptName |
|
|
|
// pretty URL with rules |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'cache' => null, |
|
'rules' => [ |
|
[ |
|
'pattern' => 'post/<id>/<title>', |
|
'route' => 'post/view', |
|
], |
|
], |
|
'baseUrl' => '/', |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('/post/1/sample+post', $url); |
|
$url = $manager->createUrl('post/index', ['page' => 1]); |
|
$this->assertEquals('/post/index?page=1', $url); |
|
|
|
// pretty URL with rules and suffix |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'cache' => null, |
|
'rules' => [ |
|
[ |
|
'pattern' => 'post/<id>/<title>', |
|
'route' => 'post/view', |
|
], |
|
], |
|
'baseUrl' => '/', |
|
'suffix' => '.html', |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('/post/1/sample+post.html', $url); |
|
$url = $manager->createUrl('post/index', ['page' => 1]); |
|
$this->assertEquals('/post/index.html?page=1', $url); |
|
|
|
// pretty URL with rules that have host info |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'cache' => null, |
|
'rules' => [ |
|
[ |
|
'pattern' => 'post/<id>/<title>', |
|
'route' => 'post/view', |
|
'host' => 'http://<lang:en|fr>.example.com', |
|
], |
|
], |
|
'baseUrl' => '/test', |
|
]); |
|
$url = $manager->createUrl('post/view', ['id' => 1, 'title' => 'sample post', 'lang' => 'en']); |
|
$this->assertEquals('http://en.example.com/test/post/1/sample+post', $url); |
|
$url = $manager->createUrl('post/index', ['page' => 1]); |
|
$this->assertEquals('/test/post/index?page=1', $url); |
|
} |
|
|
|
public function testCreateAbsoluteUrl() |
|
{ |
|
$manager = new UrlManager([ |
|
'baseUrl' => '/', |
|
'hostInfo' => 'http://www.example.com', |
|
'cache' => null, |
|
]); |
|
$url = $manager->createAbsoluteUrl('post/view', ['id' => 1, 'title' => 'sample post']); |
|
$this->assertEquals('http://www.example.com?r=post/view&id=1&title=sample+post', $url); |
|
} |
|
|
|
public function testParseRequest() |
|
{ |
|
$manager = new UrlManager(['cache' => null]); |
|
$request = new Request; |
|
|
|
// default setting without 'r' param |
|
unset($_GET['r']); |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['', []], $result); |
|
|
|
// default setting with 'r' param |
|
$_GET['r'] = 'site/index'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['site/index', []], $result); |
|
|
|
// default setting with 'r' param as an array |
|
$_GET['r'] = ['site/index']; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['', []], $result); |
|
|
|
// pretty URL without rules |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'cache' => null, |
|
]); |
|
// empty pathinfo |
|
$request->pathInfo = ''; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['', []], $result); |
|
// normal pathinfo |
|
$request->pathInfo = 'site/index'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['site/index', []], $result); |
|
// pathinfo with module |
|
$request->pathInfo = 'module/site/index'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['module/site/index', []], $result); |
|
// pathinfo with trailing slashes |
|
$request->pathInfo = '/module/site/index/'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['module/site/index/', []], $result); |
|
|
|
// pretty URL rules |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'cache' => null, |
|
'rules' => [ |
|
[ |
|
'pattern' => 'post/<id>/<title>', |
|
'route' => 'post/view', |
|
], |
|
], |
|
]); |
|
// matching pathinfo |
|
$request->pathInfo = 'post/123/this+is+sample'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/view', ['id' => '123', 'title' => 'this+is+sample']], $result); |
|
// trailing slash is significant |
|
$request->pathInfo = 'post/123/this+is+sample/'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/123/this+is+sample/', []], $result); |
|
// empty pathinfo |
|
$request->pathInfo = ''; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['', []], $result); |
|
// normal pathinfo |
|
$request->pathInfo = 'site/index'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['site/index', []], $result); |
|
// pathinfo with module |
|
$request->pathInfo = 'module/site/index'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['module/site/index', []], $result); |
|
|
|
// pretty URL rules |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'suffix' => '.html', |
|
'cache' => null, |
|
'rules' => [ |
|
[ |
|
'pattern' => 'post/<id>/<title>', |
|
'route' => 'post/view', |
|
], |
|
], |
|
]); |
|
// matching pathinfo |
|
$request->pathInfo = 'post/123/this+is+sample.html'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/view', ['id' => '123', 'title' => 'this+is+sample']], $result); |
|
// matching pathinfo without suffix |
|
$request->pathInfo = 'post/123/this+is+sample'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertFalse($result); |
|
// empty pathinfo |
|
$request->pathInfo = ''; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['', []], $result); |
|
// normal pathinfo |
|
$request->pathInfo = 'site/index.html'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['site/index', []], $result); |
|
// pathinfo without suffix |
|
$request->pathInfo = 'site/index'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertFalse($result); |
|
|
|
// strict parsing |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'enableStrictParsing' => true, |
|
'suffix' => '.html', |
|
'cache' => null, |
|
'rules' => [ |
|
[ |
|
'pattern' => 'post/<id>/<title>', |
|
'route' => 'post/view', |
|
], |
|
], |
|
]); |
|
// matching pathinfo |
|
$request->pathInfo = 'post/123/this+is+sample.html'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/view', ['id' => '123', 'title' => 'this+is+sample']], $result); |
|
// unmatching pathinfo |
|
$request->pathInfo = 'site/index.html'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertFalse($result); |
|
} |
|
|
|
public function testParseRESTRequest() |
|
{ |
|
$request = new Request; |
|
|
|
// pretty URL rules |
|
$manager = new UrlManager([ |
|
'enablePrettyUrl' => true, |
|
'showScriptName' => false, |
|
'cache' => null, |
|
'rules' => [ |
|
'PUT,POST post/<id>/<title>' => 'post/create', |
|
'DELETE post/<id>' => 'post/delete', |
|
'post/<id>/<title>' => 'post/view', |
|
'POST/GET' => 'post/get', |
|
], |
|
]); |
|
// matching pathinfo GET request |
|
$_SERVER['REQUEST_METHOD'] = 'GET'; |
|
$request->pathInfo = 'post/123/this+is+sample'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/view', ['id' => '123', 'title' => 'this+is+sample']], $result); |
|
// matching pathinfo PUT/POST request |
|
$_SERVER['REQUEST_METHOD'] = 'PUT'; |
|
$request->pathInfo = 'post/123/this+is+sample'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/create', ['id' => '123', 'title' => 'this+is+sample']], $result); |
|
$_SERVER['REQUEST_METHOD'] = 'POST'; |
|
$request->pathInfo = 'post/123/this+is+sample'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/create', ['id' => '123', 'title' => 'this+is+sample']], $result); |
|
|
|
// no wrong matching |
|
$_SERVER['REQUEST_METHOD'] = 'POST'; |
|
$request->pathInfo = 'POST/GET'; |
|
$result = $manager->parseRequest($request); |
|
$this->assertEquals(['post/get', []], $result); |
|
|
|
// createUrl should ignore REST rules |
|
$this->mockApplication([ |
|
'components' => [ |
|
'request' => [ |
|
'hostInfo' => 'http://localhost/', |
|
'baseUrl' => '/app' |
|
] |
|
] |
|
], \yii\web\Application::className()); |
|
$this->assertEquals('/app/post/delete?id=123', $manager->createUrl('post/delete', ['id' => 123])); |
|
$this->destroyApplication(); |
|
|
|
unset($_SERVER['REQUEST_METHOD']); |
|
} |
|
}
|
|
|