ViewBuilderTest.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <?php
  2. /**
  3. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  4. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  5. *
  6. * Licensed under The MIT License
  7. * For full copyright and license information, please see the LICENSE.txt
  8. * Redistributions of files must retain the above copyright notice
  9. *
  10. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  11. * @link https://cakephp.org CakePHP(tm) Project
  12. * @since 3.1.0
  13. * @license https://opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\View;
  16. use Cake\TestSuite\TestCase;
  17. use Cake\View\ViewBuilder;
  18. /**
  19. * View builder test case.
  20. */
  21. class ViewBuilderTest extends TestCase
  22. {
  23. /**
  24. * data provider for string properties.
  25. *
  26. * @return array
  27. */
  28. public function stringPropertyProvider()
  29. {
  30. return [
  31. ['layoutPath', 'Admin/'],
  32. ['templatePath', 'Admin/'],
  33. ['plugin', 'TestPlugin'],
  34. ['layout', 'admin'],
  35. ['theme', 'TestPlugin'],
  36. ['template', 'edit'],
  37. ['name', 'Articles'],
  38. ['autoLayout', true],
  39. ['className', 'Cake\View\JsonView'],
  40. ];
  41. }
  42. /**
  43. * data provider for array properties.
  44. *
  45. * @return array
  46. */
  47. public function arrayPropertyProvider()
  48. {
  49. return [
  50. ['helpers', ['Html', 'Form']],
  51. ['options', ['key' => 'value']],
  52. ];
  53. }
  54. /**
  55. * Test string property accessor/mutator methods.
  56. *
  57. * @dataProvider stringPropertyProvider
  58. * @return void
  59. */
  60. public function testStringProperties($property, $value)
  61. {
  62. $builder = new ViewBuilder();
  63. $this->assertNull($builder->{$property}(), 'Default value should be null');
  64. $this->assertSame($builder, $builder->{$property}($value), 'Setter returns this');
  65. $this->assertSame($value, $builder->{$property}(), 'Getter gets value.');
  66. }
  67. /**
  68. * Test array property accessor/mutator methods.
  69. *
  70. * @dataProvider arrayPropertyProvider
  71. * @return void
  72. */
  73. public function testArrayProperties($property, $value)
  74. {
  75. $builder = new ViewBuilder();
  76. $this->assertSame([], $builder->{$property}(), 'Default value should be empty list');
  77. $this->assertSame($builder, $builder->{$property}($value), 'Setter returns this');
  78. $this->assertSame($value, $builder->{$property}(), 'Getter gets value.');
  79. }
  80. /**
  81. * Test array property accessor/mutator methods.
  82. *
  83. * @dataProvider arrayPropertyProvider
  84. * @return void
  85. */
  86. public function testArrayPropertyMerge($property, $value)
  87. {
  88. $builder = new ViewBuilder();
  89. $builder->{$property}($value);
  90. $builder->{$property}(['Merged'], true);
  91. $this->assertSame(array_merge($value, ['Merged']), $builder->{$property}(), 'Should merge');
  92. $builder->{$property}($value, false);
  93. $this->assertSame($value, $builder->{$property}(), 'Should replace');
  94. }
  95. /**
  96. * test building with all the options.
  97. *
  98. * @return void
  99. */
  100. public function testBuildComplete()
  101. {
  102. $request = $this->getMockBuilder('Cake\Http\ServerRequest')->getMock();
  103. $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
  104. $events = $this->getMockBuilder('Cake\Event\EventManager')->getMock();
  105. $builder = new ViewBuilder();
  106. $builder->setName('Articles')
  107. ->setClassName('Ajax')
  108. ->setTemplate('edit')
  109. ->setLayout('default')
  110. ->setTemplatePath('Articles/')
  111. ->setHelpers(['Form', 'Html'])
  112. ->setLayoutPath('Admin/')
  113. ->setTheme('TestTheme')
  114. ->setPlugin('TestPlugin');
  115. $view = $builder->build(
  116. ['one' => 'value'],
  117. $request,
  118. $response,
  119. $events
  120. );
  121. $this->assertInstanceOf('Cake\View\AjaxView', $view);
  122. $this->assertEquals('edit', $view->view);
  123. $this->assertEquals('default', $view->layout);
  124. $this->assertEquals('Articles/', $view->viewPath);
  125. $this->assertEquals('Admin/', $view->layoutPath);
  126. $this->assertEquals('TestPlugin', $view->plugin);
  127. $this->assertEquals('TestTheme', $view->theme);
  128. $this->assertSame($request, $view->request);
  129. $this->assertSame($response, $view->response);
  130. $this->assertSame($events, $view->getEventManager());
  131. $this->assertSame(['one' => 'value'], $view->viewVars);
  132. $this->assertInstanceOf('Cake\View\Helper\HtmlHelper', $view->Html);
  133. $this->assertInstanceOf('Cake\View\Helper\FormHelper', $view->Form);
  134. }
  135. /**
  136. * Test that the default is AppView.
  137. *
  138. * @return void
  139. */
  140. public function testBuildAppViewMissing()
  141. {
  142. static::setAppNamespace('Nope');
  143. $builder = new ViewBuilder();
  144. $view = $builder->build();
  145. $this->assertInstanceOf('Cake\View\View', $view);
  146. }
  147. /**
  148. * Test that the default is AppView.
  149. *
  150. * @return void
  151. */
  152. public function testBuildAppViewPresent()
  153. {
  154. static::setAppNamespace();
  155. $builder = new ViewBuilder();
  156. $view = $builder->build();
  157. $this->assertInstanceOf('TestApp\View\AppView', $view);
  158. }
  159. /**
  160. * test missing view class
  161. *
  162. * @return void
  163. */
  164. public function testBuildMissingViewClass()
  165. {
  166. $this->expectException(\Cake\View\Exception\MissingViewException::class);
  167. $this->expectExceptionMessage('View class "Foo" is missing.');
  168. $builder = new ViewBuilder();
  169. $builder->setClassName('Foo');
  170. $builder->build();
  171. }
  172. /**
  173. * testJsonSerialize()
  174. *
  175. * @return void
  176. */
  177. public function testJsonSerialize()
  178. {
  179. $builder = new ViewBuilder();
  180. $builder
  181. ->setTemplate('default')
  182. ->setLayout('test')
  183. ->setHelpers(['Html'])
  184. ->setClassName('JsonView');
  185. $result = json_decode(json_encode($builder), true);
  186. $expected = [
  187. '_template' => 'default',
  188. '_layout' => 'test',
  189. '_helpers' => ['Html'],
  190. '_className' => 'JsonView',
  191. ];
  192. $this->assertEquals($expected, $result);
  193. $result = json_decode(json_encode(unserialize(serialize($builder))), true);
  194. $this->assertEquals($expected, $result);
  195. }
  196. /**
  197. * testCreateFromArray()
  198. *
  199. * @return void
  200. */
  201. public function testCreateFromArray()
  202. {
  203. $builder = new ViewBuilder();
  204. $builder
  205. ->setTemplate('default')
  206. ->setLayout('test')
  207. ->setHelpers(['Html'])
  208. ->setClassName('JsonView');
  209. $result = json_encode($builder);
  210. $builder = new ViewBuilder();
  211. $builder->createFromArray(json_decode($result, true));
  212. $this->assertEquals('default', $builder->getTemplate());
  213. $this->assertEquals('test', $builder->getLayout());
  214. $this->assertEquals(['Html'], $builder->getHelpers());
  215. $this->assertEquals('JsonView', $builder->getClassName());
  216. }
  217. }