mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-16 23:48:16 +08:00

removed test param 'appClass' as it does not make sense to configure application class for all tests, some explicitly need webapp where some might explicitly need console app.
306 lines
9.8 KiB
PHP
306 lines
9.8 KiB
PHP
<?php
|
|
namespace yiiunit\framework\web;
|
|
|
|
use yii\web\Request;
|
|
use yii\web\UrlManager;
|
|
use yiiunit\TestCase;
|
|
|
|
class UrlManagerTest extends TestCase
|
|
{
|
|
public function testCreateUrl()
|
|
{
|
|
// default setting with '/' as base url
|
|
$manager = new UrlManager(array(
|
|
'baseUrl' => '/',
|
|
'cache' => null,
|
|
));
|
|
$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/',
|
|
'cache' => null,
|
|
));
|
|
$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' => '/',
|
|
'cache' => null,
|
|
));
|
|
$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/',
|
|
'cache' => null,
|
|
));
|
|
$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',
|
|
'cache' => null,
|
|
));
|
|
$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,
|
|
'cache' => null,
|
|
'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,
|
|
'cache' => null,
|
|
'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);
|
|
|
|
// pretty URL with rules that have host info
|
|
$manager = new UrlManager(array(
|
|
'enablePrettyUrl' => true,
|
|
'cache' => null,
|
|
'rules' => array(
|
|
array(
|
|
'pattern' => 'post/<id>/<title>',
|
|
'route' => 'post/view',
|
|
'host' => 'http://<lang:en|fr>.example.com',
|
|
),
|
|
),
|
|
'baseUrl' => '/test',
|
|
));
|
|
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post', 'lang' => 'en'));
|
|
$this->assertEquals('http://en.example.com/test/post/1/sample+post', $url);
|
|
$url = $manager->createUrl('post/index', array('page' => 1));
|
|
$this->assertEquals('/test/post/index?page=1', $url);
|
|
}
|
|
|
|
public function testCreateAbsoluteUrl()
|
|
{
|
|
$manager = new UrlManager(array(
|
|
'baseUrl' => '/',
|
|
'hostInfo' => 'http://www.example.com',
|
|
'cache' => null,
|
|
));
|
|
$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(array(
|
|
'cache' => null,
|
|
));
|
|
$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,
|
|
'cache' => null,
|
|
));
|
|
// 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,
|
|
'cache' => null,
|
|
'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',
|
|
'cache' => null,
|
|
'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);
|
|
|
|
// strict parsing
|
|
$manager = new UrlManager(array(
|
|
'enablePrettyUrl' => true,
|
|
'enableStrictParsing' => true,
|
|
'suffix' => '.html',
|
|
'cache' => null,
|
|
'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);
|
|
// unmatching pathinfo
|
|
$request->pathInfo = 'site/index.html';
|
|
$result = $manager->parseRequest($request);
|
|
$this->assertFalse($result);
|
|
}
|
|
|
|
public function testParseRESTRequest()
|
|
{
|
|
$manager = new UrlManager(array(
|
|
'cache' => null,
|
|
));
|
|
$request = new Request;
|
|
|
|
// pretty URL rules
|
|
$manager = new UrlManager(array(
|
|
'enablePrettyUrl' => true,
|
|
'cache' => null,
|
|
'rules' => array(
|
|
'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(array('post/view', array('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(array('post/create', array('id' => '123', 'title' => 'this+is+sample')), $result);
|
|
$_SERVER['REQUEST_METHOD'] = 'POST';
|
|
$request->pathInfo = 'post/123/this+is+sample';
|
|
$result = $manager->parseRequest($request);
|
|
$this->assertEquals(array('post/create', array('id' => '123', 'title' => 'this+is+sample')), $result);
|
|
|
|
// no wrong matching
|
|
$_SERVER['REQUEST_METHOD'] = 'POST';
|
|
$request->pathInfo = 'POST/GET';
|
|
$result = $manager->parseRequest($request);
|
|
$this->assertEquals(array('post/get', array()), $result);
|
|
|
|
// createUrl should ignore REST rules
|
|
$this->mockApplication(array(
|
|
'components' => array(
|
|
'request' => array(
|
|
'hostInfo' => 'http://localhost/',
|
|
'baseUrl' => '/app'
|
|
)
|
|
)
|
|
), \yii\web\Application::className());
|
|
$this->assertEquals('/app/post/delete?id=123', $manager->createUrl('post/delete', array('id' => 123)));
|
|
$this->destroyApplication();
|
|
|
|
unset($_SERVER['REQUEST_METHOD']);
|
|
}
|
|
}
|