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.
165 lines
7.7 KiB
165 lines
7.7 KiB
<?php |
|
namespace yiiunit\framework\helpers; |
|
|
|
use yii\base\Action; |
|
use yii\base\Module; |
|
use yii\helpers\Url; |
|
use yii\web\Controller; |
|
use yiiunit\TestCase; |
|
|
|
/** |
|
* UrlTest |
|
*/ |
|
class UrlTest extends TestCase |
|
{ |
|
protected function setUp() |
|
{ |
|
parent::setUp(); |
|
$this->mockApplication([ |
|
'components' => [ |
|
'request' => [ |
|
'class' => 'yii\web\Request', |
|
'scriptUrl' => '/base/index.php', |
|
'hostInfo' => 'http://example.com/', |
|
'url' => '/base/index.php&r=site/current&id=42' |
|
], |
|
], |
|
], '\yii\web\Application'); |
|
} |
|
|
|
/** |
|
* Mocks controller action with parameters |
|
* |
|
* @param string $controllerId |
|
* @param string $actionId |
|
* @param string $moduleID |
|
* @param array $params |
|
*/ |
|
protected function mockAction($controllerId, $actionId, $moduleID = null, $params = []) |
|
{ |
|
\Yii::$app->controller = $controller = new Controller($controllerId, \Yii::$app); |
|
$controller->actionParams = $params; |
|
$controller->action = new Action($actionId, $controller); |
|
|
|
if ($moduleID !== null) { |
|
$controller->module = new Module($moduleID); |
|
} |
|
} |
|
|
|
protected function removeMockedAction() |
|
{ |
|
\Yii::$app->controller = null; |
|
} |
|
|
|
public function testToRoute() |
|
{ |
|
$this->mockAction('page', 'view', null, ['id' => 10]); |
|
|
|
// If the route is an empty string, the current route will be used; |
|
$this->assertEquals('/base/index.php?r=page/view', Url::toRoute('')); |
|
$this->assertEquals('http://example.com/base/index.php?r=page/view', Url::toRoute('', true)); |
|
$this->assertEquals('https://example.com/base/index.php?r=page/view', Url::toRoute('', 'https')); |
|
|
|
// If the route contains no slashes at all, it is considered to be an action ID of the current controller and |
|
// will be prepended with uniqueId; |
|
$this->assertEquals('/base/index.php?r=page/edit', Url::toRoute('edit')); |
|
$this->assertEquals('/base/index.php?r=page/edit&id=20', Url::toRoute(['edit', 'id' => 20])); |
|
$this->assertEquals('http://example.com/base/index.php?r=page/edit&id=20', Url::toRoute(['edit', 'id' => 20], true)); |
|
$this->assertEquals('https://example.com/base/index.php?r=page/edit&id=20', Url::toRoute(['edit', 'id' => 20], 'https')); |
|
|
|
// If the route has no leading slash, it is considered to be a route relative |
|
// to the current module and will be prepended with the module's uniqueId. |
|
$this->mockAction('default', 'index', 'stats'); |
|
$this->assertEquals('/base/index.php?r=stats/user/view', Url::toRoute('user/view')); |
|
$this->assertEquals('/base/index.php?r=stats/user/view&id=42', Url::toRoute(['user/view', 'id' => 42])); |
|
$this->assertEquals('http://example.com/base/index.php?r=stats/user/view&id=42', Url::toRoute(['user/view', 'id' => 42], true)); |
|
$this->assertEquals('https://example.com/base/index.php?r=stats/user/view&id=42', Url::toRoute(['user/view', 'id' => 42], 'https')); |
|
|
|
// In case there is no controller, an exception should be thrown for relative route |
|
$this->removeMockedAction(); |
|
|
|
$this->setExpectedException('yii\base\InvalidParamException'); |
|
Url::toRoute('site/view'); |
|
} |
|
|
|
public function testTo() |
|
{ |
|
// is an array: the first array element is considered a route, while the rest of the name-value |
|
// pairs are treated as the parameters to be used for URL creation using Url::toRoute. |
|
$this->mockAction('page', 'view', null, ['id' => 10]); |
|
$this->assertEquals('/base/index.php?r=page/edit&id=20', Url::to(['edit', 'id' => 20])); |
|
$this->assertEquals('/base/index.php?r=page/edit', Url::to(['edit'])); |
|
$this->assertEquals('/base/index.php?r=page/view', Url::to([''])); |
|
|
|
$this->assertEquals('http://example.com/base/index.php?r=page/edit&id=20', Url::to(['edit', 'id' => 20], true)); |
|
$this->assertEquals('http://example.com/base/index.php?r=page/edit', Url::to(['edit'], true)); |
|
$this->assertEquals('http://example.com/base/index.php?r=page/view', Url::to([''], true)); |
|
|
|
$this->assertEquals('https://example.com/base/index.php?r=page/edit&id=20', Url::to(['edit', 'id' => 20], 'https')); |
|
$this->assertEquals('https://example.com/base/index.php?r=page/edit', Url::to(['edit'], 'https')); |
|
$this->assertEquals('https://example.com/base/index.php?r=page/view', Url::to([''], 'https')); |
|
|
|
// is an empty string: the currently requested URL will be returned; |
|
$this->mockAction('page', 'view', null, ['id' => 10]); |
|
$this->assertEquals('/base/index.php&r=site/current&id=42', Url::to('')); |
|
$this->assertEquals('http://example.com/base/index.php&r=site/current&id=42', Url::to('', true)); |
|
$this->assertEquals('https://example.com/base/index.php&r=site/current&id=42', Url::to('', 'https')); |
|
|
|
// is a non-empty string: it will first be processed by [[Yii::getAlias()]]. If the result |
|
// is an absolute URL, it will be returned either without any change or, if schema was specified, with schema |
|
// replaced; Otherwise, the result will be prefixed with [[\yii\web\Request::baseUrl]] and returned. |
|
\Yii::setAlias('@web1', 'http://test.example.com/test/me1'); |
|
\Yii::setAlias('@web2', 'test/me2'); |
|
\Yii::setAlias('@web3', ''); |
|
\Yii::setAlias('@web4', '/test'); |
|
\Yii::setAlias('@web5', '#test'); |
|
|
|
$this->assertEquals('http://test.example.com/test/me1', Url::to('@web1')); |
|
$this->assertEquals('http://test.example.com/test/me1', Url::to('@web1', true)); |
|
$this->assertEquals('https://test.example.com/test/me1', Url::to('@web1', 'https')); |
|
|
|
$this->assertEquals('/base/test/me2', Url::to('@web2')); |
|
$this->assertEquals('http://example.com/base/test/me2', Url::to('@web2', true)); |
|
$this->assertEquals('https://example.com/base/test/me2', Url::to('@web2', 'https')); |
|
|
|
$this->assertEquals('/base/index.php&r=site/current&id=42', Url::to('@web3')); |
|
$this->assertEquals('http://example.com/base/index.php&r=site/current&id=42', Url::to('@web3', true)); |
|
$this->assertEquals('https://example.com/base/index.php&r=site/current&id=42', Url::to('@web3', 'https')); |
|
|
|
$this->assertEquals('/test', Url::to('@web4')); |
|
$this->assertEquals('http://example.com/test', Url::to('@web4', true)); |
|
$this->assertEquals('https://example.com/test', Url::to('@web4', 'https')); |
|
|
|
$this->assertEquals('#test', Url::to('@web5')); |
|
$this->assertEquals('http://example.com/#test', Url::to('@web5', true)); |
|
$this->assertEquals('https://example.com/#test', Url::to('@web5', 'https')); |
|
|
|
//In case there is no controller, throw an exception |
|
$this->removeMockedAction(); |
|
|
|
$this->setExpectedException('yii\base\InvalidParamException'); |
|
Url::to(['site/view']); |
|
} |
|
|
|
public function testBase() |
|
{ |
|
$this->mockAction('page', 'view', null, ['id' => 10]); |
|
$this->assertEquals('/base', Url::base()); |
|
$this->assertEquals('http://example.com/base', Url::base(true)); |
|
$this->assertEquals('https://example.com/base', Url::base('https')); |
|
} |
|
|
|
public function testHome() |
|
{ |
|
$this->assertEquals('/base/index.php', Url::home()); |
|
$this->assertEquals('http://example.com/base/index.php', Url::home(true)); |
|
$this->assertEquals('https://example.com/base/index.php', Url::home('https')); |
|
} |
|
|
|
public function testCanonical() |
|
{ |
|
$this->mockAction('page', 'view', null, ['id' => 10]); |
|
$this->assertEquals('http://example.com/base/index.php?r=page/view&id=10', Url::canonical()); |
|
$this->removeMockedAction(); |
|
} |
|
}
|
|
|