JsonViewTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <?php
  2. /**
  3. * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
  4. * Copyright (c) Cake Software Foundation, Inc. (http://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. (http://cakefoundation.org)
  11. * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
  12. * @since CakePHP(tm) v 2.1.0
  13. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\View;
  16. use Cake\Controller\Controller;
  17. use Cake\Core\App;
  18. use Cake\Core\Configure;
  19. use Cake\Network\Request;
  20. use Cake\Network\Response;
  21. use Cake\TestSuite\TestCase;
  22. use Cake\View\JsonView;
  23. /**
  24. * JsonViewTest
  25. *
  26. */
  27. class JsonViewTest extends TestCase {
  28. public function setUp() {
  29. parent::setUp();
  30. Configure::write('debug', 0);
  31. }
  32. /**
  33. * Generates testRenderWithoutView data.
  34. *
  35. * Note: array($data, $serialize, expected)
  36. *
  37. * @return void
  38. */
  39. public static function renderWithoutViewProvider() {
  40. return array(
  41. // Test render with a valid string in _serialize.
  42. array(
  43. array('data' => array('user' => 'fake', 'list' => array('item1', 'item2'))),
  44. 'data',
  45. json_encode(array('user' => 'fake', 'list' => array('item1', 'item2')))
  46. ),
  47. // Test render with a string with an invalid key in _serialize.
  48. array(
  49. array('data' => array('user' => 'fake', 'list' => array('item1', 'item2'))),
  50. 'no_key',
  51. json_encode(null)
  52. ),
  53. // Test render with a valid array in _serialize.
  54. array(
  55. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  56. array('no', 'user'),
  57. json_encode(array('no' => 'nope', 'user' => 'fake'))
  58. ),
  59. // Test render with an empty array in _serialize.
  60. array(
  61. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  62. array(),
  63. json_encode(null)
  64. ),
  65. // Test render with a valid array with an invalid key in _serialize.
  66. array(
  67. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  68. array('no', 'user', 'no_key'),
  69. json_encode(array('no' => 'nope', 'user' => 'fake'))
  70. ),
  71. // Test render with a valid array with only an invalid key in _serialize.
  72. array(
  73. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  74. array('no_key'),
  75. json_encode(null)
  76. ),
  77. // Test render with Null in _serialize (unset).
  78. array(
  79. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  80. null,
  81. null
  82. ),
  83. // Test render with False in _serialize.
  84. array(
  85. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  86. false,
  87. json_encode(null)
  88. ),
  89. // Test render with True in _serialize.
  90. array(
  91. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  92. true,
  93. json_encode(null)
  94. ),
  95. // Test render with empty string in _serialize.
  96. array(
  97. array('no' => 'nope', 'user' => 'fake', 'list' => array('item1', 'item2')),
  98. '',
  99. json_encode(null)
  100. ),
  101. // Test render with a valid array in _serialize and alias.
  102. array(
  103. array('original_name' => 'my epic name', 'user' => 'fake', 'list' => array('item1', 'item2')),
  104. array('new_name' => 'original_name', 'user'),
  105. json_encode(array('new_name' => 'my epic name', 'user' => 'fake'))
  106. ),
  107. // Test render with an a valid array in _serialize and alias of a null value.
  108. array(
  109. array('null' => null),
  110. array('null'),
  111. json_encode(array('null' => null))
  112. ),
  113. // Test render with a False value to be serialized.
  114. array(
  115. array('false' => false),
  116. 'false',
  117. json_encode(false)
  118. ),
  119. // Test render with a True value to be serialized.
  120. array(
  121. array('true' => true),
  122. 'true',
  123. json_encode(true)
  124. ),
  125. // Test render with an empty string value to be serialized.
  126. array(
  127. array('empty' => ''),
  128. 'empty',
  129. json_encode('')
  130. ),
  131. // Test render with a zero value to be serialized.
  132. array(
  133. array('zero' => 0),
  134. 'zero',
  135. json_encode(0)
  136. ),
  137. );
  138. }
  139. /**
  140. * Test render with a valid string in _serialize.
  141. *
  142. * @dataProvider renderWithoutViewProvider
  143. * @return void
  144. */
  145. public function testRenderWithoutView($data, $serialize, $expected) {
  146. $Request = new Request();
  147. $Response = new Response();
  148. $Controller = new Controller($Request, $Response);
  149. $Controller->set($data);
  150. $Controller->set('_serialize', $serialize);
  151. $View = new JsonView($Controller);
  152. $output = $View->render(false);
  153. $this->assertSame($expected, $output);
  154. }
  155. /**
  156. * Test that rendering with _serialize does not load helpers.
  157. *
  158. * @return void
  159. */
  160. public function testRenderSerializeNoHelpers() {
  161. $Request = new Request();
  162. $Response = new Response();
  163. $Controller = new Controller($Request, $Response);
  164. $Controller->helpers = array('Html');
  165. $Controller->set(array(
  166. 'tags' => array('cakephp', 'framework'),
  167. '_serialize' => 'tags'
  168. ));
  169. $View = new JsonView($Controller);
  170. $View->render();
  171. $this->assertFalse(isset($View->Html), 'No helper loaded.');
  172. }
  173. /**
  174. * testJsonpResponse method
  175. *
  176. * @return void
  177. */
  178. public function testJsonpResponse() {
  179. $Request = new Request();
  180. $Response = new Response();
  181. $Controller = new Controller($Request, $Response);
  182. $data = array('user' => 'fake', 'list' => array('item1', 'item2'));
  183. $Controller->set(array(
  184. 'data' => $data,
  185. '_serialize' => 'data',
  186. '_jsonp' => true
  187. ));
  188. $View = new JsonView($Controller);
  189. $output = $View->render(false);
  190. $this->assertSame(json_encode($data), $output);
  191. $this->assertSame('application/json', $Response->type());
  192. $View->request->query = array('callback' => 'jfunc');
  193. $output = $View->render(false);
  194. $expected = 'jfunc(' . json_encode($data) . ')';
  195. $this->assertSame($expected, $output);
  196. $this->assertSame('application/javascript', $Response->type());
  197. $View->request->query = array('jsonCallback' => 'jfunc');
  198. $View->viewVars['_jsonp'] = 'jsonCallback';
  199. $output = $View->render(false);
  200. $expected = 'jfunc(' . json_encode($data) . ')';
  201. $this->assertSame($expected, $output);
  202. }
  203. /**
  204. * Test render with a View file specified.
  205. *
  206. * @return void
  207. */
  208. public function testRenderWithView() {
  209. $Request = new Request();
  210. $Response = new Response();
  211. $Controller = new Controller($Request, $Response);
  212. $Controller->name = $Controller->viewPath = 'Posts';
  213. $data = array(
  214. 'User' => array(
  215. 'username' => 'fake'
  216. ),
  217. 'Item' => array(
  218. array('name' => 'item1'),
  219. array('name' => 'item2')
  220. )
  221. );
  222. $Controller->set('user', $data);
  223. $View = new JsonView($Controller);
  224. $output = $View->render('index');
  225. $expected = json_encode(array('user' => 'fake', 'list' => array('item1', 'item2'), 'paging' => null));
  226. $this->assertSame($expected, $output);
  227. $this->assertSame('application/json', $Response->type());
  228. }
  229. }