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' | 
						|
	]; | 
						|
} |