JsonViewTest.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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. null
  101. ],
  102. // Test render with True in _serialize.
  103. [
  104. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  105. true,
  106. JSON_HEX_QUOT,
  107. json_encode(['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']])
  108. ],
  109. // Test render with True in _serialize and single var
  110. [
  111. ['no' => 'nope'],
  112. true,
  113. null,
  114. json_encode(['no' => 'nope'])
  115. ],
  116. // Test render with empty string in _serialize.
  117. [
  118. ['no' => 'nope', 'user' => 'fake', 'list' => ['item1', 'item2']],
  119. '',
  120. null,
  121. json_encode(null)
  122. ],
  123. // Test render with a valid array in _serialize and alias.
  124. [
  125. ['original_name' => 'my epic name', 'user' => 'fake', 'list' => ['item1', 'item2']],
  126. ['new_name' => 'original_name', 'user'],
  127. null,
  128. json_encode(['new_name' => 'my epic name', 'user' => 'fake'])
  129. ],
  130. // Test render with an a valid array in _serialize and alias of a null value.
  131. [
  132. ['null' => null],
  133. ['null'],
  134. null,
  135. json_encode(['null' => null])
  136. ],
  137. // Test render with a False value to be serialized.
  138. [
  139. ['false' => false],
  140. 'false',
  141. null,
  142. json_encode(false)
  143. ],
  144. // Test render with a True value to be serialized.
  145. [
  146. ['true' => true],
  147. 'true',
  148. null,
  149. json_encode(true)
  150. ],
  151. // Test render with an empty string value to be serialized.
  152. [
  153. ['empty' => ''],
  154. 'empty',
  155. null,
  156. json_encode('')
  157. ],
  158. // Test render with a zero value to be serialized.
  159. [
  160. ['zero' => 0],
  161. 'zero',
  162. null,
  163. json_encode(0)
  164. ],
  165. // Test render with encode <, >, ', &, and " for RFC4627-compliant to be serialized.
  166. [
  167. ['rfc4627_escape' => '<tag> \'quote\' "double-quote" &'],
  168. 'rfc4627_escape',
  169. null,
  170. json_encode('<tag> \'quote\' "double-quote" &', JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT)
  171. ],
  172. // Test render with _jsonOptions = false to be serialized.
  173. [
  174. ['noescape' => '<tag> \'quote\' "double-quote" &'],
  175. 'noescape',
  176. false,
  177. json_encode('<tag> \'quote\' "double-quote" &')
  178. ],
  179. // Test render with setting _jsonOptions to be serialized.
  180. [
  181. ['rfc4627_escape' => '<tag> \'quote\' "double-quote" &'],
  182. 'rfc4627_escape',
  183. JSON_HEX_TAG | JSON_HEX_APOS,
  184. json_encode('<tag> \'quote\' "double-quote" &', JSON_HEX_TAG | JSON_HEX_APOS)
  185. ],
  186. ];
  187. }
  188. /**
  189. * Test render with a valid string in _serialize.
  190. *
  191. * @dataProvider renderWithoutViewProvider
  192. * @return void
  193. */
  194. public function testRenderWithoutView($data, $serialize, $jsonOptions, $expected)
  195. {
  196. $Request = new Request();
  197. $Response = new Response();
  198. $Controller = new Controller($Request, $Response);
  199. $Controller->set($data);
  200. $Controller->set('_serialize', $serialize);
  201. $Controller->set('_jsonOptions', $jsonOptions);
  202. $Controller->viewClass = 'Json';
  203. $View = $Controller->createView();
  204. $output = $View->render(false);
  205. $this->assertSame($expected, $output);
  206. }
  207. /**
  208. * Test that rendering with _serialize does not load helpers.
  209. *
  210. * @return void
  211. */
  212. public function testRenderSerializeNoHelpers()
  213. {
  214. $Request = new Request();
  215. $Response = new Response();
  216. $Controller = new Controller($Request, $Response);
  217. $Controller->helpers = ['Html'];
  218. $Controller->set([
  219. 'tags' => ['cakephp', 'framework'],
  220. '_serialize' => 'tags'
  221. ]);
  222. $Controller->viewClass = 'Json';
  223. $View = $Controller->createView();
  224. $View->render();
  225. $this->assertFalse(isset($View->Html), 'No helper loaded.');
  226. }
  227. /**
  228. * testJsonpResponse method
  229. *
  230. * @return void
  231. */
  232. public function testJsonpResponse()
  233. {
  234. $Request = new Request();
  235. $Response = new Response();
  236. $Controller = new Controller($Request, $Response);
  237. $data = ['user' => 'fake', 'list' => ['item1', 'item2']];
  238. $Controller->set([
  239. 'data' => $data,
  240. '_serialize' => 'data',
  241. '_jsonp' => true
  242. ]);
  243. $Controller->viewClass = 'Json';
  244. $View = $Controller->createView();
  245. $output = $View->render(false);
  246. $this->assertSame(json_encode($data), $output);
  247. $this->assertSame('application/json', $Response->type());
  248. $View->request->query = ['callback' => 'jfunc'];
  249. $output = $View->render(false);
  250. $expected = 'jfunc(' . json_encode($data) . ')';
  251. $this->assertSame($expected, $output);
  252. $this->assertSame('application/javascript', $Response->type());
  253. $View->request->query = ['jsonCallback' => 'jfunc'];
  254. $View->viewVars['_jsonp'] = 'jsonCallback';
  255. $output = $View->render(false);
  256. $expected = 'jfunc(' . json_encode($data) . ')';
  257. $this->assertSame($expected, $output);
  258. }
  259. /**
  260. * Test render with a View file specified.
  261. *
  262. * @return void
  263. */
  264. public function testRenderWithView()
  265. {
  266. $Request = new Request();
  267. $Response = new Response();
  268. $Controller = new Controller($Request, $Response);
  269. $Controller->name = 'Posts';
  270. $data = [
  271. 'User' => [
  272. 'username' => 'fake'
  273. ],
  274. 'Item' => [
  275. ['name' => 'item1'],
  276. ['name' => 'item2']
  277. ]
  278. ];
  279. $Controller->set('user', $data);
  280. $Controller->viewClass = 'Json';
  281. $View = $Controller->createView();
  282. $View->viewPath = $Controller->name;
  283. $output = $View->render('index');
  284. $expected = json_encode(['user' => 'fake', 'list' => ['item1', 'item2'], 'paging' => null]);
  285. $this->assertSame($expected, $output);
  286. $this->assertSame('application/json', $Response->type());
  287. }
  288. }