JsonViewTest.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <?php
  2. /**
  3. * JsonViewTest file
  4. *
  5. * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
  6. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  7. *
  8. * Licensed under The MIT License
  9. * For full copyright and license information, please see the LICENSE.txt
  10. * Redistributions of files must retain the above copyright notice
  11. *
  12. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  13. * @link http://cakephp.org CakePHP(tm) Project
  14. * @since 2.1.0
  15. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  16. */
  17. namespace Cake\Test\TestCase\View;
  18. use Cake\Controller\Controller;
  19. use Cake\Core\App;
  20. use Cake\Core\Configure;
  21. use Cake\Network\Request;
  22. use Cake\Network\Response;
  23. use Cake\TestSuite\TestCase;
  24. use Cake\View\JsonView;
  25. /**
  26. * JsonViewTest
  27. *
  28. */
  29. class JsonViewTest extends TestCase
  30. {
  31. public function setUp()
  32. {
  33. parent::setUp();
  34. Configure::write('debug', false);
  35. }
  36. /**
  37. * Generates testRenderWithoutView data.
  38. *
  39. * Note: array($data, $serialize, expected)
  40. *
  41. * @return void
  42. */
  43. public static function renderWithoutViewProvider()
  44. {
  45. return [
  46. // Test render with a valid string in _serialize.
  47. [
  48. ['data' => ['user' => 'fake', 'list' => ['item1', 'item2']]],
  49. 'data',
  50. null,
  51. json_encode(['user' => 'fake', 'list' => ['item1', 'item2']])
  52. ],
  53. // Test render with a string with an invalid key in _serialize.
  54. [
  55. ['data' => ['user' => 'fake', 'list' => ['item1', 'item2']]],
  56. 'no_key',
  57. null,
  58. json_encode(null)
  59. ],
  60. // Test render with a valid array in _serialize.
  61. [
  62. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  63. ['no', 'user'],
  64. null,
  65. json_encode(['no' => 'nope', 'user' => 'fake'])
  66. ],
  67. // Test render with an empty array in _serialize.
  68. [
  69. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  70. [],
  71. null,
  72. json_encode(null)
  73. ],
  74. // Test render with a valid array with an invalid key in _serialize.
  75. [
  76. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  77. ['no', 'user', 'no_key'],
  78. null,
  79. json_encode(['no' => 'nope', 'user' => 'fake'])
  80. ],
  81. // Test render with a valid array with only an invalid key in _serialize.
  82. [
  83. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  84. ['no_key'],
  85. null,
  86. json_encode(null)
  87. ],
  88. // Test render with Null in _serialize (unset).
  89. [
  90. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  91. null,
  92. null,
  93. null
  94. ],
  95. // Test render with False in _serialize.
  96. [
  97. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  98. false,
  99. null,
  100. json_encode(null)
  101. ],
  102. // Test render with True in _serialize.
  103. [
  104. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  105. true,
  106. null,
  107. json_encode(null)
  108. ],
  109. // Test render with empty string in _serialize.
  110. [
  111. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  112. '',
  113. null,
  114. json_encode(null)
  115. ],
  116. // Test render with a valid array in _serialize and alias.
  117. [
  118. ['original_name' => 'my epic name', 'user' => 'fake', 'list' => ['item1', 'item2']],
  119. ['new_name' => 'original_name', 'user'],
  120. null,
  121. json_encode(['new_name' => 'my epic name', 'user' => 'fake'])
  122. ],
  123. // Test render with an a valid array in _serialize and alias of a null value.
  124. [
  125. ['null' => null],
  126. ['null'],
  127. null,
  128. json_encode(['null' => null])
  129. ],
  130. // Test render with a False value to be serialized.
  131. [
  132. ['false' => false],
  133. 'false',
  134. null,
  135. json_encode(false)
  136. ],
  137. // Test render with a True value to be serialized.
  138. [
  139. ['true' => true],
  140. 'true',
  141. null,
  142. json_encode(true)
  143. ],
  144. // Test render with an empty string value to be serialized.
  145. [
  146. ['empty' => ''],
  147. 'empty',
  148. null,
  149. json_encode('')
  150. ],
  151. // Test render with a zero value to be serialized.
  152. [
  153. ['zero' => 0],
  154. 'zero',
  155. null,
  156. json_encode(0)
  157. ],
  158. // Test render with encode <, >, ', &, and " for RFC4627-compliant to be serialized.
  159. [
  160. ['rfc4627_escape' => '<tag> \'quote\' "double-quote" &'],
  161. 'rfc4627_escape',
  162. null,
  163. json_encode('<tag> \'quote\' "double-quote" &', JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT)
  164. ],
  165. // Test render with _jsonOptions = false to be serialized.
  166. [
  167. ['noescape' => '<tag> \'quote\' "double-quote" &'],
  168. 'noescape',
  169. false,
  170. json_encode('<tag> \'quote\' "double-quote" &')
  171. ],
  172. // Test render with setting _jsonOptions to be serialized.
  173. [
  174. ['rfc4627_escape' => '<tag> \'quote\' "double-quote" &'],
  175. 'rfc4627_escape',
  176. JSON_HEX_TAG | JSON_HEX_APOS,
  177. json_encode('<tag> \'quote\' "double-quote" &', JSON_HEX_TAG | JSON_HEX_APOS)
  178. ],
  179. ];
  180. }
  181. /**
  182. * Test render with a valid string in _serialize.
  183. *
  184. * @dataProvider renderWithoutViewProvider
  185. * @return void
  186. */
  187. public function testRenderWithoutView($data, $serialize, $jsonOptions, $expected)
  188. {
  189. $Request = new Request();
  190. $Response = new Response();
  191. $Controller = new Controller($Request, $Response);
  192. $Controller->set($data);
  193. $Controller->set('_serialize', $serialize);
  194. $Controller->set('_jsonOptions', $jsonOptions);
  195. $Controller->viewClass = 'Json';
  196. $View = $Controller->createView();
  197. $output = $View->render(false);
  198. $this->assertSame($expected, $output);
  199. }
  200. /**
  201. * Test that rendering with _serialize does not load helpers.
  202. *
  203. * @return void
  204. */
  205. public function testRenderSerializeNoHelpers()
  206. {
  207. $Request = new Request();
  208. $Response = new Response();
  209. $Controller = new Controller($Request, $Response);
  210. $Controller->helpers = ['Html'];
  211. $Controller->set([
  212. 'tags' => ['cakephp', 'framework'],
  213. '_serialize' => 'tags'
  214. ]);
  215. $Controller->viewClass = 'Json';
  216. $View = $Controller->createView();
  217. $View->render();
  218. $this->assertFalse(isset($View->Html), 'No helper loaded.');
  219. }
  220. /**
  221. * testJsonpResponse method
  222. *
  223. * @return void
  224. */
  225. public function testJsonpResponse()
  226. {
  227. $Request = new Request();
  228. $Response = new Response();
  229. $Controller = new Controller($Request, $Response);
  230. $data = ['user' => 'fake', 'list' => ['item1', 'item2']];
  231. $Controller->set([
  232. 'data' => $data,
  233. '_serialize' => 'data',
  234. '_jsonp' => true
  235. ]);
  236. $Controller->viewClass = 'Json';
  237. $View = $Controller->createView();
  238. $output = $View->render(false);
  239. $this->assertSame(json_encode($data), $output);
  240. $this->assertSame('application/json', $Response->type());
  241. $View->request->query = ['callback' => 'jfunc'];
  242. $output = $View->render(false);
  243. $expected = 'jfunc(' . json_encode($data) . ')';
  244. $this->assertSame($expected, $output);
  245. $this->assertSame('application/javascript', $Response->type());
  246. $View->request->query = ['jsonCallback' => 'jfunc'];
  247. $View->viewVars['_jsonp'] = 'jsonCallback';
  248. $output = $View->render(false);
  249. $expected = 'jfunc(' . json_encode($data) . ')';
  250. $this->assertSame($expected, $output);
  251. }
  252. /**
  253. * Test render with a View file specified.
  254. *
  255. * @return void
  256. */
  257. public function testRenderWithView()
  258. {
  259. $Request = new Request();
  260. $Response = new Response();
  261. $Controller = new Controller($Request, $Response);
  262. $Controller->name = 'Posts';
  263. $Controller->viewPath = 'Posts';
  264. $data = [
  265. 'User' => [
  266. 'username' => 'fake'
  267. ],
  268. 'Item' => [
  269. ['name' => 'item1'],
  270. ['name' => 'item2']
  271. ]
  272. ];
  273. $Controller->set('user', $data);
  274. $Controller->viewClass = 'Json';
  275. $View = $Controller->createView();
  276. $output = $View->render('index');
  277. $expected = json_encode(['user' => 'fake', 'list' => ['item1', 'item2'], 'paging' => null]);
  278. $this->assertSame($expected, $output);
  279. $this->assertSame('application/json', $Response->type());
  280. }
  281. }