Mercurial > hg > Members > shoshi > webvirt
comparison cake/tests/cases/libs/view/helpers/js.test.php @ 0:261e66bd5a0c
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 Jul 2011 21:08:31 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:261e66bd5a0c |
---|---|
1 <?php | |
2 /** | |
3 * JsHelper Test Case | |
4 * | |
5 * TestCase for the JsHelper | |
6 * | |
7 * PHP versions 4 and 5 | |
8 * | |
9 * CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing> | |
10 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
11 * | |
12 * Licensed under The Open Group Test Suite License | |
13 * Redistributions of files must retain the above copyright notice. | |
14 * | |
15 * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
16 * @link http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests | |
17 * @package cake | |
18 * @subpackage cake.tests.cases.libs.view.helpers | |
19 * @since CakePHP(tm) v 1.3 | |
20 * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License | |
21 */ | |
22 App::import('Helper', array('Js', 'Html', 'Form')); | |
23 App::import('Core', array('View', 'ClassRegistry')); | |
24 | |
25 Mock::generate('JsBaseEngineHelper', 'TestJsEngineHelper', array('methodOne')); | |
26 Mock::generate('View', 'JsHelperMockView'); | |
27 | |
28 class OptionEngineHelper extends JsBaseEngineHelper { | |
29 var $_optionMap = array( | |
30 'request' => array( | |
31 'complete' => 'success', | |
32 'request' => 'beforeSend', | |
33 'type' => 'dataType' | |
34 ) | |
35 ); | |
36 | |
37 /** | |
38 * test method for testing option mapping | |
39 * | |
40 * @return array | |
41 */ | |
42 function testMap($options = array()) { | |
43 return $this->_mapOptions('request', $options); | |
44 } | |
45 /** | |
46 * test method for option parsing | |
47 * | |
48 * @return void | |
49 */ | |
50 function testParseOptions($options, $safe = array()) { | |
51 return $this->_parseOptions($options, $safe); | |
52 } | |
53 } | |
54 | |
55 /** | |
56 * JsHelper TestCase. | |
57 * | |
58 * @package cake | |
59 * @subpackage cake.tests.cases.libs.view.helpers | |
60 */ | |
61 class JsHelperTestCase extends CakeTestCase { | |
62 /** | |
63 * Regexp for CDATA start block | |
64 * | |
65 * @var string | |
66 */ | |
67 var $cDataStart = 'preg:/^\/\/<!\[CDATA\[[\n\r]*/'; | |
68 | |
69 /** | |
70 * Regexp for CDATA end block | |
71 * | |
72 * @var string | |
73 */ | |
74 var $cDataEnd = 'preg:/[^\]]*\]\]\>[\s\r\n]*/'; | |
75 | |
76 /** | |
77 * startTest method | |
78 * | |
79 * @access public | |
80 * @return void | |
81 */ | |
82 function startTest() { | |
83 $this->_asset = Configure::read('Asset.timestamp'); | |
84 Configure::write('Asset.timestamp', false); | |
85 | |
86 $this->Js =& new JsHelper('JsBase'); | |
87 $this->Js->Html =& new HtmlHelper(); | |
88 $this->Js->Form =& new FormHelper(); | |
89 $this->Js->Form->Html =& new HtmlHelper(); | |
90 $this->Js->JsBaseEngine =& new JsBaseEngineHelper(); | |
91 | |
92 $view =& new JsHelperMockView(); | |
93 ClassRegistry::addObject('view', $view); | |
94 } | |
95 | |
96 /** | |
97 * endTest method | |
98 * | |
99 * @access public | |
100 * @return void | |
101 */ | |
102 function endTest() { | |
103 Configure::write('Asset.timestamp', $this->_asset); | |
104 ClassRegistry::removeObject('view'); | |
105 unset($this->Js); | |
106 } | |
107 | |
108 /** | |
109 * Switches $this->Js to a mocked engine. | |
110 * | |
111 * @return void | |
112 */ | |
113 function _useMock() { | |
114 $this->Js =& new JsHelper(array('TestJs')); | |
115 $this->Js->TestJsEngine =& new TestJsEngineHelper($this); | |
116 $this->Js->Html =& new HtmlHelper(); | |
117 $this->Js->Form =& new FormHelper(); | |
118 $this->Js->Form->Html =& new HtmlHelper(); | |
119 } | |
120 | |
121 /** | |
122 * test object construction | |
123 * | |
124 * @return void | |
125 */ | |
126 function testConstruction() { | |
127 $js =& new JsHelper(); | |
128 $this->assertEqual($js->helpers, array('Html', 'Form', 'JqueryEngine')); | |
129 | |
130 $js =& new JsHelper(array('mootools')); | |
131 $this->assertEqual($js->helpers, array('Html', 'Form', 'mootoolsEngine')); | |
132 | |
133 $js =& new JsHelper('prototype'); | |
134 $this->assertEqual($js->helpers, array('Html', 'Form', 'prototypeEngine')); | |
135 | |
136 $js =& new JsHelper('MyPlugin.Dojo'); | |
137 $this->assertEqual($js->helpers, array('Html', 'Form', 'MyPlugin.DojoEngine')); | |
138 } | |
139 | |
140 /** | |
141 * test that methods dispatch internally and to the engine class | |
142 * | |
143 * @return void | |
144 */ | |
145 function testMethodDispatching() { | |
146 $this->_useMock(); | |
147 $this->Js->TestJsEngine->expectOnce('dispatchMethod', array(new PatternExpectation('/methodOne/i'), array())); | |
148 | |
149 $this->Js->methodOne(); | |
150 | |
151 $this->Js->TestEngine =& new StdClass(); | |
152 $this->expectError(); | |
153 $this->Js->someMethodThatSurelyDoesntExist(); | |
154 } | |
155 | |
156 /** | |
157 * Test that method dispatching respects buffer parameters and bufferedMethods Lists. | |
158 * | |
159 * @return void | |
160 */ | |
161 function testMethodDispatchWithBuffering() { | |
162 $this->_useMock(); | |
163 | |
164 $this->Js->TestJsEngine->bufferedMethods = array('event', 'sortables'); | |
165 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'This is an event call', array('event', '*')); | |
166 | |
167 $this->Js->event('click', 'foo'); | |
168 $result = $this->Js->getBuffer(); | |
169 $this->assertEqual(count($result), 1); | |
170 $this->assertEqual($result[0], 'This is an event call'); | |
171 | |
172 $result = $this->Js->event('click', 'foo', array('buffer' => false)); | |
173 $buffer = $this->Js->getBuffer(); | |
174 $this->assertTrue(empty($buffer)); | |
175 $this->assertEqual($result, 'This is an event call'); | |
176 | |
177 $result = $this->Js->event('click', 'foo', false); | |
178 $buffer = $this->Js->getBuffer(); | |
179 $this->assertTrue(empty($buffer)); | |
180 $this->assertEqual($result, 'This is an event call'); | |
181 | |
182 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'I am not buffered.', array('effect', '*')); | |
183 | |
184 $result = $this->Js->effect('slideIn'); | |
185 $buffer = $this->Js->getBuffer(); | |
186 $this->assertTrue(empty($buffer)); | |
187 $this->assertEqual($result, 'I am not buffered.'); | |
188 | |
189 $result = $this->Js->effect('slideIn', true); | |
190 $buffer = $this->Js->getBuffer(); | |
191 $this->assertNull($result); | |
192 $this->assertEqual(count($buffer), 1); | |
193 $this->assertEqual($buffer[0], 'I am not buffered.'); | |
194 | |
195 $result = $this->Js->effect('slideIn', array('speed' => 'slow'), true); | |
196 $buffer = $this->Js->getBuffer(); | |
197 $this->assertNull($result); | |
198 $this->assertEqual(count($buffer), 1); | |
199 $this->assertEqual($buffer[0], 'I am not buffered.'); | |
200 | |
201 $result = $this->Js->effect('slideIn', array('speed' => 'slow', 'buffer' => true)); | |
202 $buffer = $this->Js->getBuffer(); | |
203 $this->assertNull($result); | |
204 $this->assertEqual(count($buffer), 1); | |
205 $this->assertEqual($buffer[0], 'I am not buffered.'); | |
206 } | |
207 | |
208 /** | |
209 * test that writeScripts generates scripts inline. | |
210 * | |
211 * @return void | |
212 */ | |
213 function testWriteScriptsNoFile() { | |
214 $this->_useMock(); | |
215 $this->Js->buffer('one = 1;'); | |
216 $this->Js->buffer('two = 2;'); | |
217 $result = $this->Js->writeBuffer(array('onDomReady' => false, 'cache' => false, 'clear' => false)); | |
218 $expected = array( | |
219 'script' => array('type' => 'text/javascript'), | |
220 $this->cDataStart, | |
221 "one = 1;\ntwo = 2;", | |
222 $this->cDataEnd, | |
223 '/script', | |
224 ); | |
225 $this->assertTags($result, $expected, true); | |
226 | |
227 $this->Js->TestJsEngine->expectAtLeastOnce('domReady'); | |
228 $result = $this->Js->writeBuffer(array('onDomReady' => true, 'cache' => false, 'clear' => false)); | |
229 | |
230 ClassRegistry::removeObject('view'); | |
231 $view =& new JsHelperMockView(); | |
232 ClassRegistry::addObject('view', $view); | |
233 | |
234 $view->expectCallCount('addScript', 1); | |
235 $view->expectAt(0, 'addScript', array(new PatternExpectation('/one\s\=\s1;\ntwo\s\=\s2;/'))); | |
236 $result = $this->Js->writeBuffer(array('onDomReady' => false, 'inline' => false, 'cache' => false)); | |
237 } | |
238 | |
239 /** | |
240 * test that writing the buffer with inline = false includes a script tag. | |
241 * | |
242 * @return void | |
243 */ | |
244 function testWriteBufferNotInline() { | |
245 $this->Js->set('foo', 1); | |
246 | |
247 $view =& new JsHelperMockView(); | |
248 ClassRegistry::removeObject('view'); | |
249 ClassRegistry::addObject('view', $view); | |
250 $view->expectCallCount('addScript', 1); | |
251 | |
252 $pattern = new PatternExpectation('#<script type="text\/javascript">window.app \= \{"foo"\:1\}\;<\/script>#'); | |
253 $view->expectAt(0, 'addScript', array($pattern)); | |
254 | |
255 $result = $this->Js->writeBuffer(array('onDomReady' => false, 'inline' => false, 'safe' => false)); | |
256 } | |
257 | |
258 /** | |
259 * test that writeBuffer() sets domReady = false when the request is done by XHR. | |
260 * Including a domReady() when in XHR can cause issues as events aren't triggered by some libraries | |
261 * | |
262 * @return void | |
263 */ | |
264 function testWriteBufferAndXhr() { | |
265 $this->_useMock(); | |
266 $this->Js->params['isAjax'] = true; | |
267 $this->Js->buffer('alert("test");'); | |
268 $this->Js->TestJsEngine->expectCallCount('dispatchMethod', 0); | |
269 $result = $this->Js->writeBuffer(); | |
270 } | |
271 | |
272 /** | |
273 * test that writeScripts makes files, and puts the events into them. | |
274 * | |
275 * @return void | |
276 */ | |
277 function testWriteScriptsInFile() { | |
278 if ($this->skipIf(!is_writable(JS), 'webroot/js is not Writable, script caching test has been skipped')) { | |
279 return; | |
280 } | |
281 $this->Js->JsBaseEngine = new TestJsEngineHelper(); | |
282 $this->Js->buffer('one = 1;'); | |
283 $this->Js->buffer('two = 2;'); | |
284 $result = $this->Js->writeBuffer(array('onDomReady' => false, 'cache' => true)); | |
285 $expected = array( | |
286 'script' => array('type' => 'text/javascript', 'src' => 'preg:/(.)*\.js/'), | |
287 ); | |
288 $this->assertTags($result, $expected); | |
289 preg_match('/src="(.*\.js)"/', $result, $filename); | |
290 $this->assertTrue(file_exists(WWW_ROOT . $filename[1])); | |
291 $contents = file_get_contents(WWW_ROOT . $filename[1]); | |
292 $this->assertPattern('/one\s=\s1;\ntwo\s=\s2;/', $contents); | |
293 | |
294 @unlink(WWW_ROOT . $filename[1]); | |
295 } | |
296 | |
297 /** | |
298 * test link() | |
299 * | |
300 * @return void | |
301 */ | |
302 function testLinkWithMock() { | |
303 $this->_useMock(); | |
304 $options = array('update' => '#content'); | |
305 | |
306 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'ajax code', array('request', '*')); | |
307 $this->Js->TestJsEngine->expectAt(0, 'dispatchMethod', array('get', new AnythingExpectation())); | |
308 $this->Js->TestJsEngine->expectAt(1, 'dispatchMethod', array( | |
309 'request', array('/posts/view/1', $options) | |
310 )); | |
311 $this->Js->TestJsEngine->expectAt(2, 'dispatchMethod', array( | |
312 'event', array('click', 'ajax code', $options + array('buffer' => null)) | |
313 )); | |
314 | |
315 $result = $this->Js->link('test link', '/posts/view/1', $options); | |
316 $expected = array( | |
317 'a' => array('id' => 'preg:/link-\d+/', 'href' => '/posts/view/1'), | |
318 'test link', | |
319 '/a' | |
320 ); | |
321 $this->assertTags($result, $expected); | |
322 | |
323 $options = array( | |
324 'confirm' => 'Are you sure?', | |
325 'update' => '#content', | |
326 'class' => 'my-class', | |
327 'id' => 'custom-id', | |
328 'escape' => false | |
329 ); | |
330 $this->Js->TestJsEngine->expectAt(0, 'confirm', array($options['confirm'])); | |
331 $this->Js->TestJsEngine->expectAt(1, 'request', array('/posts/view/1', '*')); | |
332 $code = <<<CODE | |
333 var _confirm = confirm("Are you sure?"); | |
334 if (!_confirm) { | |
335 return false; | |
336 } | |
337 CODE; | |
338 $this->Js->TestJsEngine->expectAt(1, 'event', array('click', $code)); | |
339 $result = $this->Js->link('test link »', '/posts/view/1', $options); | |
340 $expected = array( | |
341 'a' => array('id' => $options['id'], 'class' => $options['class'], 'href' => '/posts/view/1'), | |
342 'test link »', | |
343 '/a' | |
344 ); | |
345 $this->assertTags($result, $expected); | |
346 | |
347 $options = array('id' => 'something', 'htmlAttributes' => array('arbitrary' => 'value', 'batman' => 'robin')); | |
348 $result = $this->Js->link('test link', '/posts/view/1', $options); | |
349 $expected = array( | |
350 'a' => array('id' => $options['id'], 'href' => '/posts/view/1', 'arbitrary' => 'value', | |
351 'batman' => 'robin'), | |
352 'test link', | |
353 '/a' | |
354 ); | |
355 $this->assertTags($result, $expected); | |
356 } | |
357 | |
358 /** | |
359 * test that link() and no buffering returns an <a> and <script> tags. | |
360 * | |
361 * @return void | |
362 */ | |
363 function testLinkWithNoBuffering() { | |
364 $this->_useMock(); | |
365 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'ajax code', array( | |
366 'request', array('/posts/view/1', array('update' => '#content')) | |
367 )); | |
368 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', '-event handler-', array('event', '*')); | |
369 | |
370 $options = array('update' => '#content', 'buffer' => false); | |
371 $result = $this->Js->link('test link', '/posts/view/1', $options); | |
372 $expected = array( | |
373 'a' => array('id' => 'preg:/link-\d+/', 'href' => '/posts/view/1'), | |
374 'test link', | |
375 '/a', | |
376 'script' => array('type' => 'text/javascript'), | |
377 $this->cDataStart, | |
378 '-event handler-', | |
379 $this->cDataEnd, | |
380 '/script' | |
381 ); | |
382 $this->assertTags($result, $expected); | |
383 | |
384 $options = array('update' => '#content', 'buffer' => false, 'safe' => false); | |
385 $result = $this->Js->link('test link', '/posts/view/1', $options); | |
386 $expected = array( | |
387 'a' => array('id' => 'preg:/link-\d+/', 'href' => '/posts/view/1'), | |
388 'test link', | |
389 '/a', | |
390 'script' => array('type' => 'text/javascript'), | |
391 '-event handler-', | |
392 '/script' | |
393 ); | |
394 $this->assertTags($result, $expected); | |
395 } | |
396 | |
397 /** | |
398 * test submit() with a Mock to check Engine method calls | |
399 * | |
400 * @return void | |
401 */ | |
402 function testSubmitWithMock() { | |
403 $this->_useMock(); | |
404 | |
405 $options = array('update' => '#content', 'id' => 'test-submit', 'style' => 'margin: 0'); | |
406 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'serialize-code', array('serializeform', '*')); | |
407 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'serialize-code', array('serializeForm', '*')); | |
408 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'ajax-code', array('request', '*')); | |
409 | |
410 $this->Js->TestJsEngine->expectAt(0, 'dispatchMethod', array('get', '*')); | |
411 $this->Js->TestJsEngine->expectAt(1, 'dispatchMethod', array(new PatternExpectation('/serializeForm/i'), '*')); | |
412 $this->Js->TestJsEngine->expectAt(2, 'dispatchMethod', array('request', '*')); | |
413 | |
414 $params = array( | |
415 'update' => $options['update'], 'data' => 'serialize-code', | |
416 'method' => 'post', 'dataExpression' => true, 'buffer' => null | |
417 ); | |
418 $this->Js->TestJsEngine->expectAt(3, 'dispatchMethod', array( | |
419 'event', array('click', "ajax-code", $params) | |
420 )); | |
421 | |
422 $result = $this->Js->submit('Save', $options); | |
423 $expected = array( | |
424 'div' => array('class' => 'submit'), | |
425 'input' => array('type' => 'submit', 'id' => $options['id'], 'value' => 'Save', 'style' => 'margin: 0'), | |
426 '/div' | |
427 ); | |
428 $this->assertTags($result, $expected); | |
429 | |
430 | |
431 $this->Js->TestJsEngine->expectAt(4, 'dispatchMethod', array('get', '*')); | |
432 $this->Js->TestJsEngine->expectAt(5, 'dispatchMethod', array(new PatternExpectation('/serializeForm/i'), '*')); | |
433 $requestParams = array( | |
434 '/custom/url', array( | |
435 'update' => '#content', | |
436 'data' => 'serialize-code', | |
437 'method' => 'post', | |
438 'dataExpression' => true | |
439 ) | |
440 ); | |
441 $this->Js->TestJsEngine->expectAt(6, 'dispatchMethod', array('request', $requestParams)); | |
442 | |
443 $params = array( | |
444 'update' => '#content', 'data' => 'serialize-code', | |
445 'method' => 'post', 'dataExpression' => true, 'buffer' => null | |
446 ); | |
447 $this->Js->TestJsEngine->expectAt(7, 'dispatchMethod', array( | |
448 'event', array('click', "ajax-code", $params) | |
449 )); | |
450 | |
451 $options = array('update' => '#content', 'id' => 'test-submit', 'url' => '/custom/url'); | |
452 $result = $this->Js->submit('Save', $options); | |
453 $expected = array( | |
454 'div' => array('class' => 'submit'), | |
455 'input' => array('type' => 'submit', 'id' => $options['id'], 'value' => 'Save'), | |
456 '/div' | |
457 ); | |
458 $this->assertTags($result, $expected); | |
459 } | |
460 | |
461 /** | |
462 * test that no buffer works with submit() and that parameters are leaking into the script tag. | |
463 * | |
464 * @return void | |
465 */ | |
466 function testSubmitWithNoBuffer() { | |
467 $this->_useMock(); | |
468 $options = array('update' => '#content', 'id' => 'test-submit', 'buffer' => false, 'safe' => false); | |
469 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'serialize-code', array('serializeform', '*')); | |
470 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'serialize-code', array('serializeForm', '*')); | |
471 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'ajax-code', array('request', '*')); | |
472 $this->Js->TestJsEngine->setReturnValue('dispatchMethod', 'event-handler', array('event', '*')); | |
473 | |
474 $this->Js->TestJsEngine->expectAt(0, 'dispatchMethod', array('get', '*')); | |
475 $this->Js->TestJsEngine->expectAt(1, 'dispatchMethod', array(new PatternExpectation('/serializeForm/i'), '*')); | |
476 $this->Js->TestJsEngine->expectAt(2, 'dispatchMethod', array('request', array( | |
477 '', array('update' => $options['update'], 'data' => 'serialize-code', 'method' => 'post', 'dataExpression' => true) | |
478 ))); | |
479 | |
480 $params = array( | |
481 'update' => $options['update'], 'data' => 'serialize-code', | |
482 'method' => 'post', 'dataExpression' => true, 'buffer' => false | |
483 ); | |
484 $this->Js->TestJsEngine->expectAt(3, 'dispatchMethod', array( | |
485 'event', array('click', "ajax-code", $params) | |
486 )); | |
487 | |
488 $result = $this->Js->submit('Save', $options); | |
489 $expected = array( | |
490 'div' => array('class' => 'submit'), | |
491 'input' => array('type' => 'submit', 'id' => $options['id'], 'value' => 'Save'), | |
492 '/div', | |
493 'script' => array('type' => 'text/javascript'), | |
494 'event-handler', | |
495 '/script' | |
496 ); | |
497 $this->assertTags($result, $expected); | |
498 } | |
499 | |
500 /** | |
501 * Test that Object::Object() is not breaking json output in JsHelper | |
502 * | |
503 * @return void | |
504 */ | |
505 function testObjectPassThrough() { | |
506 $result = $this->Js->object(array('one' => 'first', 'two' => 'second')); | |
507 $expected = '{"one":"first","two":"second"}'; | |
508 $this->assertEqual($result, $expected); | |
509 } | |
510 | |
511 /** | |
512 * Test that inherited Helper::value() is overwritten in JsHelper::value() | |
513 * and calls JsBaseEngineHelper::value(). | |
514 * | |
515 * @return void | |
516 */ | |
517 function testValuePassThrough() { | |
518 $result = $this->Js->value('string "quote"', true); | |
519 $expected = '"string \"quote\""'; | |
520 $this->assertEqual($result, $expected); | |
521 } | |
522 | |
523 /** | |
524 * test set()'ing variables to the Javascript buffer and controlling the output var name. | |
525 * | |
526 * @return void | |
527 */ | |
528 function testSet() { | |
529 $this->Js->set('loggedIn', true); | |
530 $this->Js->set(array('height' => 'tall', 'color' => 'purple')); | |
531 $result = $this->Js->getBuffer(); | |
532 $expected = 'window.app = {"loggedIn":true,"height":"tall","color":"purple"};'; | |
533 $this->assertEqual($result[0], $expected); | |
534 | |
535 $this->Js->set('loggedIn', true); | |
536 $this->Js->set(array('height' => 'tall', 'color' => 'purple')); | |
537 $this->Js->setVariable = 'WICKED'; | |
538 $result = $this->Js->getBuffer(); | |
539 $expected = 'window.WICKED = {"loggedIn":true,"height":"tall","color":"purple"};'; | |
540 $this->assertEqual($result[0], $expected); | |
541 | |
542 $this->Js->set('loggedIn', true); | |
543 $this->Js->set(array('height' => 'tall', 'color' => 'purple')); | |
544 $this->Js->setVariable = 'Application.variables'; | |
545 $result = $this->Js->getBuffer(); | |
546 $expected = 'Application.variables = {"loggedIn":true,"height":"tall","color":"purple"};'; | |
547 $this->assertEqual($result[0], $expected); | |
548 } | |
549 | |
550 /** | |
551 * test that vars set with Js->set() go to the top of the buffered scripts list. | |
552 * | |
553 * @return void | |
554 */ | |
555 function testSetVarsAtTopOfBufferedScripts() { | |
556 $this->Js->set(array('height' => 'tall', 'color' => 'purple')); | |
557 $this->Js->alert('hey you!', array('buffer' => true)); | |
558 $this->Js->confirm('Are you sure?', array('buffer' => true)); | |
559 $result = $this->Js->getBuffer(false); | |
560 | |
561 $expected = 'window.app = {"height":"tall","color":"purple"};'; | |
562 $this->assertEqual($result[0], $expected); | |
563 $this->assertEqual($result[1], 'alert("hey you!");'); | |
564 $this->assertEqual($result[2], 'confirm("Are you sure?");'); | |
565 } | |
566 } | |
567 | |
568 /** | |
569 * JsBaseEngine Class Test case | |
570 * | |
571 * @package cake.tests.view.helpers | |
572 */ | |
573 class JsBaseEngineTestCase extends CakeTestCase { | |
574 /** | |
575 * startTest method | |
576 * | |
577 * @access public | |
578 * @return void | |
579 */ | |
580 function startTest() { | |
581 $this->JsEngine = new JsBaseEngineHelper(); | |
582 } | |
583 /** | |
584 * endTest method | |
585 * | |
586 * @access public | |
587 * @return void | |
588 */ | |
589 function endTest() { | |
590 ClassRegistry::removeObject('view'); | |
591 unset($this->JsEngine); | |
592 } | |
593 | |
594 /** | |
595 * test escape string skills | |
596 * | |
597 * @return void | |
598 */ | |
599 function testEscaping() { | |
600 $result = $this->JsEngine->escape(''); | |
601 $expected = ''; | |
602 $this->assertEqual($result, $expected); | |
603 | |
604 $result = $this->JsEngine->escape('CakePHP' . "\n" . 'Rapid Development Framework'); | |
605 $expected = 'CakePHP\\nRapid Development Framework'; | |
606 $this->assertEqual($result, $expected); | |
607 | |
608 $result = $this->JsEngine->escape('CakePHP' . "\r\n" . 'Rapid Development Framework' . "\r" . 'For PHP'); | |
609 $expected = 'CakePHP\\r\\nRapid Development Framework\\rFor PHP'; | |
610 $this->assertEqual($result, $expected); | |
611 | |
612 $result = $this->JsEngine->escape('CakePHP: "Rapid Development Framework"'); | |
613 $expected = 'CakePHP: \\"Rapid Development Framework\\"'; | |
614 $this->assertEqual($result, $expected); | |
615 | |
616 $result = $this->JsEngine->escape("CakePHP: 'Rapid Development Framework'"); | |
617 $expected = "CakePHP: 'Rapid Development Framework'"; | |
618 $this->assertEqual($result, $expected); | |
619 | |
620 $result = $this->JsEngine->escape('my \\"string\\"'); | |
621 $expected = 'my \\\\\\"string\\\\\\"'; | |
622 $this->assertEqual($result, $expected); | |
623 } | |
624 | |
625 /** | |
626 * test prompt() creation | |
627 * | |
628 * @return void | |
629 */ | |
630 function testPrompt() { | |
631 $result = $this->JsEngine->prompt('Hey, hey you', 'hi!'); | |
632 $expected = 'prompt("Hey, hey you", "hi!");'; | |
633 $this->assertEqual($result, $expected); | |
634 | |
635 $result = $this->JsEngine->prompt('"Hey"', '"hi"'); | |
636 $expected = 'prompt("\"Hey\"", "\"hi\"");'; | |
637 $this->assertEqual($result, $expected); | |
638 } | |
639 | |
640 /** | |
641 * test alert generation | |
642 * | |
643 * @return void | |
644 */ | |
645 function testAlert() { | |
646 $result = $this->JsEngine->alert('Hey there'); | |
647 $expected = 'alert("Hey there");'; | |
648 $this->assertEqual($result, $expected); | |
649 | |
650 $result = $this->JsEngine->alert('"Hey"'); | |
651 $expected = 'alert("\"Hey\"");'; | |
652 $this->assertEqual($result, $expected); | |
653 } | |
654 | |
655 /** | |
656 * test confirm generation | |
657 * | |
658 * @return void | |
659 */ | |
660 function testConfirm() { | |
661 $result = $this->JsEngine->confirm('Are you sure?'); | |
662 $expected = 'confirm("Are you sure?");'; | |
663 $this->assertEqual($result, $expected); | |
664 | |
665 $result = $this->JsEngine->confirm('"Are you sure?"'); | |
666 $expected = 'confirm("\"Are you sure?\"");'; | |
667 $this->assertEqual($result, $expected); | |
668 } | |
669 | |
670 /** | |
671 * test Redirect | |
672 * | |
673 * @return void | |
674 */ | |
675 function testRedirect() { | |
676 $result = $this->JsEngine->redirect(array('controller' => 'posts', 'action' => 'view', 1)); | |
677 $expected = 'window.location = "/posts/view/1";'; | |
678 $this->assertEqual($result, $expected); | |
679 } | |
680 | |
681 /** | |
682 * testObject encoding with non-native methods. | |
683 * | |
684 * @return void | |
685 */ | |
686 function testObject() { | |
687 $this->JsEngine->useNative = false; | |
688 | |
689 $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8)); | |
690 $result = $this->JsEngine->object($object); | |
691 $expected = '{"title":"New thing","indexes":[5,6,7,8]}'; | |
692 $this->assertEqual($result, $expected); | |
693 | |
694 $result = $this->JsEngine->object(array('default' => 0)); | |
695 $expected = '{"default":0}'; | |
696 $this->assertEqual($result, $expected); | |
697 | |
698 $result = $this->JsEngine->object(array( | |
699 '2007' => array( | |
700 'Spring' => array( | |
701 '1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky') | |
702 ), | |
703 'Fall' => array( | |
704 '1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky') | |
705 ) | |
706 ), | |
707 '2006' => array( | |
708 'Spring' => array( | |
709 '1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky') | |
710 ), | |
711 'Fall' => array( | |
712 '1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky') | |
713 ) | |
714 ) | |
715 )); | |
716 $expected = '{"2007":{"Spring":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}},"Fall":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}}},"2006":{"Spring":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}},"Fall":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}}}}'; | |
717 $this->assertEqual($result, $expected); | |
718 | |
719 foreach (array('true' => true, 'false' => false, 'null' => null) as $expected => $data) { | |
720 $result = $this->JsEngine->object($data); | |
721 $this->assertEqual($result, $expected); | |
722 } | |
723 | |
724 $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8), 'object' => array('inner' => array('value' => 1))); | |
725 $result = $this->JsEngine->object($object, array('prefix' => 'PREFIX', 'postfix' => 'POSTFIX')); | |
726 $this->assertPattern('/^PREFIX/', $result); | |
727 $this->assertPattern('/POSTFIX$/', $result); | |
728 $this->assertNoPattern('/.PREFIX./', $result); | |
729 $this->assertNoPattern('/.POSTFIX./', $result); | |
730 } | |
731 | |
732 /** | |
733 * test compatibility of JsBaseEngineHelper::object() vs. json_encode() | |
734 * | |
735 * @return void | |
736 */ | |
737 function testObjectAgainstJsonEncode() { | |
738 $skip = $this->skipIf(!function_exists('json_encode'), 'json_encode() not found, comparison tests skipped. %s'); | |
739 if ($skip) { | |
740 return; | |
741 } | |
742 $this->JsEngine->useNative = false; | |
743 $data = array(); | |
744 $data['mystring'] = "simple string"; | |
745 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
746 | |
747 $data['mystring'] = "strïng with spécial chârs"; | |
748 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
749 | |
750 $data['mystring'] = "a two lines\nstring"; | |
751 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
752 | |
753 $data['mystring'] = "a \t tabbed \t string"; | |
754 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
755 | |
756 $data['mystring'] = "a \"double-quoted\" string"; | |
757 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
758 | |
759 $data['mystring'] = 'a \\"double-quoted\\" string'; | |
760 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
761 | |
762 unset($data['mystring']); | |
763 $data[3] = array(1, 2, 3); | |
764 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
765 | |
766 unset($data[3]); | |
767 $data = array('mystring' => null, 'bool' => false, 'array' => array(1, 44, 66)); | |
768 $this->assertEqual(json_encode($data), $this->JsEngine->object($data)); | |
769 } | |
770 | |
771 /** | |
772 * test that JSON made with JsBaseEngineHelper::object() against json_decode() | |
773 * | |
774 * @return void | |
775 */ | |
776 function testObjectAgainstJsonDecode() { | |
777 $skip = $this->skipIf(!function_exists('json_encode'), 'json_encode() not found, comparison tests skipped. %s'); | |
778 if ($skip) { | |
779 return; | |
780 } | |
781 $this->JsEngine->useNative = false; | |
782 | |
783 $data = array("simple string"); | |
784 $result = $this->JsEngine->object($data); | |
785 $this->assertEqual(json_decode($result), $data); | |
786 | |
787 $data = array('my "string"'); | |
788 $result = $this->JsEngine->object($data); | |
789 $this->assertEqual(json_decode($result), $data); | |
790 | |
791 $data = array('my \\"string\\"'); | |
792 $result = $this->JsEngine->object($data); | |
793 $this->assertEqual(json_decode($result), $data); | |
794 } | |
795 | |
796 /** | |
797 * test Mapping of options. | |
798 * | |
799 * @return void | |
800 */ | |
801 function testOptionMapping() { | |
802 $JsEngine = new OptionEngineHelper(); | |
803 $result = $JsEngine->testMap(); | |
804 $this->assertEqual($result, array()); | |
805 | |
806 $result = $JsEngine->testMap(array('foo' => 'bar', 'baz' => 'sho')); | |
807 $this->assertEqual($result, array('foo' => 'bar', 'baz' => 'sho')); | |
808 | |
809 $result = $JsEngine->testMap(array('complete' => 'myFunc', 'type' => 'json', 'update' => '#element')); | |
810 $this->assertEqual($result, array('success' => 'myFunc', 'dataType' => 'json', 'update' => '#element')); | |
811 | |
812 $result = $JsEngine->testMap(array('success' => 'myFunc', 'dataType' => 'json', 'update' => '#element')); | |
813 $this->assertEqual($result, array('success' => 'myFunc', 'dataType' => 'json', 'update' => '#element')); | |
814 } | |
815 | |
816 /** | |
817 * test that option parsing escapes strings and saves what is supposed to be saved. | |
818 * | |
819 * @return void | |
820 */ | |
821 function testOptionParsing() { | |
822 $JsEngine = new OptionEngineHelper(); | |
823 | |
824 $result = $JsEngine->testParseOptions(array('url' => '/posts/view/1', 'key' => 1)); | |
825 $expected = 'key:1, url:"\\/posts\\/view\\/1"'; | |
826 $this->assertEqual($result, $expected); | |
827 | |
828 $result = $JsEngine->testParseOptions(array('url' => '/posts/view/1', 'success' => 'doSuccess'), array('success')); | |
829 $expected = 'success:doSuccess, url:"\\/posts\\/view\\/1"'; | |
830 $this->assertEqual($result, $expected); | |
831 } | |
832 | |
833 } |