|  |  |  | <?php
 | 
					
						
							|  |  |  | namespace yiiunit\framework\web;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use yii\web\Request;
 | 
					
						
							|  |  |  | use yii\web\UrlManager;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UrlManagerTest extends \yiiunit\TestCase
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  | 	public function testCreateUrl()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		// default setting with '/' as base url
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'baseUrl' => '/',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view');
 | 
					
						
							|  |  |  | 		$this->assertEquals('/?r=post/view', $url);
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('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(array(
 | 
					
						
							|  |  |  | 			'baseUrl' => '/test/',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post'));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/test/?r=post/view&id=1&title=sample+post', $url);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// pretty URL without rules
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'baseUrl' => '/',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post'));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/post/view?id=1&title=sample+post', $url);
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'baseUrl' => '/test/',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post'));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/test/post/view?id=1&title=sample+post', $url);
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'baseUrl' => '/test/index.php',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('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(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'cacheID' => false,
 | 
					
						
							|  |  |  | 			'rules' => array(
 | 
					
						
							|  |  |  | 				array(
 | 
					
						
							|  |  |  | 					'pattern' => 'post/<id>/<title>',
 | 
					
						
							|  |  |  | 					'route' => 'post/view',
 | 
					
						
							|  |  |  | 				),
 | 
					
						
							|  |  |  | 			),
 | 
					
						
							|  |  |  | 			'baseUrl' => '/',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post'));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/post/1/sample+post', $url);
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/index', array('page' => 1));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/post/index?page=1', $url);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// pretty URL with rules and suffix
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'cacheID' => false,
 | 
					
						
							|  |  |  | 			'rules' => array(
 | 
					
						
							|  |  |  | 				array(
 | 
					
						
							|  |  |  | 					'pattern' => 'post/<id>/<title>',
 | 
					
						
							|  |  |  | 					'route' => 'post/view',
 | 
					
						
							|  |  |  | 				),
 | 
					
						
							|  |  |  | 			),
 | 
					
						
							|  |  |  | 			'baseUrl' => '/',
 | 
					
						
							|  |  |  | 			'suffix' => '.html',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post'));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/post/1/sample+post.html', $url);
 | 
					
						
							|  |  |  | 		$url = $manager->createUrl('post/index', array('page' => 1));
 | 
					
						
							|  |  |  | 		$this->assertEquals('/post/index.html?page=1', $url);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function testCreateAbsoluteUrl()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'baseUrl' => '/',
 | 
					
						
							|  |  |  | 			'hostInfo' => 'http://www.example.com',
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		$url = $manager->createAbsoluteUrl('post/view', array('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;
 | 
					
						
							|  |  |  | 		$request = new Request;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// default setting without 'r' param
 | 
					
						
							|  |  |  | 		unset($_GET['r']);
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('', array()), $result);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// default setting with 'r' param
 | 
					
						
							|  |  |  | 		$_GET['r'] = 'site/index';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('site/index', array()), $result);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// default setting with 'r' param as an array
 | 
					
						
							|  |  |  | 		$_GET['r'] = array('site/index');
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('', array()), $result);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// pretty URL without rules
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		// empty pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = '';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('', array()), $result);
 | 
					
						
							|  |  |  | 		// normal pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'site/index';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('site/index', array()), $result);
 | 
					
						
							|  |  |  | 		// pathinfo with module
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'module/site/index';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('module/site/index', array()), $result);
 | 
					
						
							|  |  |  | 		// pathinfo with trailing slashes
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'module/site/index/';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('module/site/index', array()), $result);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// pretty URL rules
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'cacheID' => false,
 | 
					
						
							|  |  |  | 			'rules' => array(
 | 
					
						
							|  |  |  | 				array(
 | 
					
						
							|  |  |  | 					'pattern' => 'post/<id>/<title>',
 | 
					
						
							|  |  |  | 					'route' => 'post/view',
 | 
					
						
							|  |  |  | 				),
 | 
					
						
							|  |  |  | 			),
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		// matching pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'post/123/this+is+sample';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('post/view', array('id' => '123', 'title' => 'this+is+sample')), $result);
 | 
					
						
							|  |  |  | 		// matching pathinfo with trailing slashes
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'post/123/this+is+sample/';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('post/view', array('id' => '123', 'title' => 'this+is+sample')), $result);
 | 
					
						
							|  |  |  | 		// empty pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = '';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('', array()), $result);
 | 
					
						
							|  |  |  | 		// normal pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'site/index';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('site/index', array()), $result);
 | 
					
						
							|  |  |  | 		// pathinfo with module
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'module/site/index';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('module/site/index', array()), $result);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// pretty URL rules
 | 
					
						
							|  |  |  | 		$manager = new UrlManager(array(
 | 
					
						
							|  |  |  | 			'enablePrettyUrl' => true,
 | 
					
						
							|  |  |  | 			'suffix' => '.html',
 | 
					
						
							|  |  |  | 			'cacheID' => false,
 | 
					
						
							|  |  |  | 			'rules' => array(
 | 
					
						
							|  |  |  | 				array(
 | 
					
						
							|  |  |  | 					'pattern' => 'post/<id>/<title>',
 | 
					
						
							|  |  |  | 					'route' => 'post/view',
 | 
					
						
							|  |  |  | 				),
 | 
					
						
							|  |  |  | 			),
 | 
					
						
							|  |  |  | 		));
 | 
					
						
							|  |  |  | 		// matching pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'post/123/this+is+sample.html';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('post/view', array('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(array('', array()), $result);
 | 
					
						
							|  |  |  | 		// normal pathinfo
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'site/index.html';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertEquals(array('site/index', array()), $result);
 | 
					
						
							|  |  |  | 		// pathinfo without suffix
 | 
					
						
							|  |  |  | 		$request->pathInfo = 'site/index';
 | 
					
						
							|  |  |  | 		$result = $manager->parseRequest($request);
 | 
					
						
							|  |  |  | 		$this->assertFalse($result);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |