Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

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