|
|
|
<?php
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @author Carsten Brandt <mail@cebe.cc>
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace yiiunit\framework\web;
|
|
|
|
|
|
|
|
use Yii;
|
|
|
|
use yii\web\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'
|
|
|
|
];
|
|
|
|
}
|