ViewBuilderTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * For full copyright and license information, please see the LICENSE.txt
  9. * Redistributions of files must retain the above copyright notice
  10. *
  11. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  12. * @link https://cakephp.org CakePHP(tm) Project
  13. * @since 3.1.0
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase\View;
  17. use Cake\Event\EventManager;
  18. use Cake\Http\Response;
  19. use Cake\Http\ServerRequest;
  20. use Cake\TestSuite\TestCase;
  21. use Cake\View\ViewBuilder;
  22. /**
  23. * View builder test case.
  24. */
  25. class ViewBuilderTest extends TestCase
  26. {
  27. public function testSetVar()
  28. {
  29. $builder = new ViewBuilder();
  30. $builder->setVar('testing', 'value');
  31. $this->assertSame('value', $builder->getVar('testing'));
  32. }
  33. public function testSetVars()
  34. {
  35. $builder = new ViewBuilder();
  36. $data = ['test' => 'val', 'foo' => 'bar'];
  37. $builder->setVars($data);
  38. $this->assertEquals($data, $builder->getVars());
  39. $update = ['test' => 'updated'];
  40. $builder->setVars($update);
  41. $this->assertEquals(
  42. ['foo' => 'bar', 'test' => 'updated'],
  43. $builder->getVars()
  44. );
  45. $update = ['overwrite' => 'yes'];
  46. $builder->setVars($update, false);
  47. $this->assertEquals(
  48. ['overwrite' => 'yes'],
  49. $builder->getVars()
  50. );
  51. }
  52. public function testHasVar()
  53. {
  54. $builder = new ViewBuilder();
  55. $this->assertFalse($builder->hasVar('foo'));
  56. $builder->setVar('foo', 'value');
  57. $this->assertTrue($builder->hasVar('foo'));
  58. $builder->setVar('bar', null);
  59. $this->assertTrue($builder->hasVar('bar'));
  60. }
  61. /**
  62. * data provider for string properties.
  63. *
  64. * @return array
  65. */
  66. public function stringPropertyProvider()
  67. {
  68. return [
  69. ['layoutPath', 'Admin/'],
  70. ['templatePath', 'Admin/'],
  71. ['plugin', 'TestPlugin'],
  72. ['layout', 'admin'],
  73. ['theme', 'TestPlugin'],
  74. ['template', 'edit'],
  75. ['name', 'Articles'],
  76. ['className', 'Cake\View\JsonView'],
  77. ];
  78. }
  79. /**
  80. * data provider for boolean properties.
  81. * Format: [key, expectedDefault, newValue]
  82. *
  83. * @return array
  84. */
  85. public function boolPropertyProvider()
  86. {
  87. return [
  88. ['autoLayout', true, false],
  89. ];
  90. }
  91. /**
  92. * data provider for array properties.
  93. *
  94. * @return array
  95. */
  96. public function arrayPropertyProvider()
  97. {
  98. return [
  99. ['helpers', ['Html', 'Form']],
  100. ['options', ['key' => 'value']],
  101. ];
  102. }
  103. /**
  104. * Test string property accessor/mutator methods.
  105. *
  106. * @dataProvider stringPropertyProvider
  107. * @return void
  108. */
  109. public function testStringProperties($property, $value)
  110. {
  111. $get = 'get' . ucfirst($property);
  112. $set = 'set' . ucfirst($property);
  113. $builder = new ViewBuilder();
  114. $this->assertNull($builder->{$get}(), 'Default value should be null');
  115. $this->assertSame($builder, $builder->{$set}($value), 'Setter returns this');
  116. $this->assertSame($value, $builder->{$get}(), 'Getter gets value.');
  117. }
  118. /**
  119. * Test string property accessor/mutator methods.
  120. *
  121. * @dataProvider boolPropertyProvider
  122. * @return void
  123. */
  124. public function testBoolProperties($property, $default, $value)
  125. {
  126. $set = 'enable' . ucfirst($property);
  127. $get = 'is' . ucfirst($property) . 'Enabled';
  128. $builder = new ViewBuilder();
  129. $this->assertSame($default, $builder->{$get}(), 'Default value not as expected');
  130. $this->assertSame($builder, $builder->{$set}($value), 'Setter returns this');
  131. $this->assertSame($value, $builder->{$get}(), 'Getter gets value.');
  132. }
  133. /**
  134. * Test array property accessor/mutator methods.
  135. *
  136. * @dataProvider arrayPropertyProvider
  137. * @return void
  138. */
  139. public function testArrayProperties($property, $value)
  140. {
  141. $get = 'get' . ucfirst($property);
  142. $set = 'set' . ucfirst($property);
  143. $builder = new ViewBuilder();
  144. $this->assertSame([], $builder->{$get}(), 'Default value should be empty list');
  145. $this->assertSame($builder, $builder->{$set}($value), 'Setter returns this');
  146. $this->assertSame($value, $builder->{$get}(), 'Getter gets value.');
  147. }
  148. /**
  149. * Test array property accessor/mutator methods.
  150. *
  151. * @dataProvider arrayPropertyProvider
  152. * @return void
  153. */
  154. public function testArrayPropertyMerge($property, $value)
  155. {
  156. $get = 'get' . ucfirst($property);
  157. $set = 'set' . ucfirst($property);
  158. $builder = new ViewBuilder();
  159. $builder->{$set}($value);
  160. $builder->{$set}(['Merged'], true);
  161. $this->assertSame(array_merge($value, ['Merged']), $builder->{$get}(), 'Should merge');
  162. $builder->{$set}($value, false);
  163. $this->assertSame($value, $builder->{$get}(), 'Should replace');
  164. }
  165. /**
  166. * test building with all the options.
  167. *
  168. * @return void
  169. */
  170. public function testBuildComplete()
  171. {
  172. $request = new ServerRequest();
  173. $response = new Response();
  174. $events = new EventManager();
  175. $builder = new ViewBuilder();
  176. $builder->setName('Articles')
  177. ->setClassName('Ajax')
  178. ->setTemplate('edit')
  179. ->setLayout('default')
  180. ->setTemplatePath('Articles/')
  181. ->setHelpers(['Form', 'Html'])
  182. ->setLayoutPath('Admin/')
  183. ->setTheme('TestTheme')
  184. ->setPlugin('TestPlugin')
  185. ->setVars(['foo' => 'bar', 'x' => 'old']);
  186. $view = $builder->build(
  187. ['one' => 'value', 'x' => 'new'],
  188. $request,
  189. $response,
  190. $events
  191. );
  192. $this->assertInstanceOf('Cake\View\AjaxView', $view);
  193. $this->assertSame('edit', $view->getTemplate());
  194. $this->assertSame('default', $view->getLayout());
  195. $this->assertSame('Articles/', $view->getTemplatePath());
  196. $this->assertSame('Admin/', $view->getLayoutPath());
  197. $this->assertSame('TestPlugin', $view->getPlugin());
  198. $this->assertSame('TestTheme', $view->getTheme());
  199. $this->assertSame($request, $view->getRequest());
  200. $this->assertInstanceOf(Response::class, $view->getResponse());
  201. $this->assertSame($events, $view->getEventManager());
  202. $this->assertSame(['one', 'x', 'foo'], $view->getVars());
  203. $this->assertSame('value', $view->get('one'));
  204. $this->assertSame('bar', $view->get('foo'));
  205. $this->assertInstanceOf('Cake\View\Helper\HtmlHelper', $view->Html);
  206. $this->assertInstanceOf('Cake\View\Helper\FormHelper', $view->Form);
  207. }
  208. /**
  209. * Test that the default is AppView.
  210. *
  211. * @return void
  212. */
  213. public function testBuildAppViewMissing()
  214. {
  215. static::setAppNamespace('Nope');
  216. $builder = new ViewBuilder();
  217. $view = $builder->build();
  218. $this->assertInstanceOf('Cake\View\View', $view);
  219. }
  220. /**
  221. * Test that the default is AppView.
  222. *
  223. * @return void
  224. */
  225. public function testBuildAppViewPresent()
  226. {
  227. static::setAppNamespace();
  228. $builder = new ViewBuilder();
  229. $view = $builder->build();
  230. $this->assertInstanceOf('TestApp\View\AppView', $view);
  231. }
  232. /**
  233. * test missing view class
  234. *
  235. * @return void
  236. */
  237. public function testBuildMissingViewClass()
  238. {
  239. $this->expectException(\Cake\View\Exception\MissingViewException::class);
  240. $this->expectExceptionMessage('View class "Foo" is missing.');
  241. $builder = new ViewBuilder();
  242. $builder->setClassName('Foo');
  243. $builder->build();
  244. }
  245. /**
  246. * testJsonSerialize()
  247. *
  248. * @return void
  249. */
  250. public function testJsonSerialize()
  251. {
  252. $builder = new ViewBuilder();
  253. $builder
  254. ->setTemplate('default')
  255. ->setLayout('test')
  256. ->setHelpers(['Html'])
  257. ->setClassName('JsonView');
  258. $result = json_decode(json_encode($builder), true);
  259. $expected = [
  260. '_template' => 'default',
  261. '_layout' => 'test',
  262. '_helpers' => ['Html'],
  263. '_className' => 'JsonView',
  264. '_autoLayout' => true,
  265. ];
  266. $this->assertEquals($expected, $result);
  267. $result = json_decode(json_encode(unserialize(serialize($builder))), true);
  268. $this->assertEquals($expected, $result);
  269. }
  270. /**
  271. * testCreateFromArray()
  272. *
  273. * @return void
  274. */
  275. public function testCreateFromArray()
  276. {
  277. $builder = new ViewBuilder();
  278. $builder
  279. ->setTemplate('default')
  280. ->setLayout('test')
  281. ->setHelpers(['Html'])
  282. ->setClassName('JsonView');
  283. $result = json_encode($builder);
  284. $builder = new ViewBuilder();
  285. $builder->createFromArray(json_decode($result, true));
  286. $this->assertSame('default', $builder->getTemplate());
  287. $this->assertSame('test', $builder->getLayout());
  288. $this->assertEquals(['Html'], $builder->getHelpers());
  289. $this->assertSame('JsonView', $builder->getClassName());
  290. }
  291. /**
  292. * test setOptions() with 1 string param, merge true
  293. *
  294. * @return void
  295. */
  296. public function testSetOptionsOne()
  297. {
  298. $builder = new ViewBuilder();
  299. $this->assertSame($builder, $builder->setOptions(['newOption']));
  300. $this->assertContains('newOption', $builder->getOptions());
  301. }
  302. /**
  303. * test setOptions() with 2 strings in array, merge true.
  304. *
  305. * @return void
  306. */
  307. public function testSetOptionsMultiple()
  308. {
  309. $builder = new ViewBuilder();
  310. $builder->setOptions(['oldOption'], false);
  311. $option = ['newOption', 'anotherOption'];
  312. $builder->setOptions($option);
  313. $expects = ['oldOption', 'newOption', 'anotherOption'];
  314. $result = $builder->getOptions();
  315. $this->assertContainsOnly('string', $result);
  316. $this->assertEquals($expects, $result);
  317. }
  318. /**
  319. * test empty params reads _viewOptions.
  320. *
  321. * @return void
  322. */
  323. public function testReadingViewOptions()
  324. {
  325. $builder = new ViewBuilder();
  326. $builder->setOptions(['one', 'two', 'three'], false);
  327. $this->assertEquals(['one', 'two', 'three'], $builder->getOptions());
  328. }
  329. /**
  330. * test setting $merge `false` overrides correct options.
  331. *
  332. * @return void
  333. */
  334. public function testMergeFalseViewOptions()
  335. {
  336. $builder = new ViewBuilder();
  337. $builder->setOptions(['one', 'two', 'three'], false);
  338. $expected = ['four', 'five', 'six'];
  339. $builder->setOptions($expected, false);
  340. $this->assertEquals($expected, $builder->getOptions());
  341. }
  342. /**
  343. * test _viewOptions is undefined and $opts is null, an empty array is returned.
  344. *
  345. * @return void
  346. */
  347. public function testUndefinedValidViewOptions()
  348. {
  349. $builder = new ViewBuilder();
  350. $builder->setOptions([], false);
  351. $result = $builder->getOptions();
  352. $this->assertIsArray($result);
  353. $this->assertEmpty($result);
  354. }
  355. public function testOptionSetGet()
  356. {
  357. $builder = new ViewBuilder();
  358. $result = $builder->setOption('foo', 'bar');
  359. $this->assertSame($builder, $result);
  360. $this->assertSame('bar', $builder->getOption('foo'));
  361. $builder->setOption('foo', 'overwrite');
  362. $this->assertSame('overwrite', $builder->getOption('foo'));
  363. $this->assertNull($builder->getOption('non-existent'));
  364. }
  365. /**
  366. * testDisableAutoLayout
  367. *
  368. * @return void
  369. */
  370. public function testDisableAutoLayout()
  371. {
  372. $builder = new ViewBuilder();
  373. $this->assertTrue($builder->isAutoLayoutEnabled());
  374. $builder->disableAutoLayout();
  375. $this->assertFalse($builder->isAutoLayoutEnabled());
  376. }
  377. }