PageRenderTime 53ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/Cake/Test/Case/View/JsonViewTest.php

https://gitlab.com/grlopez90/servipro
PHP | 407 lines | 252 code | 51 blank | 104 comment | 0 complexity | 3664647a4292432959f724a0da894594 MD5 | raw file
  1. <?php
  2. /**
  3. * JsonViewTest file
  4. *
  5. * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
  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://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
  14. * @package Cake.Test.Case.View
  15. * @since CakePHP(tm) v 2.1.0
  16. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  17. */
  18. App::uses('Controller', 'Controller');
  19. App::uses('CakeRequest', 'Network');
  20. App::uses('CakeResponse', 'Network');
  21. App::uses('JsonView', 'View');
  22. /**
  23. * JsonViewTest
  24. *
  25. * @package Cake.Test.Case.View
  26. */
  27. class JsonViewTest extends CakeTestCase {
  28. /**
  29. * setUp method
  30. *
  31. * @return void
  32. **/
  33. public function setUp() {
  34. parent::setUp();
  35. Configure::write('debug', 0);
  36. }
  37. /**
  38. * Generates testRenderWithoutView data.
  39. *
  40. * Note: array($data, $serialize, expected)
  41. *
  42. * @return void
  43. */
  44. public static function renderWithoutViewProvider() {
  45. return array(
  46. // Test render with a valid string in _serialize.
  47. array(
  48. array('data' => array('user' => 'fake', 'list' => array('item1', 'item2'))),
  49. 'data',
  50. json_encode(array('user' => 'fake', 'list' => array('item1', 'item2')))
  51. ),
  52. // Test render with a string with an invalid key in _serialize.
  53. array(
  54. array('data' => array('user' => 'fake', 'list' => array('item1', 'item2'))),
  55. 'no_key',
  56. json_encode(null)
  57. ),
  58. // Test render with a valid array in _serialize.
  59. array(
  60. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  61. array('no', 'user'),
  62. json_encode(array('no' => 'nope', 'user' => 'fake'))
  63. ),
  64. // Test render with an empty array in _serialize.
  65. array(
  66. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  67. array(),
  68. json_encode(null)
  69. ),
  70. // Test render with a valid array with an invalid key in _serialize.
  71. array(
  72. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  73. array('no', 'user', 'no_key'),
  74. json_encode(array('no' => 'nope', 'user' => 'fake'))
  75. ),
  76. // Test render with a valid array with only an invalid key in _serialize.
  77. array(
  78. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  79. array('no_key'),
  80. json_encode(null)
  81. ),
  82. // Test render with Null in _serialize (unset).
  83. array(
  84. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  85. null,
  86. null
  87. ),
  88. // Test render with False in _serialize.
  89. array(
  90. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  91. false,
  92. json_encode(null)
  93. ),
  94. // Test render with True in _serialize.
  95. array(
  96. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  97. true,
  98. json_encode(null)
  99. ),
  100. // Test render with empty string in _serialize.
  101. array(
  102. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  103. '',
  104. json_encode(null)
  105. ),
  106. // Test render with a valid array in _serialize and alias.
  107. array(
  108. array('original_name' => 'my epic name', 'user' => 'fake', 'list' => array('item1', 'item2')),
  109. array('new_name' => 'original_name', 'user'),
  110. json_encode(array('new_name' => 'my epic name', 'user' => 'fake'))
  111. ),
  112. // Test render with an a valid array in _serialize and alias of a null value.
  113. array(
  114. array('null' => null),
  115. array('null'),
  116. json_encode(array('null' => null))
  117. ),
  118. // Test render with a False value to be serialized.
  119. array(
  120. array('false' => false),
  121. 'false',
  122. json_encode(false)
  123. ),
  124. // Test render with a True value to be serialized.
  125. array(
  126. array('true' => true),
  127. 'true',
  128. json_encode(true)
  129. ),
  130. // Test render with an empty string value to be serialized.
  131. array(
  132. array('empty' => ''),
  133. 'empty',
  134. json_encode('')
  135. ),
  136. // Test render with a zero value to be serialized.
  137. array(
  138. array('zero' => 0),
  139. 'zero',
  140. json_encode(0)
  141. ),
  142. );
  143. }
  144. /**
  145. * Custom error handler for use while testing methods that use json_encode
  146. * @param int $errno
  147. * @param string $errstr
  148. * @param string $errfile
  149. * @param int $errline
  150. * @param array $errcontext
  151. * @return void
  152. * @throws CakeException
  153. **/
  154. public function jsonEncodeErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) {
  155. throw new CakeException($errstr, 0, $errno, $errfile, $errline);
  156. }
  157. /**
  158. * Test render with a valid string in _serialize.
  159. *
  160. * @dataProvider renderWithoutViewProvider
  161. * @return void
  162. */
  163. public function testRenderWithoutView($data, $serialize, $expected) {
  164. $Request = new CakeRequest();
  165. $Response = new CakeResponse();
  166. $Controller = new Controller($Request, $Response);
  167. $Controller->set($data);
  168. $Controller->set('_serialize', $serialize);
  169. $View = new JsonView($Controller);
  170. $output = $View->render(false);
  171. $this->assertSame($expected, $output);
  172. }
  173. /**
  174. * Test render with _jsonOptions setting.
  175. *
  176. * @return void
  177. */
  178. public function testRenderWithoutViewJsonOptions() {
  179. $this->skipIf(!version_compare(PHP_VERSION, '5.3.0', '>='), 'Needs PHP5.3+ for these constants to be tested');
  180. $Request = new CakeRequest();
  181. $Response = new CakeResponse();
  182. $Controller = new Controller($Request, $Response);
  183. // Test render with encode <, >, ', &, and " for RFC4627-compliant to be serialized.
  184. $data = array('rfc4627_escape' => '<tag> \'quote\' "double-quote" &');
  185. $serialize = 'rfc4627_escape';
  186. $expected = json_encode('<tag> \'quote\' "double-quote" &', JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
  187. $Controller->set($data);
  188. $Controller->set('_serialize', $serialize);
  189. $Controller->set('_jsonOptions', JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
  190. $View = new JsonView($Controller);
  191. $output = $View->render(false);
  192. $this->assertSame($expected, $output);
  193. }
  194. /**
  195. * Test that rendering with _serialize does not load helpers.
  196. *
  197. * @return void
  198. */
  199. public function testRenderSerializeNoHelpers() {
  200. $Request = new CakeRequest();
  201. $Response = new CakeResponse();
  202. $Controller = new Controller($Request, $Response);
  203. $Controller->helpers = array('Html');
  204. $Controller->set(array(
  205. 'tags' => array('cakephp', 'framework'),
  206. '_serialize' => 'tags'
  207. ));
  208. $View = new JsonView($Controller);
  209. $View->render();
  210. $this->assertFalse(isset($View->Html), 'No helper loaded.');
  211. }
  212. /**
  213. * testJsonpResponse method
  214. *
  215. * @return void
  216. */
  217. public function testJsonpResponse() {
  218. $Request = new CakeRequest();
  219. $Response = new CakeResponse();
  220. $Controller = new Controller($Request, $Response);
  221. $data = array('user' => 'fake', 'list' => array('item1', 'item2'));
  222. $Controller->set(array(
  223. 'data' => $data,
  224. '_serialize' => 'data',
  225. '_jsonp' => true
  226. ));
  227. $View = new JsonView($Controller);
  228. $output = $View->render(false);
  229. $this->assertSame(json_encode($data), $output);
  230. $this->assertSame('application/json', $Response->type());
  231. $View->request->query = array('callback' => 'jfunc');
  232. $output = $View->render(false);
  233. $expected = 'jfunc(' . json_encode($data) . ')';
  234. $this->assertSame($expected, $output);
  235. $this->assertSame('application/javascript', $Response->type());
  236. $View->request->query = array('jsonCallback' => 'jfunc');
  237. $View->viewVars['_jsonp'] = 'jsonCallback';
  238. $output = $View->render(false);
  239. $expected = 'jfunc(' . json_encode($data) . ')';
  240. $this->assertSame($expected, $output);
  241. }
  242. /**
  243. * Test render with a View file specified.
  244. *
  245. * @return void
  246. */
  247. public function testRenderWithView() {
  248. App::build(array(
  249. 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
  250. ));
  251. $Request = new CakeRequest();
  252. $Response = new CakeResponse();
  253. $Controller = new Controller($Request, $Response);
  254. $Controller->name = $Controller->viewPath = 'Posts';
  255. $data = array(
  256. 'User' => array(
  257. 'username' => 'fake'
  258. ),
  259. 'Item' => array(
  260. array('name' => 'item1'),
  261. array('name' => 'item2')
  262. )
  263. );
  264. $Controller->set('user', $data);
  265. $View = new JsonView($Controller);
  266. $output = $View->render('index');
  267. $expected = json_encode(array('user' => 'fake', 'list' => array('item1', 'item2'), 'paging' => null));
  268. $this->assertSame($expected, $output);
  269. $this->assertSame('application/json', $Response->type());
  270. }
  271. /**
  272. * Test render with a View file specified and named parameters.
  273. *
  274. * @return void
  275. */
  276. public function testRenderWithViewAndNamed() {
  277. App::build(array(
  278. 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
  279. ));
  280. $Request = new CakeRequest(null, false);
  281. $Request->params['named'] = array('page' => 2);
  282. $Response = new CakeResponse();
  283. $Controller = new Controller($Request, $Response);
  284. $Controller->name = $Controller->viewPath = 'Posts';
  285. $data = array(
  286. 'User' => array(
  287. 'username' => 'fake'
  288. ),
  289. 'Item' => array(
  290. array('name' => 'item1'),
  291. array('name' => 'item2')
  292. )
  293. );
  294. $Controller->set('user', $data);
  295. $Controller->helpers = array('Paginator');
  296. $View = new JsonView($Controller);
  297. $output = $View->render('index');
  298. $expected = array('user' => 'fake', 'list' => array('item1', 'item2'), 'paging' => array('page' => 2));
  299. $this->assertSame(json_encode($expected), $output);
  300. $this->assertSame('application/json', $Response->type());
  301. $View->request->query = array('jsonCallback' => 'jfunc');
  302. $Controller->set('_jsonp', 'jsonCallback');
  303. $View = new JsonView($Controller);
  304. $View->helpers = array('Paginator');
  305. $output = $View->render('index');
  306. $expected['paging']['?']['jsonCallback'] = 'jfunc';
  307. $expected = 'jfunc(' . json_encode($expected) . ')';
  308. $this->assertSame($expected, $output);
  309. $this->assertSame('application/javascript', $Response->type());
  310. }
  311. /**
  312. * JsonViewTest::testRenderInvalidJSON()
  313. *
  314. * @return void
  315. */
  316. public function testRenderInvalidJSON() {
  317. $Request = new CakeRequest();
  318. $Response = new CakeResponse();
  319. $Controller = new Controller($Request, $Response);
  320. // non utf-8 stuff
  321. $bar = 'bar';
  322. $bar .= chr(0x97);
  323. $data = array('data' => array('foo' => $bar));
  324. $Controller->set($data);
  325. $Controller->set('_serialize', 'data');
  326. $View = new JsonView($Controller);
  327. // Use a custom error handler
  328. set_error_handler(array($this, 'jsonEncodeErrorHandler'));
  329. try {
  330. $View->render();
  331. restore_error_handler();
  332. $this->fail('Failed asserting that exception of type "CakeException" is thrown.');
  333. } catch (CakeException $e) {
  334. restore_error_handler();
  335. $this->assertRegExp('/UTF-8/', $e->getMessage());
  336. return;
  337. }
  338. }
  339. /**
  340. * JsonViewTest::testRenderJSONBoolFalse()
  341. *
  342. * @return void
  343. */
  344. public function testRenderJSONBoolFalse() {
  345. $Request = new CakeRequest();
  346. $Response = new CakeResponse();
  347. $Controller = new Controller($Request, $Response);
  348. // encoding a false, ensure this doesn't trigger exception
  349. $data = false;
  350. $Controller->set($data);
  351. $Controller->set('_serialize', 'data');
  352. $View = new JsonView($Controller);
  353. $output = $View->render();
  354. $this->assertSame('null', $output);
  355. }
  356. }