PageRenderTime 25ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/framework/web/CClientScriptTest.php

https://gitlab.com/RECITEC/yii
PHP | 481 lines | 331 code | 36 blank | 114 comment | 0 complexity | d5b953d113a32e2bfd5a1aea68d2879f MD5 | raw file
  1. <?php
  2. Yii::import('system.web.CClientScript');
  3. /**
  4. * @group web
  5. */
  6. class CClientScriptTest extends CTestCase
  7. {
  8. /**
  9. * @var CClientScript
  10. */
  11. private $_clientScript;
  12. public function setUp()
  13. {
  14. $this->_clientScript = new CClientScript();
  15. $this->_clientScript->setCoreScriptUrl("assets/12345");
  16. $this->_clientScript->registerCoreScript('jquery');
  17. $this->_clientScript->registerCoreScript('yii');
  18. }
  19. /* Test Script Getters */
  20. public function testGetCoreScriptUrl()
  21. {
  22. $this->assertEquals('assets/12345', $this->_clientScript->getCoreScriptUrl());
  23. }
  24. public function providerGetPackageBaseUrl()
  25. {
  26. return array(
  27. array('jquery', 'assets/12345'),
  28. array('yii', 'assets/12345')
  29. );
  30. }
  31. /**
  32. * @dataProvider providerGetPackageBaseUrl
  33. *
  34. * @param string $name
  35. * @param string $assertion
  36. */
  37. public function testGetPackageBaseUrl($name, $assertion)
  38. {
  39. $this->assertEquals($assertion,$this->_clientScript->getPackageBaseUrl($name));
  40. }
  41. /* Test Script Registers */
  42. public function providerCoreScripts()
  43. {
  44. return array(
  45. array('jquery', array('js'=>array('jquery.js'))),
  46. array('yiitab', array('js'=>array('jquery.yiitab.js'), 'depends'=>array('jquery'))),
  47. array('yiiactiveform', array('js'=>array('jquery.yiiactiveform.js'), 'depends'=>array('jquery')))
  48. );
  49. }
  50. /**
  51. * @dataProvider providerCoreScripts
  52. *
  53. * @param string $name
  54. * @param array $assertion
  55. */
  56. public function testRegisterCoreScript($name, $assertion)
  57. {
  58. $returnedClientScript = $this->_clientScript->registerCoreScript($name);
  59. $this->assertEquals($assertion, $returnedClientScript->corePackages[$name]);
  60. }
  61. /**
  62. * @dataProvider providerCoreScripts
  63. *
  64. * @param string $name
  65. * @param array $assertion
  66. */
  67. public function testRegisterPackage($name, $assertion)
  68. {
  69. $returnedClientScript = $this->_clientScript->registerPackage($name);
  70. $this->assertEquals($assertion, $returnedClientScript->corePackages[$name]);
  71. }
  72. public function providerScriptFiles()
  73. {
  74. return array(
  75. array('/some/script.js', CClientScript::POS_HEAD, '/some/script.js'),
  76. array('http://some/script.js', CClientScript::POS_BEGIN, 'http://some/script.js'),
  77. array('/some/script.js', CClientScript::POS_END, '/some/script.js'),
  78. );
  79. }
  80. /**
  81. * @dataProvider providerScriptFiles
  82. *
  83. * @param string $url
  84. * @param integer $position
  85. * @param string $assertion
  86. */
  87. public function testRegisterScriptFile($url, $position, $assertion)
  88. {
  89. $returnedClientScript = $this->_clientScript->registerScriptFile($url, $position);
  90. $scriptFiles = $this->readAttribute($returnedClientScript, 'scriptFiles');
  91. $this->assertEquals($assertion, $scriptFiles[$position][$url]);
  92. }
  93. public function providerScriptFilesWithHtmlOptions()
  94. {
  95. return array(
  96. array(
  97. '/some/script.js',
  98. CClientScript::POS_HEAD,
  99. array('defer'=>true),
  100. array(
  101. 'src'=>'/some/script.js',
  102. 'defer'=>true
  103. )
  104. ),
  105. );
  106. }
  107. /**
  108. * @dataProvider providerScriptFilesWithHtmlOptions
  109. *
  110. * @param string $url
  111. * @param integer $position
  112. * @param array $htmlOptions
  113. * @param string $assertion
  114. */
  115. public function testRegisterScriptFileWithHtmlOptions($url, $position, $htmlOptions, $assertion)
  116. {
  117. $returnedClientScript = $this->_clientScript->registerScriptFile($url, $position, $htmlOptions);
  118. $scriptFiles = $this->readAttribute($returnedClientScript, 'scriptFiles');
  119. $this->assertEquals($assertion, $scriptFiles[$position][$url]);
  120. }
  121. public function providerScripts()
  122. {
  123. return array(
  124. array('jsId', "function() {alert('alert')}", CClientScript::POS_HEAD, "function() {alert('alert')}"),
  125. array('jsId', "function() {alert('alert')}", CClientScript::POS_BEGIN, "function() {alert('alert')}"),
  126. );
  127. }
  128. /**
  129. * @dataProvider providerScripts
  130. *
  131. * @param string $id
  132. * @param string $script
  133. * @param integer $position
  134. * @param string $assertion
  135. */
  136. public function testRegisterScript($id, $script, $position, $assertion) {
  137. $returnedClientScript = $this->_clientScript->registerScript($id, $script, $position);
  138. $this->assertEquals($assertion, $returnedClientScript->scripts[$position][$id]);
  139. }
  140. public function providerScriptsWithHtmlOptions()
  141. {
  142. return array(
  143. array(
  144. 'jsId',
  145. "function() {alert('alert')}",
  146. CClientScript::POS_HEAD,
  147. array('defer'=>true),
  148. array(
  149. 'content'=>"function() {alert('alert')}",
  150. 'defer'=>true,
  151. )
  152. ),
  153. );
  154. }
  155. /**
  156. * @dataProvider providerScriptsWithHtmlOptions
  157. *
  158. * @param string $id
  159. * @param string $script
  160. * @param integer $position
  161. * @param array $htmlOptions
  162. * @param string $assertion
  163. */
  164. public function testRegisterScriptWithHtmlOptions($id, $script, $position, $htmlOptions, $assertion) {
  165. $returnedClientScript = $this->_clientScript->registerScript($id, $script, $position, $htmlOptions);
  166. $this->assertEquals($assertion, $returnedClientScript->scripts[$position][$id]);
  167. }
  168. public function providerRegisterCss()
  169. {
  170. return array(
  171. array('myCssDiv', 'float:right;', '', array('myCssDiv'=>array('float:right;', ''))),
  172. array('myCssDiv', 'float:right;', 'screen', array('myCssDiv'=>array('float:right;', 'screen')))
  173. );
  174. }
  175. /**
  176. * @dataProvider providerRegisterCss
  177. *
  178. * @param string $id
  179. * @param string $css
  180. * @param string $media
  181. * @param array $assertion
  182. */
  183. public function testRegisterCss($id, $css, $media, $assertion)
  184. {
  185. $returnedClientScript = $this->_clientScript->registerCss($id, $css, $media);
  186. $this->assertAttributeEquals($assertion, 'css', $returnedClientScript);
  187. }
  188. public function providerRegisterMetaTag()
  189. {
  190. $data = array();
  191. // Simple:
  192. $metaTagData = array(
  193. 'name'=>'testMetaTagName',
  194. 'http-equiv'=>false,
  195. 'content'=>'testMetaTagContent',
  196. );
  197. $assertion = array(
  198. $metaTagData
  199. );
  200. $data[] = array($metaTagData['content'],$metaTagData['name'],$metaTagData['http-equiv'],array(),$assertion);
  201. // Http Equiv:
  202. $metaTagData = array(
  203. 'name'=>'testMetaTagHttpEquiv',
  204. 'http-equiv'=>true,
  205. 'content'=>'testMetaTagHttpEquivContent',
  206. );
  207. $assertion = array(
  208. $metaTagData
  209. );
  210. $data[] = array($metaTagData['content'],$metaTagData['name'],$metaTagData['http-equiv'],array(),$assertion);
  211. return $data;
  212. }
  213. /**
  214. * @dataProvider providerRegisterMetaTag
  215. *
  216. * @param string $content
  217. * @param string $name
  218. * @param boolean $httpEquiv
  219. * @param array $options
  220. * @param array $assertion
  221. */
  222. public function testRegisterMetaTag($content,$name,$httpEquiv,$options,$assertion)
  223. {
  224. $returnedClientScript = $this->_clientScript->registerMetaTag($content,$name,$httpEquiv,$options);
  225. $this->assertAttributeEquals($assertion, 'metaTags', $returnedClientScript);
  226. }
  227. /**
  228. * @depends testRegisterMetaTag
  229. */
  230. public function testRegisterDuplicatingMetaTag() {
  231. $content='Test meta tag content';
  232. $name='test_meta_tag_name';
  233. $this->_clientScript->registerMetaTag($content,$name);
  234. $this->_clientScript->registerMetaTag($content,$name);
  235. $metaTagData=array(
  236. 'name'=>$name,
  237. 'content'=>$content,
  238. );
  239. $assertion=array(
  240. $metaTagData,
  241. $metaTagData
  242. );
  243. $this->assertAttributeEquals($assertion, 'metaTags', $this->_clientScript);
  244. }
  245. /* Test Script Renderers */
  246. public function providerRenderScriptFiles()
  247. {
  248. return array(
  249. array(
  250. '/some/script.js',
  251. CClientScript::POS_HEAD,
  252. array(),
  253. '<script type="text/javascript" src="/some/script.js"></script>'
  254. ),
  255. array(
  256. '/some/script.js',
  257. CClientScript::POS_BEGIN,
  258. array(),
  259. '<script type="text/javascript" src="/some/script.js"></script>'
  260. ),
  261. array(
  262. '/some/script.js',
  263. CClientScript::POS_END,
  264. array(),
  265. '<script type="text/javascript" src="/some/script.js"></script>'
  266. ),
  267. array(
  268. '/options/script.js',
  269. CClientScript::POS_HEAD,
  270. array('defer'=>true),
  271. '<script type="text/javascript" src="/options/script.js" defer="defer"></script>'
  272. ),
  273. array(
  274. '/options/script.js',
  275. CClientScript::POS_BEGIN,
  276. array('defer'=>true),
  277. '<script type="text/javascript" src="/options/script.js" defer="defer"></script>'
  278. ),
  279. array(
  280. '/options/script.js',
  281. CClientScript::POS_END,
  282. array('defer'=>true),
  283. '<script type="text/javascript" src="/options/script.js" defer="defer"></script>'
  284. ),
  285. );
  286. }
  287. /**
  288. * @depends testRegisterScriptFile
  289. * @depends testRegisterScriptFileWithHtmlOptions
  290. *
  291. * @dataProvider providerRenderScriptFiles
  292. *
  293. * @param string $url
  294. * @param integer $position
  295. * @param array $htmlOptions
  296. * @param string $assertion
  297. */
  298. public function testRenderScriptFiles($url, $position, $htmlOptions, $assertion)
  299. {
  300. $returnedClientScript = $this->_clientScript->registerScriptFile($url, $position, $htmlOptions);
  301. $output = '<head></head>';
  302. $returnedClientScript->render($output);
  303. $this->assertContains($assertion, $output);
  304. }
  305. public function providerRenderScripts()
  306. {
  307. return array(
  308. array(
  309. 'some_js_id',
  310. "function() {alert('script')}",
  311. CClientScript::POS_HEAD,
  312. array(),
  313. CHtml::script("function() {alert('script')}")
  314. ),
  315. array(
  316. 'some_js_id',
  317. "function() {alert('script')}",
  318. CClientScript::POS_BEGIN,
  319. array(),
  320. CHtml::script("function() {alert('script')}")
  321. ),
  322. array(
  323. 'some_js_id',
  324. "function() {alert('script')}",
  325. CClientScript::POS_END,
  326. array(),
  327. CHtml::script("function() {alert('script')}")
  328. ),
  329. array(
  330. 'some_js_id',
  331. "function() {alert('script')}",
  332. CClientScript::POS_LOAD,
  333. array(),
  334. CHtml::script("function() {alert('script')}")
  335. ),
  336. array(
  337. 'some_js_id',
  338. "function() {alert('script')}",
  339. CClientScript::POS_READY,
  340. array(),
  341. CHtml::script("function() {alert('script')}")
  342. ),
  343. // With HTML options
  344. array(
  345. 'option_js_id',
  346. "function() {alert('script')}",
  347. CClientScript::POS_HEAD,
  348. array('defer'=>true),
  349. CHtml::script("function() {alert('script')}",array('defer'=>true))
  350. ),
  351. array(
  352. 'option_js_id',
  353. "function() {alert('script')}",
  354. CClientScript::POS_BEGIN,
  355. array('defer'=>true),
  356. CHtml::script("function() {alert('script')}",array('defer'=>true))
  357. ),
  358. array(
  359. 'option_js_id',
  360. "function() {alert('script')}",
  361. CClientScript::POS_END,
  362. array('defer'=>true),
  363. CHtml::script("function() {alert('script')}",array('defer'=>true))
  364. ),
  365. );
  366. }
  367. /**
  368. * @depends testRegisterScript
  369. *
  370. * @dataProvider providerRenderScripts
  371. *
  372. * @param string $id
  373. * @param string $script
  374. * @param integer $position
  375. * @param array $htmlOptions
  376. * @param string $assertion
  377. */
  378. public function testRenderScripts($id, $script, $position, $htmlOptions, $assertion)
  379. {
  380. $returnedClientScript = $this->_clientScript->registerScript($id, $script, $position, $htmlOptions);
  381. $output = '<head></head>';
  382. $returnedClientScript->render($output);
  383. $this->assertContains($assertion, $output);
  384. }
  385. public function providerRenderScriptsBatch()
  386. {
  387. return array(
  388. array(
  389. array(
  390. array(
  391. 'id' => 'js_id_1',
  392. 'script' => "function() {alert('script1')}",
  393. 'position' => CClientScript::POS_HEAD,
  394. 'htmlOptions' => array(),
  395. ),
  396. array(
  397. 'id' => 'js_id_2',
  398. 'script' => "function() {alert('script2')}",
  399. 'position' => CClientScript::POS_HEAD,
  400. 'htmlOptions' => array(),
  401. ),
  402. ),
  403. 1
  404. ),
  405. array(
  406. array(
  407. array(
  408. 'id' => 'js_id_1',
  409. 'script' => "function() {alert('script1')}",
  410. 'position' => CClientScript::POS_HEAD,
  411. 'htmlOptions' => array(),
  412. ),
  413. array(
  414. 'id' => 'js_id_2',
  415. 'script' => "function() {alert('script2')}",
  416. 'position' => CClientScript::POS_HEAD,
  417. 'htmlOptions' => array(
  418. 'defer' => true
  419. ),
  420. ),
  421. ),
  422. 2
  423. ),
  424. );
  425. }
  426. /**
  427. * @depends testRenderScripts
  428. *
  429. * @dataProvider providerRenderScriptsBatch
  430. *
  431. * @param array $scriptBatch
  432. * @param integer $expectedScriptTagCount
  433. *
  434. * @see https://github.com/yiisoft/yii/issues/2770
  435. */
  436. public function testRenderScriptsBatch(array $scriptBatch, $expectedScriptTagCount)
  437. {
  438. $this->_clientScript->reset();
  439. foreach($scriptBatch as $scriptParams)
  440. $this->_clientScript->registerScript($scriptParams['id'], $scriptParams['script'], $scriptParams['position'], $scriptParams['htmlOptions']);
  441. $output = '<head></head>';
  442. $this->_clientScript->render($output);
  443. $this->assertEquals($expectedScriptTagCount, substr_count($output, '<script'));
  444. }
  445. }