pictcode / lib / Cake / Test / Case / View / HelperTest.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (30.262 KB)
1 | 635eef61 | spyder1211 | <?php
|
---|---|---|---|
2 | /**
|
||
3 | * HelperTest 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 1.2.0.4206
|
||
16 | * @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
17 | */
|
||
18 | |||
19 | App::uses('View', 'View'); |
||
20 | App::uses('Helper', 'View'); |
||
21 | App::uses('Model', 'Model'); |
||
22 | App::uses('Router', 'Routing'); |
||
23 | |||
24 | /**
|
||
25 | * HelperTestPost class
|
||
26 | *
|
||
27 | * @package Cake.Test.Case.View
|
||
28 | */
|
||
29 | class HelperTestPost extends Model { |
||
30 | |||
31 | /**
|
||
32 | * useTable property
|
||
33 | *
|
||
34 | * @var bool
|
||
35 | */
|
||
36 | public $useTable = false; |
||
37 | |||
38 | /**
|
||
39 | * schema method
|
||
40 | *
|
||
41 | * @return void
|
||
42 | */
|
||
43 | public function schema($field = false) { |
||
44 | $this->_schema = array( |
||
45 | 'id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
46 | 'title' => array('type' => 'string', 'null' => false, 'default' => '', 'length' => '255'), |
||
47 | 'body' => array('type' => 'string', 'null' => true, 'default' => '', 'length' => ''), |
||
48 | 'number' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
49 | 'date' => array('type' => 'date', 'null' => true, 'default' => '', 'length' => ''), |
||
50 | 'created' => array('type' => 'date', 'null' => true, 'default' => '', 'length' => ''), |
||
51 | 'modified' => array('type' => 'datetime', 'null' => true, 'default' => '', 'length' => null) |
||
52 | ); |
||
53 | return $this->_schema; |
||
54 | } |
||
55 | |||
56 | /**
|
||
57 | * hasAndBelongsToMany property
|
||
58 | *
|
||
59 | * @var array
|
||
60 | */
|
||
61 | public $hasAndBelongsToMany = array('HelperTestTag' => array('with' => 'HelperTestPostsTag')); |
||
62 | } |
||
63 | |||
64 | /**
|
||
65 | * HelperTestComment class
|
||
66 | *
|
||
67 | * @package Cake.Test.Case.View
|
||
68 | */
|
||
69 | class HelperTestComment extends Model { |
||
70 | |||
71 | /**
|
||
72 | * useTable property
|
||
73 | *
|
||
74 | * @var bool
|
||
75 | */
|
||
76 | public $useTable = false; |
||
77 | |||
78 | /**
|
||
79 | * schema method
|
||
80 | *
|
||
81 | * @return void
|
||
82 | */
|
||
83 | public function schema($field = false) { |
||
84 | $this->_schema = array( |
||
85 | 'id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
86 | 'author_id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
87 | 'title' => array('type' => 'string', 'null' => false, 'default' => '', 'length' => '255'), |
||
88 | 'body' => array('type' => 'string', 'null' => true, 'default' => '', 'length' => ''), |
||
89 | 'BigField' => array('type' => 'string', 'null' => true, 'default' => '', 'length' => ''), |
||
90 | 'created' => array('type' => 'date', 'null' => true, 'default' => '', 'length' => ''), |
||
91 | 'modified' => array('type' => 'datetime', 'null' => true, 'default' => '', 'length' => null) |
||
92 | ); |
||
93 | return $this->_schema; |
||
94 | } |
||
95 | |||
96 | } |
||
97 | |||
98 | /**
|
||
99 | * HelperTestTag class
|
||
100 | *
|
||
101 | * @package Cake.Test.Case.View
|
||
102 | */
|
||
103 | class HelperTestTag extends Model { |
||
104 | |||
105 | /**
|
||
106 | * useTable property
|
||
107 | *
|
||
108 | * @var bool
|
||
109 | */
|
||
110 | public $useTable = false; |
||
111 | |||
112 | /**
|
||
113 | * schema method
|
||
114 | *
|
||
115 | * @return void
|
||
116 | */
|
||
117 | public function schema($field = false) { |
||
118 | $this->_schema = array( |
||
119 | 'id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
120 | 'name' => array('type' => 'string', 'null' => false, 'default' => '', 'length' => '255'), |
||
121 | 'created' => array('type' => 'date', 'null' => true, 'default' => '', 'length' => ''), |
||
122 | 'modified' => array('type' => 'datetime', 'null' => true, 'default' => '', 'length' => null) |
||
123 | ); |
||
124 | return $this->_schema; |
||
125 | } |
||
126 | |||
127 | } |
||
128 | |||
129 | /**
|
||
130 | * HelperTestPostsTag class
|
||
131 | *
|
||
132 | * @package Cake.Test.Case.View
|
||
133 | */
|
||
134 | class HelperTestPostsTag extends Model { |
||
135 | |||
136 | /**
|
||
137 | * useTable property
|
||
138 | *
|
||
139 | * @var bool
|
||
140 | */
|
||
141 | public $useTable = false; |
||
142 | |||
143 | /**
|
||
144 | * schema method
|
||
145 | *
|
||
146 | * @return void
|
||
147 | */
|
||
148 | public function schema($field = false) { |
||
149 | $this->_schema = array( |
||
150 | 'helper_test_post_id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
151 | 'helper_test_tag_id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), |
||
152 | ); |
||
153 | return $this->_schema; |
||
154 | } |
||
155 | |||
156 | } |
||
157 | |||
158 | class TestHelper extends Helper { |
||
159 | |||
160 | /**
|
||
161 | * Settings for this helper.
|
||
162 | *
|
||
163 | * @var array
|
||
164 | */
|
||
165 | public $settings = array( |
||
166 | 'key1' => 'val1', |
||
167 | 'key2' => array('key2.1' => 'val2.1', 'key2.2' => 'val2.2') |
||
168 | ); |
||
169 | |||
170 | /**
|
||
171 | * Helpers for this helper.
|
||
172 | *
|
||
173 | * @var array
|
||
174 | */
|
||
175 | public $helpers = array('Html', 'TestPlugin.OtherHelper'); |
||
176 | |||
177 | /**
|
||
178 | * expose a method as public
|
||
179 | *
|
||
180 | * @param string $options
|
||
181 | * @param string $exclude
|
||
182 | * @param string $insertBefore
|
||
183 | * @param string $insertAfter
|
||
184 | * @return void
|
||
185 | */
|
||
186 | public function parseAttributes($options, $exclude = null, $insertBefore = ' ', $insertAfter = null) { |
||
187 | return $this->_parseAttributes($options, $exclude, $insertBefore, $insertAfter); |
||
188 | } |
||
189 | |||
190 | } |
||
191 | |||
192 | /**
|
||
193 | * HelperTest class
|
||
194 | *
|
||
195 | * @package Cake.Test.Case.View
|
||
196 | */
|
||
197 | class HelperTest extends CakeTestCase { |
||
198 | |||
199 | /**
|
||
200 | * setUp method
|
||
201 | *
|
||
202 | * @return void
|
||
203 | */
|
||
204 | public function setUp() { |
||
205 | parent::setUp();
|
||
206 | |||
207 | ClassRegistry::flush(); |
||
208 | Router::reload();
|
||
209 | $null = null; |
||
210 | $this->View = new View($null); |
||
211 | $this->Helper = new Helper($this->View); |
||
212 | $this->Helper->request = new CakeRequest(null, false); |
||
213 | |||
214 | ClassRegistry::addObject('HelperTestPost', new HelperTestPost()); |
||
215 | ClassRegistry::addObject('HelperTestComment', new HelperTestComment()); |
||
216 | ClassRegistry::addObject('HelperTestTag', new HelperTestTag()); |
||
217 | |||
218 | App::build(array( |
||
219 | 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), |
||
220 | )); |
||
221 | } |
||
222 | |||
223 | /**
|
||
224 | * tearDown method
|
||
225 | *
|
||
226 | * @return void
|
||
227 | */
|
||
228 | public function tearDown() { |
||
229 | parent::tearDown();
|
||
230 | Configure::delete('Asset'); |
||
231 | |||
232 | CakePlugin::unload();
|
||
233 | unset($this->Helper, $this->View); |
||
234 | } |
||
235 | |||
236 | /**
|
||
237 | * Provider for setEntity test.
|
||
238 | *
|
||
239 | * @return array
|
||
240 | */
|
||
241 | public static function entityProvider() { |
||
242 | return array( |
||
243 | array(
|
||
244 | 'HelperTestPost.id',
|
||
245 | array('HelperTestPost', 'id'), |
||
246 | 'HelperTestPost',
|
||
247 | 'id'
|
||
248 | ), |
||
249 | array(
|
||
250 | 'HelperTestComment.body',
|
||
251 | array('HelperTestComment', 'body'), |
||
252 | 'HelperTestComment',
|
||
253 | 'body'
|
||
254 | ), |
||
255 | array(
|
||
256 | 'HelperTest.1.Comment.body',
|
||
257 | array('HelperTest', '1', 'Comment', 'body'), |
||
258 | 'Comment',
|
||
259 | 'body'
|
||
260 | ), |
||
261 | array(
|
||
262 | 'HelperTestComment.BigField',
|
||
263 | array('HelperTestComment', 'BigField'), |
||
264 | 'HelperTestComment',
|
||
265 | 'BigField'
|
||
266 | ), |
||
267 | array(
|
||
268 | 'HelperTestComment.min',
|
||
269 | array('HelperTestComment', 'min'), |
||
270 | 'HelperTestComment',
|
||
271 | 'min'
|
||
272 | ) |
||
273 | ); |
||
274 | } |
||
275 | |||
276 | /**
|
||
277 | * Test settings merging
|
||
278 | *
|
||
279 | * @return void
|
||
280 | */
|
||
281 | public function testSettingsMerging() { |
||
282 | $Helper = new TestHelper($this->View, array( |
||
283 | 'key3' => 'val3', |
||
284 | 'key2' => array('key2.2' => 'newval') |
||
285 | )); |
||
286 | $expected = array( |
||
287 | 'key1' => 'val1', |
||
288 | 'key2' => array('key2.1' => 'val2.1', 'key2.2' => 'newval'), |
||
289 | 'key3' => 'val3' |
||
290 | ); |
||
291 | $this->assertEquals($expected, $Helper->settings); |
||
292 | } |
||
293 | |||
294 | /**
|
||
295 | * Test setting an entity and retrieving the entity, model and field.
|
||
296 | *
|
||
297 | * @dataProvider entityProvider
|
||
298 | * @return void
|
||
299 | */
|
||
300 | public function testSetEntity($entity, $expected, $modelKey, $fieldKey) { |
||
301 | $this->Helper->setEntity($entity); |
||
302 | $this->assertEquals($expected, $this->Helper->entity()); |
||
303 | $this->assertEquals($modelKey, $this->Helper->model()); |
||
304 | $this->assertEquals($fieldKey, $this->Helper->field()); |
||
305 | } |
||
306 | |||
307 | /**
|
||
308 | * test setEntity with setting a scope.
|
||
309 | *
|
||
310 | * @return void
|
||
311 | */
|
||
312 | public function testSetEntityScoped() { |
||
313 | $this->Helper->setEntity('HelperTestPost', true); |
||
314 | $this->assertEquals(array('HelperTestPost'), $this->Helper->entity()); |
||
315 | |||
316 | $this->Helper->setEntity('id'); |
||
317 | $expected = array('HelperTestPost', 'id'); |
||
318 | $this->assertEquals($expected, $this->Helper->entity()); |
||
319 | |||
320 | $this->Helper->setEntity('HelperTestComment.body'); |
||
321 | $expected = array('HelperTestComment', 'body'); |
||
322 | $this->assertEquals($expected, $this->Helper->entity()); |
||
323 | |||
324 | $this->Helper->setEntity('body'); |
||
325 | $expected = array('HelperTestPost', 'body'); |
||
326 | $this->assertEquals($expected, $this->Helper->entity()); |
||
327 | |||
328 | $this->Helper->setEntity('2.body'); |
||
329 | $expected = array('HelperTestPost', '2', 'body'); |
||
330 | $this->assertEquals($expected, $this->Helper->entity()); |
||
331 | |||
332 | $this->Helper->setEntity('Something.else'); |
||
333 | $expected = array('Something', 'else'); |
||
334 | $this->assertEquals($expected, $this->Helper->entity()); |
||
335 | |||
336 | $this->Helper->setEntity('HelperTestComment.5.id'); |
||
337 | $expected = array('HelperTestComment', 5, 'id'); |
||
338 | $this->assertEquals($expected, $this->Helper->entity()); |
||
339 | |||
340 | $this->Helper->setEntity('HelperTestComment.id.time'); |
||
341 | $expected = array('HelperTestComment', 'id', 'time'); |
||
342 | $this->assertEquals($expected, $this->Helper->entity()); |
||
343 | |||
344 | $this->Helper->setEntity('HelperTestComment.created.year'); |
||
345 | $expected = array('HelperTestComment', 'created', 'year'); |
||
346 | $this->assertEquals($expected, $this->Helper->entity()); |
||
347 | |||
348 | $this->Helper->setEntity(null); |
||
349 | $this->Helper->setEntity('ModelThatDoesntExist.field_that_doesnt_exist'); |
||
350 | $expected = array('ModelThatDoesntExist', 'field_that_doesnt_exist'); |
||
351 | $this->assertEquals($expected, $this->Helper->entity()); |
||
352 | } |
||
353 | |||
354 | /**
|
||
355 | * Test that setEntity() and model()/field() work with associated models.
|
||
356 | *
|
||
357 | * @return void
|
||
358 | */
|
||
359 | public function testSetEntityAssociated() { |
||
360 | $this->Helper->setEntity('HelperTestPost', true); |
||
361 | |||
362 | $this->Helper->setEntity('HelperTestPost.1.HelperTestComment.1.title'); |
||
363 | $expected = array('HelperTestPost', '1', 'HelperTestComment', '1', 'title'); |
||
364 | $this->assertEquals($expected, $this->Helper->entity()); |
||
365 | |||
366 | $this->assertEquals('HelperTestComment', $this->Helper->model()); |
||
367 | } |
||
368 | |||
369 | /**
|
||
370 | * Test creating saveMany() compatible entities
|
||
371 | *
|
||
372 | * @return void
|
||
373 | */
|
||
374 | public function testSetEntitySaveMany() { |
||
375 | $this->Helper->setEntity('HelperTestPost', true); |
||
376 | |||
377 | $this->Helper->setEntity('0.HelperTestPost.id'); |
||
378 | $expected = array('0', 'HelperTestPost', 'id'); |
||
379 | $this->assertEquals($expected, $this->Helper->entity()); |
||
380 | } |
||
381 | |||
382 | /**
|
||
383 | * Test that setEntity doesn't make CamelCase fields that are not associations an
|
||
384 | * associated model.
|
||
385 | *
|
||
386 | * @return void
|
||
387 | */
|
||
388 | public function testSetEntityAssociatedCamelCaseField() { |
||
389 | $this->Helper->fieldset = array( |
||
390 | 'HelperTestComment' => array( |
||
391 | 'fields' => array('BigField' => array('type' => 'integer')) |
||
392 | ) |
||
393 | ); |
||
394 | $this->Helper->setEntity('HelperTestComment', true); |
||
395 | $this->Helper->setEntity('HelperTestComment.BigField'); |
||
396 | |||
397 | $this->assertEquals('HelperTestComment', $this->Helper->model()); |
||
398 | $this->assertEquals('BigField', $this->Helper->field()); |
||
399 | } |
||
400 | |||
401 | /**
|
||
402 | * Test that multiple fields work when they are camelcase and in fieldset
|
||
403 | *
|
||
404 | * @return void
|
||
405 | */
|
||
406 | public function testSetEntityAssociatedCamelCaseFieldHabtmMultiple() { |
||
407 | $this->Helper->fieldset = array( |
||
408 | 'HelperTestComment' => array( |
||
409 | 'fields' => array('Tag' => array('type' => 'multiple')) |
||
410 | ) |
||
411 | ); |
||
412 | $this->Helper->setEntity('HelperTestComment', true); |
||
413 | $this->Helper->setEntity('Tag'); |
||
414 | |||
415 | $this->assertEquals('Tag', $this->Helper->model()); |
||
416 | $this->assertEquals('Tag', $this->Helper->field()); |
||
417 | $this->assertEquals(array('Tag', 'Tag'), $this->Helper->entity()); |
||
418 | } |
||
419 | |||
420 | /**
|
||
421 | * Test that habtm associations can have property fields created.
|
||
422 | *
|
||
423 | * @return void
|
||
424 | */
|
||
425 | public function testSetEntityHabtmPropertyFieldNames() { |
||
426 | $this->Helper->fieldset = array( |
||
427 | 'HelperTestComment' => array( |
||
428 | 'fields' => array('Tag' => array('type' => 'multiple')) |
||
429 | ) |
||
430 | ); |
||
431 | $this->Helper->setEntity('HelperTestComment', true); |
||
432 | |||
433 | $this->Helper->setEntity('Tag.name'); |
||
434 | $this->assertEquals('Tag', $this->Helper->model()); |
||
435 | $this->assertEquals('name', $this->Helper->field()); |
||
436 | $this->assertEquals(array('Tag', 'name'), $this->Helper->entity()); |
||
437 | } |
||
438 | |||
439 | /**
|
||
440 | * test that 'view' doesn't break things.
|
||
441 | *
|
||
442 | * @return void
|
||
443 | */
|
||
444 | public function testSetEntityWithView() { |
||
445 | $this->assertNull($this->Helper->setEntity('Allow.view.group_id')); |
||
446 | $this->assertNull($this->Helper->setEntity('Allow.view')); |
||
447 | $this->assertNull($this->Helper->setEntity('View.view')); |
||
448 | } |
||
449 | |||
450 | /**
|
||
451 | * test getting values from Helper
|
||
452 | *
|
||
453 | * @return void
|
||
454 | */
|
||
455 | public function testValue() { |
||
456 | $this->Helper->request->data = array('fullname' => 'This is me'); |
||
457 | $this->Helper->setEntity('fullname'); |
||
458 | $result = $this->Helper->value('fullname'); |
||
459 | $this->assertEquals('This is me', $result); |
||
460 | |||
461 | $this->Helper->request->data = array( |
||
462 | 'Post' => array('name' => 'First Post') |
||
463 | ); |
||
464 | $this->Helper->setEntity('Post.name'); |
||
465 | $result = $this->Helper->value('Post.name'); |
||
466 | $this->assertEquals('First Post', $result); |
||
467 | |||
468 | $this->Helper->request->data = array( |
||
469 | 'Post' => array(2 => array('name' => 'First Post')) |
||
470 | ); |
||
471 | $this->Helper->setEntity('Post.2.name'); |
||
472 | $result = $this->Helper->value('Post.2.name'); |
||
473 | $this->assertEquals('First Post', $result); |
||
474 | |||
475 | $this->Helper->request->data = array( |
||
476 | 'Post' => array( |
||
477 | 2 => array('created' => array('year' => '2008')) |
||
478 | ) |
||
479 | ); |
||
480 | $this->Helper->setEntity('Post.2.created'); |
||
481 | $result = $this->Helper->value('Post.2.created'); |
||
482 | $this->assertEquals(array('year' => '2008'), $result); |
||
483 | |||
484 | $this->Helper->request->data = array( |
||
485 | 'Post' => array( |
||
486 | 2 => array('created' => array('year' => '2008')) |
||
487 | ) |
||
488 | ); |
||
489 | $this->Helper->setEntity('Post.2.created.year'); |
||
490 | $result = $this->Helper->value('Post.2.created.year'); |
||
491 | $this->assertEquals('2008', $result); |
||
492 | } |
||
493 | |||
494 | /**
|
||
495 | * Test default values with value()
|
||
496 | *
|
||
497 | * @return void
|
||
498 | */
|
||
499 | public function testValueWithDefault() { |
||
500 | $this->Helper->request->data = array('zero' => 0); |
||
501 | $this->Helper->setEntity('zero'); |
||
502 | $result = $this->Helper->value(array('default' => 'something'), 'zero'); |
||
503 | $this->assertEquals(array('value' => 0), $result); |
||
504 | |||
505 | $this->Helper->request->data = array('zero' => '0'); |
||
506 | $result = $this->Helper->value(array('default' => 'something'), 'zero'); |
||
507 | $this->assertEquals(array('value' => '0'), $result); |
||
508 | |||
509 | $this->Helper->setEntity('inexistent'); |
||
510 | $result = $this->Helper->value(array('default' => 'something'), 'inexistent'); |
||
511 | $this->assertEquals(array('value' => 'something'), $result); |
||
512 | } |
||
513 | |||
514 | /**
|
||
515 | * Test habtm data fetching and ensure no pollution happens.
|
||
516 | *
|
||
517 | * @return void
|
||
518 | */
|
||
519 | public function testValueHabtmKeys() { |
||
520 | $this->Helper->request->data = array( |
||
521 | 'HelperTestTag' => array('HelperTestTag' => '') |
||
522 | ); |
||
523 | $this->Helper->setEntity('HelperTestTag.HelperTestTag'); |
||
524 | $result = $this->Helper->value('HelperTestTag.HelperTestTag'); |
||
525 | $this->assertEquals('', $result); |
||
526 | |||
527 | $this->Helper->request->data = array( |
||
528 | 'HelperTestTag' => array( |
||
529 | 'HelperTestTag' => array(2, 3, 4) |
||
530 | ) |
||
531 | ); |
||
532 | $this->Helper->setEntity('HelperTestTag.HelperTestTag'); |
||
533 | $result = $this->Helper->value('HelperTestTag.HelperTestTag'); |
||
534 | $this->assertEquals(array(2, 3, 4), $result); |
||
535 | |||
536 | $this->Helper->request->data = array( |
||
537 | 'HelperTestTag' => array( |
||
538 | array('id' => 3), |
||
539 | array('id' => 5) |
||
540 | ) |
||
541 | ); |
||
542 | $this->Helper->setEntity('HelperTestTag.HelperTestTag'); |
||
543 | $result = $this->Helper->value('HelperTestTag.HelperTestTag'); |
||
544 | $this->assertEquals(array(3 => 3, 5 => 5), $result); |
||
545 | |||
546 | $this->Helper->request->data = array( |
||
547 | 'HelperTestTag' => array( |
||
548 | 'body' => '', |
||
549 | 'title' => 'winning' |
||
550 | ), |
||
551 | ); |
||
552 | $this->Helper->setEntity('HelperTestTag.body'); |
||
553 | $result = $this->Helper->value('HelperTestTag.body'); |
||
554 | $this->assertEquals('', $result); |
||
555 | } |
||
556 | |||
557 | /**
|
||
558 | * Ensure HTML escaping of URL params. So link addresses are valid and not exploited
|
||
559 | *
|
||
560 | * @return void
|
||
561 | */
|
||
562 | public function testUrlConversion() { |
||
563 | $result = $this->Helper->url('/controller/action/1'); |
||
564 | $this->assertEquals('/controller/action/1', $result); |
||
565 | |||
566 | $result = $this->Helper->url('/controller/action/1?one=1&two=2'); |
||
567 | $this->assertEquals('/controller/action/1?one=1&two=2', $result); |
||
568 | |||
569 | $result = $this->Helper->url(array('controller' => 'posts', 'action' => 'index', 'page' => '1" onclick="alert(\'XSS\');"')); |
||
570 | $this->assertEquals("/posts/index/page:1%22%20onclick%3D%22alert%28%27XSS%27%29%3B%22", $result); |
||
571 | |||
572 | $result = $this->Helper->url('/controller/action/1/param:this+one+more'); |
||
573 | $this->assertEquals('/controller/action/1/param:this+one+more', $result); |
||
574 | |||
575 | $result = $this->Helper->url('/controller/action/1/param:this%20one%20more'); |
||
576 | $this->assertEquals('/controller/action/1/param:this%20one%20more', $result); |
||
577 | |||
578 | $result = $this->Helper->url('/controller/action/1/param:%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24'); |
||
579 | $this->assertEquals('/controller/action/1/param:%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24', $result); |
||
580 | |||
581 | $result = $this->Helper->url(array( |
||
582 | 'controller' => 'posts', 'action' => 'index', 'param' => '%7Baround%20here%7D%5Bthings%5D%5Bare%5D%24%24' |
||
583 | )); |
||
584 | $this->assertEquals("/posts/index/param:%257Baround%2520here%257D%255Bthings%255D%255Bare%255D%2524%2524", $result); |
||
585 | |||
586 | $result = $this->Helper->url(array( |
||
587 | 'controller' => 'posts', 'action' => 'index', 'page' => '1', |
||
588 | '?' => array('one' => 'value', 'two' => 'value', 'three' => 'purple') |
||
589 | )); |
||
590 | $this->assertEquals("/posts/index/page:1?one=value&two=value&three=purple", $result); |
||
591 | } |
||
592 | |||
593 | /**
|
||
594 | * test assetTimestamp application
|
||
595 | *
|
||
596 | * @return void
|
||
597 | */
|
||
598 | public function testAssetTimestamp() { |
||
599 | Configure::write('Foo.bar', 'test'); |
||
600 | Configure::write('Asset.timestamp', false); |
||
601 | $result = $this->Helper->assetTimestamp(Configure::read('App.cssBaseUrl') . 'cake.generic.css'); |
||
602 | $this->assertEquals(Configure::read('App.cssBaseUrl') . 'cake.generic.css', $result); |
||
603 | |||
604 | Configure::write('Asset.timestamp', true); |
||
605 | Configure::write('debug', 0); |
||
606 | |||
607 | $result = $this->Helper->assetTimestamp('/%3Cb%3E/cake.generic.css'); |
||
608 | $this->assertEquals('/%3Cb%3E/cake.generic.css', $result); |
||
609 | |||
610 | $result = $this->Helper->assetTimestamp(Configure::read('App.cssBaseUrl') . 'cake.generic.css'); |
||
611 | $this->assertEquals(Configure::read('App.cssBaseUrl') . 'cake.generic.css', $result); |
||
612 | |||
613 | Configure::write('Asset.timestamp', true); |
||
614 | Configure::write('debug', 2); |
||
615 | $result = $this->Helper->assetTimestamp(Configure::read('App.cssBaseUrl') . 'cake.generic.css'); |
||
616 | $this->assertRegExp('/' . preg_quote(Configure::read('App.cssBaseUrl') . 'cake.generic.css?', '/') . '[0-9]+/', $result); |
||
617 | |||
618 | Configure::write('Asset.timestamp', 'force'); |
||
619 | Configure::write('debug', 0); |
||
620 | $result = $this->Helper->assetTimestamp(Configure::read('App.cssBaseUrl') . 'cake.generic.css'); |
||
621 | $this->assertRegExp('/' . preg_quote(Configure::read('App.cssBaseUrl') . 'cake.generic.css?', '/') . '[0-9]+/', $result); |
||
622 | |||
623 | $result = $this->Helper->assetTimestamp(Configure::read('App.cssBaseUrl') . 'cake.generic.css?someparam'); |
||
624 | $this->assertEquals(Configure::read('App.cssBaseUrl') . 'cake.generic.css?someparam', $result); |
||
625 | |||
626 | $this->Helper->request->webroot = '/some/dir/'; |
||
627 | $result = $this->Helper->assetTimestamp('/some/dir/' . Configure::read('App.cssBaseUrl') . 'cake.generic.css'); |
||
628 | $this->assertRegExp('/' . preg_quote(Configure::read('App.cssBaseUrl') . 'cake.generic.css?', '/') . '[0-9]+/', $result); |
||
629 | } |
||
630 | |||
631 | /**
|
||
632 | * test assetUrl application
|
||
633 | *
|
||
634 | * @return void
|
||
635 | */
|
||
636 | public function testAssetUrl() { |
||
637 | $this->Helper->webroot = ''; |
||
638 | $result = $this->Helper->assetUrl(array( |
||
639 | 'controller' => 'js', |
||
640 | 'action' => 'post', |
||
641 | 'ext' => 'js' |
||
642 | ), |
||
643 | array('fullBase' => true) |
||
644 | ); |
||
645 | $this->assertEquals(Router::fullBaseUrl() . '/js/post.js', $result); |
||
646 | |||
647 | $result = $this->Helper->assetUrl('foo.jpg', array('pathPrefix' => 'img/')); |
||
648 | $this->assertEquals('img/foo.jpg', $result); |
||
649 | |||
650 | $result = $this->Helper->assetUrl('foo.jpg', array('fullBase' => true)); |
||
651 | $this->assertEquals(Router::fullBaseUrl() . '/foo.jpg', $result); |
||
652 | |||
653 | $result = $this->Helper->assetUrl('style', array('ext' => '.css')); |
||
654 | $this->assertEquals('style.css', $result); |
||
655 | |||
656 | $result = $this->Helper->assetUrl('dir/sub dir/my image', array('ext' => '.jpg')); |
||
657 | $this->assertEquals('dir/sub%20dir/my%20image.jpg', $result); |
||
658 | |||
659 | $result = $this->Helper->assetUrl('foo.jpg?one=two&three=four'); |
||
660 | $this->assertEquals('foo.jpg?one=two&three=four', $result); |
||
661 | |||
662 | $result = $this->Helper->assetUrl('dir/big+tall/image', array('ext' => '.jpg')); |
||
663 | $this->assertEquals('dir/big%2Btall/image.jpg', $result); |
||
664 | } |
||
665 | |||
666 | /**
|
||
667 | * Test assetUrl with no rewriting.
|
||
668 | *
|
||
669 | * @return void
|
||
670 | */
|
||
671 | public function testAssetUrlNoRewrite() { |
||
672 | $this->Helper->request->addPaths(array( |
||
673 | 'base' => '/cake_dev/index.php', |
||
674 | 'webroot' => '/cake_dev/app/webroot/', |
||
675 | 'here' => '/cake_dev/index.php/tasks', |
||
676 | )); |
||
677 | $result = $this->Helper->assetUrl('img/cake.icon.png', array('fullBase' => true)); |
||
678 | $expected = FULL_BASE_URL . '/cake_dev/app/webroot/img/cake.icon.png'; |
||
679 | $this->assertEquals($expected, $result); |
||
680 | } |
||
681 | |||
682 | /**
|
||
683 | * Test assetUrl with plugins.
|
||
684 | *
|
||
685 | * @return void
|
||
686 | */
|
||
687 | public function testAssetUrlPlugin() { |
||
688 | $this->Helper->webroot = ''; |
||
689 | CakePlugin::load('TestPlugin'); |
||
690 | |||
691 | $result = $this->Helper->assetUrl('TestPlugin.style', array('ext' => '.css')); |
||
692 | $this->assertEquals('test_plugin/style.css', $result); |
||
693 | |||
694 | $result = $this->Helper->assetUrl('TestPlugin.style', array('ext' => '.css', 'plugin' => false)); |
||
695 | $this->assertEquals('TestPlugin.style.css', $result); |
||
696 | |||
697 | CakePlugin::unload('TestPlugin'); |
||
698 | } |
||
699 | |||
700 | /**
|
||
701 | * test assetUrl and Asset.timestamp = force
|
||
702 | *
|
||
703 | * @return void
|
||
704 | */
|
||
705 | public function testAssetUrlTimestampForce() { |
||
706 | $this->Helper->webroot = ''; |
||
707 | Configure::write('Asset.timestamp', 'force'); |
||
708 | |||
709 | $result = $this->Helper->assetUrl('cake.generic.css', array('pathPrefix' => Configure::read('App.cssBaseUrl'))); |
||
710 | $this->assertRegExp('/' . preg_quote(Configure::read('App.cssBaseUrl') . 'cake.generic.css?', '/') . '[0-9]+/', $result); |
||
711 | } |
||
712 | |||
713 | /**
|
||
714 | * test assetTimestamp with plugins and themes
|
||
715 | *
|
||
716 | * @return void
|
||
717 | */
|
||
718 | public function testAssetTimestampPluginsAndThemes() { |
||
719 | Configure::write('Asset.timestamp', 'force'); |
||
720 | App::build(array( |
||
721 | 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS), |
||
722 | )); |
||
723 | CakePlugin::load(array('TestPlugin')); |
||
724 | |||
725 | $result = $this->Helper->assetTimestamp('/test_plugin/css/test_plugin_asset.css'); |
||
726 | $this->assertRegExp('#/test_plugin/css/test_plugin_asset.css\?[0-9]+$#', $result, 'Missing timestamp plugin'); |
||
727 | |||
728 | $result = $this->Helper->assetTimestamp('/test_plugin/css/i_dont_exist.css'); |
||
729 | $this->assertRegExp('#/test_plugin/css/i_dont_exist.css\?$#', $result, 'No error on missing file'); |
||
730 | |||
731 | $result = $this->Helper->assetTimestamp('/theme/test_theme/js/theme.js'); |
||
732 | $this->assertRegExp('#/theme/test_theme/js/theme.js\?[0-9]+$#', $result, 'Missing timestamp theme'); |
||
733 | |||
734 | $result = $this->Helper->assetTimestamp('/theme/test_theme/js/non_existant.js'); |
||
735 | $this->assertRegExp('#/theme/test_theme/js/non_existant.js\?$#', $result, 'No error on missing file'); |
||
736 | } |
||
737 | |||
738 | /**
|
||
739 | * testFieldsWithSameName method
|
||
740 | *
|
||
741 | * @return void
|
||
742 | */
|
||
743 | public function testFieldsWithSameName() { |
||
744 | $this->Helper->setEntity('HelperTestTag', true); |
||
745 | |||
746 | $this->Helper->setEntity('HelperTestTag.id'); |
||
747 | $expected = array('HelperTestTag', 'id'); |
||
748 | $this->assertEquals($expected, $this->Helper->entity()); |
||
749 | |||
750 | $this->Helper->setEntity('My.id'); |
||
751 | $expected = array('My', 'id'); |
||
752 | $this->assertEquals($expected, $this->Helper->entity()); |
||
753 | |||
754 | $this->Helper->setEntity('MyOther.id'); |
||
755 | $expected = array('MyOther', 'id'); |
||
756 | $this->assertEquals($expected, $this->Helper->entity()); |
||
757 | } |
||
758 | |||
759 | /**
|
||
760 | * testFieldSameAsModel method
|
||
761 | *
|
||
762 | * @return void
|
||
763 | */
|
||
764 | public function testFieldSameAsModel() { |
||
765 | $this->Helper->setEntity('HelperTestTag', true); |
||
766 | |||
767 | $this->Helper->setEntity('helper_test_post'); |
||
768 | $expected = array('HelperTestTag', 'helper_test_post'); |
||
769 | $this->assertEquals($expected, $this->Helper->entity()); |
||
770 | |||
771 | $this->Helper->setEntity('HelperTestTag'); |
||
772 | $expected = array('HelperTestTag', 'HelperTestTag'); |
||
773 | $this->assertEquals($expected, $this->Helper->entity()); |
||
774 | } |
||
775 | |||
776 | /**
|
||
777 | * testFieldSuffixForDate method
|
||
778 | *
|
||
779 | * @return void
|
||
780 | */
|
||
781 | public function testFieldSuffixForDate() { |
||
782 | $this->Helper->setEntity('HelperTestPost', true); |
||
783 | $expected = array('HelperTestPost'); |
||
784 | $this->assertEquals($expected, $this->Helper->entity()); |
||
785 | |||
786 | foreach (array('year', 'month', 'day', 'hour', 'min', 'meridian') as $d) { |
||
787 | $this->Helper->setEntity('date.' . $d); |
||
788 | $expected = array('HelperTestPost', 'date', $d); |
||
789 | $this->assertEquals($expected, $this->Helper->entity()); |
||
790 | } |
||
791 | } |
||
792 | |||
793 | /**
|
||
794 | * testMulitDimensionValue method
|
||
795 | *
|
||
796 | * @return void
|
||
797 | */
|
||
798 | public function testMultiDimensionValue() { |
||
799 | $this->Helper->data = array(); |
||
800 | for ($i = 0; $i < 2; $i++) { |
||
801 | $this->Helper->request->data['Model'][$i] = 'what'; |
||
802 | $result[] = $this->Helper->value("Model.{$i}"); |
||
803 | $this->Helper->request->data['Model'][$i] = array(); |
||
804 | for ($j = 0; $j < 2; $j++) { |
||
805 | $this->Helper->request->data['Model'][$i][$j] = 'how'; |
||
806 | $result[] = $this->Helper->value("Model.{$i}.{$j}"); |
||
807 | } |
||
808 | } |
||
809 | $expected = array('what', 'how', 'how', 'what', 'how', 'how'); |
||
810 | $this->assertEquals($expected, $result); |
||
811 | |||
812 | $this->Helper->request->data['HelperTestComment']['5']['id'] = 'ok'; |
||
813 | $result = $this->Helper->value('HelperTestComment.5.id'); |
||
814 | $this->assertEquals('ok', $result); |
||
815 | |||
816 | $this->Helper->setEntity('HelperTestPost', true); |
||
817 | $this->Helper->request->data['HelperTestPost']['5']['created']['month'] = '10'; |
||
818 | $result = $this->Helper->value('5.created.month'); |
||
819 | $this->assertEquals(10, $result); |
||
820 | |||
821 | $this->Helper->request->data['HelperTestPost']['0']['id'] = 100; |
||
822 | $result = $this->Helper->value('HelperTestPost.0.id'); |
||
823 | $this->assertEquals(100, $result); |
||
824 | } |
||
825 | |||
826 | /**
|
||
827 | * testClean method
|
||
828 | *
|
||
829 | * @return void
|
||
830 | */
|
||
831 | public function testClean() { |
||
832 | $result = $this->Helper->clean(array()); |
||
833 | $this->assertEquals(null, $result); |
||
834 | |||
835 | $result = $this->Helper->clean(array('<script>with something</script>', '<applet>something else</applet>')); |
||
836 | $this->assertEquals(array('with something', 'something else'), $result); |
||
837 | |||
838 | $result = $this->Helper->clean('<script>with something</script>'); |
||
839 | $this->assertEquals('with something', $result); |
||
840 | |||
841 | $result = $this->Helper->clean('<script type="text/javascript">alert("ruined");</script>'); |
||
842 | $this->assertNotRegExp('#</*script#', $result); |
||
843 | |||
844 | $result = $this->Helper->clean("<script \ntype=\"text/javascript\">\n\talert('ruined');\n\n\t\t</script>"); |
||
845 | $this->assertNotRegExp('#</*script#', $result); |
||
846 | |||
847 | $result = $this->Helper->clean('<body/onload=do(/something/)>'); |
||
848 | $this->assertEquals('<body/>', $result); |
||
849 | |||
850 | $result = $this->Helper->clean('<script>alert(document.cookie)</script>'); |
||
851 | $this->assertEquals('&lt;script&gt;alert(document.cookie)&lt;/script&gt;', $result); |
||
852 | } |
||
853 | |||
854 | /**
|
||
855 | * testDomId method
|
||
856 | *
|
||
857 | * @return void
|
||
858 | */
|
||
859 | public function testDomId() { |
||
860 | $result = $this->Helper->domId('Foo.bar'); |
||
861 | $this->assertEquals('FooBar', $result); |
||
862 | } |
||
863 | |||
864 | /**
|
||
865 | * testMultiDimensionalField method
|
||
866 | *
|
||
867 | * @return void
|
||
868 | */
|
||
869 | public function testMultiDimensionalField() { |
||
870 | $this->Helper->setEntity('HelperTestPost', true); |
||
871 | |||
872 | $entity = 'HelperTestPost.2.HelperTestComment.1.title'; |
||
873 | $this->Helper->setEntity($entity); |
||
874 | $expected = array( |
||
875 | 'HelperTestPost', '2', 'HelperTestComment', '1', 'title' |
||
876 | ); |
||
877 | $this->assertEquals($expected, $this->Helper->entity()); |
||
878 | |||
879 | $entity = 'HelperTestPost.1.HelperTestComment.1.HelperTestTag.1.created'; |
||
880 | $this->Helper->setEntity($entity); |
||
881 | $expected = array( |
||
882 | 'HelperTestPost', '1', 'HelperTestComment', '1', |
||
883 | 'HelperTestTag', '1', 'created' |
||
884 | ); |
||
885 | $this->assertEquals($expected, $this->Helper->entity()); |
||
886 | |||
887 | $entity = 'HelperTestPost.0.HelperTestComment.1.HelperTestTag.1.fake'; |
||
888 | $expected = array( |
||
889 | 'HelperTestPost', '0', 'HelperTestComment', '1', |
||
890 | 'HelperTestTag', '1', 'fake' |
||
891 | ); |
||
892 | $this->Helper->setEntity($entity); |
||
893 | |||
894 | $entity = '1.HelperTestComment.1.HelperTestTag.created.year'; |
||
895 | $this->Helper->setEntity($entity); |
||
896 | |||
897 | $this->Helper->request->data['HelperTestPost'][2]['HelperTestComment'][1]['title'] = 'My Title'; |
||
898 | $result = $this->Helper->value('HelperTestPost.2.HelperTestComment.1.title'); |
||
899 | $this->assertEquals('My Title', $result); |
||
900 | |||
901 | $this->Helper->request->data['HelperTestPost'][2]['HelperTestComment'][1]['created']['year'] = 2008; |
||
902 | $result = $this->Helper->value('HelperTestPost.2.HelperTestComment.1.created.year'); |
||
903 | $this->assertEquals(2008, $result); |
||
904 | |||
905 | $this->Helper->request->data[2]['HelperTestComment'][1]['created']['year'] = 2008; |
||
906 | $result = $this->Helper->value('HelperTestPost.2.HelperTestComment.1.created.year'); |
||
907 | $this->assertEquals(2008, $result); |
||
908 | |||
909 | $this->Helper->request->data['HelperTestPost']['title'] = 'My Title'; |
||
910 | $result = $this->Helper->value('title'); |
||
911 | $this->assertEquals('My Title', $result); |
||
912 | |||
913 | $this->Helper->request->data['My']['title'] = 'My Title'; |
||
914 | $result = $this->Helper->value('My.title'); |
||
915 | $this->assertEquals('My Title', $result); |
||
916 | } |
||
917 | |||
918 | public function testWebrootPaths() { |
||
919 | $this->Helper->request->webroot = '/'; |
||
920 | $result = $this->Helper->webroot('/img/cake.power.gif'); |
||
921 | $expected = '/img/cake.power.gif'; |
||
922 | $this->assertEquals($expected, $result); |
||
923 | |||
924 | $this->Helper->theme = 'test_theme'; |
||
925 | |||
926 | App::build(array( |
||
927 | 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS) |
||
928 | )); |
||
929 | |||
930 | $result = $this->Helper->webroot('/img/cake.power.gif'); |
||
931 | $expected = '/theme/test_theme/img/cake.power.gif'; |
||
932 | $this->assertEquals($expected, $result); |
||
933 | |||
934 | $result = $this->Helper->webroot('/img/test.jpg'); |
||
935 | $expected = '/theme/test_theme/img/test.jpg'; |
||
936 | $this->assertEquals($expected, $result); |
||
937 | |||
938 | $webRoot = Configure::read('App.www_root'); |
||
939 | Configure::write('App.www_root', CAKE . 'Test' . DS . 'test_app' . DS . 'webroot' . DS); |
||
940 | |||
941 | $result = $this->Helper->webroot('/img/cake.power.gif'); |
||
942 | $expected = '/theme/test_theme/img/cake.power.gif'; |
||
943 | $this->assertEquals($expected, $result); |
||
944 | |||
945 | $result = $this->Helper->webroot('/img/test.jpg'); |
||
946 | $expected = '/theme/test_theme/img/test.jpg'; |
||
947 | $this->assertEquals($expected, $result); |
||
948 | |||
949 | $result = $this->Helper->webroot('/img/cake.icon.gif'); |
||
950 | $expected = '/img/cake.icon.gif'; |
||
951 | $this->assertEquals($expected, $result); |
||
952 | |||
953 | $result = $this->Helper->webroot('/img/cake.icon.gif?some=param'); |
||
954 | $expected = '/img/cake.icon.gif?some=param'; |
||
955 | $this->assertEquals($expected, $result); |
||
956 | |||
957 | Configure::write('App.www_root', $webRoot); |
||
958 | } |
||
959 | |||
960 | /**
|
||
961 | * test lazy loading helpers is seamless
|
||
962 | *
|
||
963 | * @return void
|
||
964 | */
|
||
965 | public function testLazyLoadingHelpers() { |
||
966 | App::build(array( |
||
967 | 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS), |
||
968 | )); |
||
969 | CakePlugin::load(array('TestPlugin')); |
||
970 | $Helper = new TestHelper($this->View); |
||
971 | $this->assertInstanceOf('OtherHelperHelper', $Helper->OtherHelper); |
||
972 | $this->assertInstanceOf('HtmlHelper', $Helper->Html); |
||
973 | App::build();
|
||
974 | } |
||
975 | |||
976 | /**
|
||
977 | * test that a helpers Helper is not 'attached' to the collection
|
||
978 | *
|
||
979 | * @return void
|
||
980 | */
|
||
981 | public function testThatHelperHelpersAreNotAttached() { |
||
982 | $Helper = new TestHelper($this->View); |
||
983 | $Helper->OtherHelper; |
||
984 | |||
985 | $result = $this->View->Helpers->enabled(); |
||
986 | $this->assertEquals(array(), $result, 'Helper helpers were attached to the collection.'); |
||
987 | } |
||
988 | |||
989 | /**
|
||
990 | * test that the lazy loader doesn't duplicate objects on each access.
|
||
991 | *
|
||
992 | * @return void
|
||
993 | */
|
||
994 | public function testLazyLoadingUsesReferences() { |
||
995 | $Helper = new TestHelper($this->View); |
||
996 | $resultA = $Helper->Html; |
||
997 | $resultB = $Helper->Html; |
||
998 | |||
999 | $resultA->testprop = 1; |
||
1000 | $this->assertEquals($resultA->testprop, $resultB->testprop); |
||
1001 | } |
||
1002 | |||
1003 | } |