*/ 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(array( '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 = <<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 = <<23 4 EOF; $this->assertEquals($expected, $view->renderFile('@yiiunit/data/views/rawlayout.php')); } public function positionProvider() { return array( array(View::POS_HEAD, true), array(View::POS_HEAD, false), array(View::POS_BEGIN, true), array(View::POS_BEGIN, false), array(View::POS_END, true), array(View::POS_END, false), ); } /** * @dataProvider positionProvider */ public function testPositionDependency($pos, $jqAlreadyRegistered) { $view = $this->getView(); $view->getAssetManager()->bundles['yiiunit\\framework\\web\\TestAssetBundle'] = array( 'jsOptions' => array( '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 = << 234 EOF; break; case View::POS_BEGIN: $expected = <<2 34 EOF; break; default: case View::POS_END: $expected = <<23 4 EOF; break; } $this->assertEquals($expected, $view->renderFile('@yiiunit/data/views/rawlayout.php')); } public function positionProvider2() { return array( array(View::POS_BEGIN, true), array(View::POS_BEGIN, false), array(View::POS_END, true), array(View::POS_END, false), ); } /** * @dataProvider positionProvider */ public function testPositionDependencyConflict($pos, $jqAlreadyRegistered) { $view = $this->getView(); $view->getAssetManager()->bundles['yiiunit\\framework\\web\\TestAssetBundle'] = array( 'jsOptions' => array( 'position' => $pos - 1, ), ); $view->getAssetManager()->bundles['yiiunit\\framework\\web\\TestJqueryAsset'] = array( 'jsOptions' => array( '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 = array( 'jquery.js', ); } class TestAssetBundle extends AssetBundle { public $basePath = '@testWebRoot/files'; public $baseUrl = '@testWeb/files'; public $css = array( 'cssFile.css', ); public $js = array( 'jsFile.js', ); public $depends = array( 'yiiunit\\framework\\web\\TestJqueryAsset' ); } class TestJqueryAsset extends AssetBundle { public $basePath = '@testWebRoot/js'; public $baseUrl = '@testWeb/js'; public $js = array( 'jquery.js', ); public $depends = array( '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 = array( 'jquery.js', ); public $depends = array( 'yiiunit\\framework\\web\\TestAssetCircleB' ); } class TestAssetCircleB extends AssetBundle { public $basePath = '@testWebRoot/js'; public $baseUrl = '@testWeb/js'; public $js = array( 'jquery.js', ); public $depends = array( 'yiiunit\\framework\\web\\TestAssetCircleA' ); }