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.
256 lines
7.0 KiB
256 lines
7.0 KiB
<?php |
|
/** |
|
* |
|
* |
|
* @author Carsten Brandt <mail@cebe.cc> |
|
*/ |
|
|
|
namespace yiiunit\framework\web; |
|
|
|
use Yii; |
|
use yii\base\View; |
|
use yii\web\AssetBundle; |
|
use yii\web\AssetManager; |
|
|
|
/** |
|
* @group web |
|
*/ |
|
class AssetBundleTest extends \yiiunit\TestCase |
|
{ |
|
protected function setUp() |
|
{ |
|
parent::setUp(); |
|
$this->mockApplication(); |
|
|
|
Yii::setAlias('@testWeb', '/'); |
|
Yii::setAlias('@testWebRoot', '@yiiunit/data/web'); |
|
} |
|
|
|
protected function getView() |
|
{ |
|
$view = new View(); |
|
$view->setAssetManager(new AssetManager([ |
|
'basePath' => '@testWebRoot/assets', |
|
'baseUrl' => '@testWeb/assets', |
|
])); |
|
|
|
return $view; |
|
} |
|
|
|
public function testRegister() |
|
{ |
|
$view = $this->getView(); |
|
|
|
$this->assertEmpty($view->assetBundles); |
|
TestSimpleAsset::register($view); |
|
$this->assertEquals(1, count($view->assetBundles)); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestSimpleAsset', $view->assetBundles); |
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestSimpleAsset'] instanceof AssetBundle); |
|
|
|
$expected = <<<EOF |
|
123<script src="/js/jquery.js"></script>4 |
|
EOF; |
|
$this->assertEquals($expected, $view->renderFile('@yiiunit/data/views/rawlayout.php')); |
|
} |
|
|
|
public function testSimpleDependency() |
|
{ |
|
$view = $this->getView(); |
|
|
|
$this->assertEmpty($view->assetBundles); |
|
TestAssetBundle::register($view); |
|
$this->assertEquals(3, count($view->assetBundles)); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestAssetBundle', $view->assetBundles); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestJqueryAsset', $view->assetBundles); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestAssetLevel3', $view->assetBundles); |
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestAssetBundle'] instanceof AssetBundle); |
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestJqueryAsset'] instanceof AssetBundle); |
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestAssetLevel3'] instanceof AssetBundle); |
|
|
|
$expected = <<<EOF |
|
1<link href="/files/cssFile.css" rel="stylesheet">23<script src="/js/jquery.js"></script> |
|
<script src="/files/jsFile.js"></script>4 |
|
EOF; |
|
$this->assertEquals($expected, $view->renderFile('@yiiunit/data/views/rawlayout.php')); |
|
} |
|
|
|
public function positionProvider() |
|
{ |
|
return [ |
|
[View::POS_HEAD, true], |
|
[View::POS_HEAD, false], |
|
[View::POS_BEGIN, true], |
|
[View::POS_BEGIN, false], |
|
[View::POS_END, true], |
|
[View::POS_END, false], |
|
]; |
|
} |
|
|
|
/** |
|
* @dataProvider positionProvider |
|
*/ |
|
public function testPositionDependency($pos, $jqAlreadyRegistered) |
|
{ |
|
$view = $this->getView(); |
|
|
|
$view->getAssetManager()->bundles['yiiunit\\framework\\web\\TestAssetBundle'] = [ |
|
'jsOptions' => [ |
|
'position' => $pos, |
|
], |
|
]; |
|
|
|
$this->assertEmpty($view->assetBundles); |
|
if ($jqAlreadyRegistered) { |
|
TestJqueryAsset::register($view); |
|
} |
|
TestAssetBundle::register($view); |
|
$this->assertEquals(3, count($view->assetBundles)); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestAssetBundle', $view->assetBundles); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestJqueryAsset', $view->assetBundles); |
|
$this->assertArrayHasKey('yiiunit\\framework\\web\\TestAssetLevel3', $view->assetBundles); |
|
|
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestAssetBundle'] instanceof AssetBundle); |
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestJqueryAsset'] instanceof AssetBundle); |
|
$this->assertTrue($view->assetBundles['yiiunit\\framework\\web\\TestAssetLevel3'] instanceof AssetBundle); |
|
|
|
$this->assertArrayHasKey('position', $view->assetBundles['yiiunit\\framework\\web\\TestAssetBundle']->jsOptions); |
|
$this->assertEquals($pos, $view->assetBundles['yiiunit\\framework\\web\\TestAssetBundle']->jsOptions['position']); |
|
$this->assertArrayHasKey('position', $view->assetBundles['yiiunit\\framework\\web\\TestJqueryAsset']->jsOptions); |
|
$this->assertEquals($pos, $view->assetBundles['yiiunit\\framework\\web\\TestJqueryAsset']->jsOptions['position']); |
|
$this->assertArrayHasKey('position', $view->assetBundles['yiiunit\\framework\\web\\TestAssetLevel3']->jsOptions); |
|
$this->assertEquals($pos, $view->assetBundles['yiiunit\\framework\\web\\TestAssetLevel3']->jsOptions['position']); |
|
|
|
switch($pos) |
|
{ |
|
case View::POS_HEAD: |
|
$expected = <<<EOF |
|
1<link href="/files/cssFile.css" rel="stylesheet"> |
|
<script src="/js/jquery.js"></script> |
|
<script src="/files/jsFile.js"></script>234 |
|
EOF; |
|
break; |
|
case View::POS_BEGIN: |
|
$expected = <<<EOF |
|
1<link href="/files/cssFile.css" rel="stylesheet">2<script src="/js/jquery.js"></script> |
|
<script src="/files/jsFile.js"></script>34 |
|
EOF; |
|
break; |
|
default: |
|
case View::POS_END: |
|
$expected = <<<EOF |
|
1<link href="/files/cssFile.css" rel="stylesheet">23<script src="/js/jquery.js"></script> |
|
<script src="/files/jsFile.js"></script>4 |
|
EOF; |
|
break; |
|
} |
|
$this->assertEquals($expected, $view->renderFile('@yiiunit/data/views/rawlayout.php')); |
|
} |
|
|
|
public function positionProvider2() |
|
{ |
|
return [ |
|
[View::POS_BEGIN, true], |
|
[View::POS_BEGIN, false], |
|
[View::POS_END, true], |
|
[View::POS_END, false], |
|
]; |
|
} |
|
|
|
/** |
|
* @dataProvider positionProvider |
|
*/ |
|
public function testPositionDependencyConflict($pos, $jqAlreadyRegistered) |
|
{ |
|
$view = $this->getView(); |
|
|
|
$view->getAssetManager()->bundles['yiiunit\\framework\\web\\TestAssetBundle'] = [ |
|
'jsOptions' => [ |
|
'position' => $pos - 1, |
|
], |
|
]; |
|
$view->getAssetManager()->bundles['yiiunit\\framework\\web\\TestJqueryAsset'] = [ |
|
'jsOptions' => [ |
|
'position' => $pos, |
|
], |
|
]; |
|
|
|
$this->assertEmpty($view->assetBundles); |
|
if ($jqAlreadyRegistered) { |
|
TestJqueryAsset::register($view); |
|
} |
|
$this->setExpectedException('yii\\base\\InvalidConfigException'); |
|
TestAssetBundle::register($view); |
|
} |
|
|
|
public function testCircularDependency() |
|
{ |
|
$this->setExpectedException('yii\\base\\InvalidConfigException'); |
|
TestAssetCircleA::register($this->getView()); |
|
} |
|
} |
|
|
|
class TestSimpleAsset extends AssetBundle |
|
{ |
|
public $basePath = '@testWebRoot/js'; |
|
public $baseUrl = '@testWeb/js'; |
|
public $js = [ |
|
'jquery.js', |
|
]; |
|
} |
|
|
|
class TestAssetBundle extends AssetBundle |
|
{ |
|
public $basePath = '@testWebRoot/files'; |
|
public $baseUrl = '@testWeb/files'; |
|
public $css = [ |
|
'cssFile.css', |
|
]; |
|
public $js = [ |
|
'jsFile.js', |
|
]; |
|
public $depends = [ |
|
'yiiunit\\framework\\web\\TestJqueryAsset' |
|
]; |
|
} |
|
|
|
class TestJqueryAsset extends AssetBundle |
|
{ |
|
public $basePath = '@testWebRoot/js'; |
|
public $baseUrl = '@testWeb/js'; |
|
public $js = [ |
|
'jquery.js', |
|
]; |
|
public $depends = [ |
|
'yiiunit\\framework\\web\\TestAssetLevel3' |
|
]; |
|
} |
|
|
|
class TestAssetLevel3 extends AssetBundle |
|
{ |
|
public $basePath = '@testWebRoot/js'; |
|
public $baseUrl = '@testWeb/js'; |
|
} |
|
|
|
class TestAssetCircleA extends AssetBundle |
|
{ |
|
public $basePath = '@testWebRoot/js'; |
|
public $baseUrl = '@testWeb/js'; |
|
public $js = [ |
|
'jquery.js', |
|
]; |
|
public $depends = [ |
|
'yiiunit\\framework\\web\\TestAssetCircleB' |
|
]; |
|
} |
|
|
|
class TestAssetCircleB extends AssetBundle |
|
{ |
|
public $basePath = '@testWebRoot/js'; |
|
public $baseUrl = '@testWeb/js'; |
|
public $js = [ |
|
'jquery.js', |
|
]; |
|
public $depends = [ |
|
'yiiunit\\framework\\web\\TestAssetCircleA' |
|
]; |
|
} |