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