Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
13532 anikendra 1
<?php
2
/**
3
 * CacheHelperTest 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.Helper
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('Controller', 'Controller');
20
App::uses('Model', 'Model');
21
App::uses('View', 'View');
22
App::uses('CacheHelper', 'View/Helper');
23
 
24
/**
25
 * CacheTestController class
26
 *
27
 * @package       Cake.Test.Case.View.Helper
28
 */
29
class CacheTestController extends Controller {
30
 
31
/**
32
 * helpers property
33
 *
34
 * @var array
35
 */
36
	public $helpers = array('Html', 'Cache');
37
 
38
/**
39
 * cache_parsing method
40
 *
41
 * @return void
42
 */
43
	public function cache_parsing() {
44
		$this->viewPath = 'Posts';
45
		$this->layout = 'cache_layout';
46
		$this->set('variable', 'variableValue');
47
		$this->set('superman', 'clark kent');
48
		$this->set('batman', 'bruce wayne');
49
		$this->set('spiderman', 'peter parker');
50
	}
51
 
52
}
53
 
54
/**
55
 * CacheHelperTest class
56
 *
57
 * @package       Cake.Test.Case.View.Helper
58
 */
59
class CacheHelperTest extends CakeTestCase {
60
 
61
/**
62
 * Checks if TMP/views is writable, and skips the case if it is not.
63
 *
64
 * @return void
65
 */
66
	public function skip() {
67
		if (!is_writable(TMP . 'cache' . DS . 'views' . DS)) {
68
			$this->markTestSkipped('TMP/views is not writable %s');
69
		}
70
	}
71
 
72
/**
73
 * setUp method
74
 *
75
 * @return void
76
 */
77
	public function setUp() {
78
		parent::setUp();
79
		$_GET = array();
80
		$request = new CakeRequest();
81
		$this->Controller = new CacheTestController($request);
82
		$View = new View($this->Controller);
83
		$this->Cache = new CacheHelper($View);
84
		Configure::write('Cache.check', true);
85
		Configure::write('Cache.disable', false);
86
		App::build(array(
87
			'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
88
		), App::RESET);
89
	}
90
 
91
/**
92
 * tearDown method
93
 *
94
 * @return void
95
 */
96
	public function tearDown() {
97
		clearCache();
98
		unset($this->Cache);
99
		parent::tearDown();
100
	}
101
 
102
/**
103
 * test cache parsing with no cake:nocache tags in view file.
104
 *
105
 * @return void
106
 */
107
	public function testLayoutCacheParsingNoTagsInView() {
108
		$this->Controller->cache_parsing();
109
		$this->Controller->request->addParams(array(
110
			'controller' => 'cache_test',
111
			'action' => 'cache_parsing',
112
			'pass' => array(),
113
			'named' => array()
114
		));
115
		$this->Controller->cacheAction = 21600;
116
		$this->Controller->request->here = '/cacheTest/cache_parsing';
117
		$this->Controller->request->action = 'cache_parsing';
118
 
119
		$View = new View($this->Controller);
120
		$result = $View->render('index');
121
		$this->assertNotRegExp('/cake:nocache/', $result);
122
		$this->assertNotRegExp('/php echo/', $result);
123
 
124
		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
125
		$this->assertTrue(file_exists($filename));
126
 
127
		$contents = file_get_contents($filename);
128
		$this->assertRegExp('/php echo \$variable/', $contents);
129
		$this->assertRegExp('/php echo microtime()/', $contents);
130
		$this->assertRegExp('/clark kent/', $result);
131
 
132
		unlink($filename);
133
	}
134
 
135
/**
136
 * test cache parsing with non-latin characters in current route
137
 *
138
 * @return void
139
 */
140
	public function testCacheNonLatinCharactersInRoute() {
141
		$this->Controller->cache_parsing();
142
		$this->Controller->request->addParams(array(
143
			'controller' => 'cache_test',
144
			'action' => 'cache_parsing',
145
			'pass' => array('風街ろまん'),
146
			'named' => array()
147
		));
148
		$this->Controller->cacheAction = 21600;
149
		$this->Controller->request->here = '/posts/view/風街ろまん';
150
		$this->Controller->action = 'view';
151
 
152
		$View = new View($this->Controller);
153
		$View->render('index');
154
 
155
		$filename = CACHE . 'views' . DS . 'posts_view_風街ろまん.php';
156
		$this->assertTrue(file_exists($filename));
157
 
158
		unlink($filename);
159
	}
160
 
161
/**
162
 * Test cache parsing with cake:nocache tags in view file.
163
 *
164
 * @return void
165
 */
166
	public function testLayoutCacheParsingWithTagsInView() {
167
		$this->Controller->cache_parsing();
168
		$this->Controller->request->addParams(array(
169
			'controller' => 'cache_test',
170
			'action' => 'cache_parsing',
171
			'pass' => array(),
172
			'named' => array()
173
		));
174
		$this->Controller->cacheAction = 21600;
175
		$this->Controller->request->here = '/cacheTest/cache_parsing';
176
		$this->Controller->action = 'cache_parsing';
177
 
178
		$View = new View($this->Controller);
179
		$result = $View->render('test_nocache_tags');
180
		$this->assertNotRegExp('/cake:nocache/', $result);
181
		$this->assertNotRegExp('/php echo/', $result);
182
 
183
		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
184
		$this->assertTrue(file_exists($filename));
185
 
186
		$contents = file_get_contents($filename);
187
		$this->assertRegExp('/if \(is_writable\(TMP\)\)\:/', $contents);
188
		$this->assertRegExp('/php echo \$variable/', $contents);
189
		$this->assertRegExp('/php echo microtime()/', $contents);
190
		$this->assertNotRegExp('/cake:nocache/', $contents);
191
 
192
		unlink($filename);
193
	}
194
 
195
/**
196
 * test that multiple <!--nocache--> tags function with multiple nocache tags in the layout.
197
 *
198
 * @return void
199
 */
200
	public function testMultipleNoCacheTagsInViewfile() {
201
		$this->Controller->cache_parsing();
202
		$this->Controller->request->addParams(array(
203
			'controller' => 'cache_test',
204
			'action' => 'cache_parsing',
205
			'pass' => array(),
206
			'named' => array()
207
		));
208
		$this->Controller->cacheAction = 21600;
209
		$this->Controller->request->here = '/cacheTest/cache_parsing';
210
		$this->Controller->action = 'cache_parsing';
211
 
212
		$View = new View($this->Controller);
213
		$result = $View->render('multiple_nocache');
214
 
215
		$this->assertNotRegExp('/cake:nocache/', $result);
216
		$this->assertNotRegExp('/php echo/', $result);
217
 
218
		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
219
		$this->assertTrue(file_exists($filename));
220
 
221
		$contents = file_get_contents($filename);
222
		$this->assertNotRegExp('/cake:nocache/', $contents);
223
		unlink($filename);
224
	}
225
 
226
/**
227
 * testComplexNoCache method
228
 *
229
 * @return void
230
 */
231
	public function testComplexNoCache() {
232
		$this->Controller->cache_parsing();
233
		$this->Controller->request->addParams(array(
234
			'controller' => 'cache_test',
235
			'action' => 'cache_complex',
236
			'pass' => array(),
237
			'named' => array()
238
		));
239
		$this->Controller->cacheAction = array('cache_complex' => 21600);
240
		$this->Controller->request->here = '/cacheTest/cache_complex';
241
		$this->Controller->action = 'cache_complex';
242
		$this->Controller->layout = 'multi_cache';
243
		$this->Controller->viewPath = 'Posts';
244
 
245
		$View = new View($this->Controller);
246
		$result = $View->render('sequencial_nocache');
247
 
248
		$this->assertNotRegExp('/cake:nocache/', $result);
249
		$this->assertNotRegExp('/php echo/', $result);
250
		$this->assertRegExp('/A\. Layout Before Content/', $result);
251
		$this->assertRegExp('/B\. In Plain Element/', $result);
252
		$this->assertRegExp('/C\. Layout After Test Element/', $result);
253
		$this->assertRegExp('/D\. In View File/', $result);
254
		$this->assertRegExp('/E\. Layout After Content/', $result);
255
		$this->assertRegExp('/F\. In Element With No Cache Tags/', $result);
256
		$this->assertRegExp('/G\. Layout After Content And After Element With No Cache Tags/', $result);
257
		$this->assertNotRegExp('/1\. layout before content/', $result);
258
		$this->assertNotRegExp('/2\. in plain element/', $result);
259
		$this->assertNotRegExp('/3\. layout after test element/', $result);
260
		$this->assertNotRegExp('/4\. in view file/', $result);
261
		$this->assertNotRegExp('/5\. layout after content/', $result);
262
		$this->assertNotRegExp('/6\. in element with no cache tags/', $result);
263
		$this->assertNotRegExp('/7\. layout after content and after element with no cache tags/', $result);
264
 
265
		$filename = CACHE . 'views' . DS . 'cachetest_cache_complex.php';
266
		$this->assertTrue(file_exists($filename));
267
		$contents = file_get_contents($filename);
268
		unlink($filename);
269
 
270
		$this->assertRegExp('/A\. Layout Before Content/', $contents);
271
		$this->assertNotRegExp('/B\. In Plain Element/', $contents);
272
		$this->assertRegExp('/C\. Layout After Test Element/', $contents);
273
		$this->assertRegExp('/D\. In View File/', $contents);
274
		$this->assertRegExp('/E\. Layout After Content/', $contents);
275
		$this->assertRegExp('/F\. In Element With No Cache Tags/', $contents);
276
		$this->assertRegExp('/G\. Layout After Content And After Element With No Cache Tags/', $contents);
277
		$this->assertRegExp('/1\. layout before content/', $contents);
278
		$this->assertNotRegExp('/2\. in plain element/', $contents);
279
		$this->assertRegExp('/3\. layout after test element/', $contents);
280
		$this->assertRegExp('/4\. in view file/', $contents);
281
		$this->assertRegExp('/5\. layout after content/', $contents);
282
		$this->assertRegExp('/6\. in element with no cache tags/', $contents);
283
		$this->assertRegExp('/7\. layout after content and after element with no cache tags/', $contents);
284
	}
285
 
286
/**
287
 * test cache of view vars
288
 *
289
 * @return void
290
 */
291
	public function testCacheViewVars() {
292
		$this->Controller->cache_parsing();
293
		$this->Controller->request->addParams(array(
294
			'controller' => 'cache_test',
295
			'action' => 'cache_parsing',
296
			'pass' => array(),
297
			'named' => array()
298
		));
299
		$this->Controller->request->here = '/cacheTest/cache_parsing';
300
		$this->Controller->cacheAction = 21600;
301
 
302
		$View = new View($this->Controller);
303
		$result = $View->render('index');
304
		$this->assertNotRegExp('/cake:nocache/', $result);
305
		$this->assertNotRegExp('/php echo/', $result);
306
 
307
		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
308
		$this->assertTrue(file_exists($filename));
309
 
310
		$contents = file_get_contents($filename);
311
		$this->assertRegExp('/\$this\-\>viewVars/', $contents);
312
		$this->assertRegExp('/extract\(\$this\-\>viewVars, EXTR_SKIP\);/', $contents);
313
		$this->assertRegExp('/php echo \$variable/', $contents);
314
 
315
		unlink($filename);
316
	}
317
 
318
/**
319
 * Test that callback code is generated correctly.
320
 *
321
 * @return void
322
 */
323
	public function testCacheCallbacks() {
324
		$this->Controller->request->addParams(array(
325
			'controller' => 'cache_test',
326
			'action' => 'cache_parsing',
327
			'pass' => array(),
328
			'named' => array()
329
		));
330
		$this->Controller->cacheAction = array(
331
			'cache_parsing' => array(
332
				'duration' => 21600,
333
				'callbacks' => true
334
			)
335
		);
336
		$this->Controller->request->here = '/cacheTest/cache_parsing';
337
		$this->Controller->cache_parsing();
338
 
339
		$View = new View($this->Controller);
340
		$View->render('index');
341
 
342
		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
343
		$this->assertTrue(file_exists($filename));
344
 
345
		$contents = file_get_contents($filename);
346
 
347
		$this->assertRegExp('/\$controller->startupProcess\(\);/', $contents);
348
 
349
		unlink($filename);
350
	}
351
 
352
/**
353
 * test cacheAction set to a boolean
354
 *
355
 * @return void
356
 */
357
	public function testCacheActionArray() {
358
		$this->Controller->request->addParams(array(
359
			'controller' => 'cache_test',
360
			'action' => 'cache_parsing',
361
			'pass' => array(),
362
			'named' => array()
363
		));
364
		$this->Controller->request->here = '/cache_test/cache_parsing';
365
		$this->Controller->cacheAction = array(
366
			'cache_parsing' => 21600
367
		);
368
 
369
		$this->Controller->cache_parsing();
370
 
371
		$View = new View($this->Controller);
372
		$result = $View->render('index');
373
 
374
		$this->assertNotRegExp('/cake:nocache/', $result);
375
		$this->assertNotRegExp('/php echo/', $result);
376
 
377
		$filename = CACHE . 'views' . DS . 'cache_test_cache_parsing.php';
378
		$this->assertTrue(file_exists($filename));
379
		unlink($filename);
380
	}
381
 
382
/**
383
 * Test that cacheAction works with camelcased controller names.
384
 *
385
 * @return void
386
 */
387
	public function testCacheActionArrayCamelCase() {
388
		$this->Controller->request->addParams(array(
389
			'controller' => 'cache_test',
390
			'action' => 'cache_parsing',
391
			'pass' => array(),
392
			'named' => array()
393
		));
394
		$this->Controller->cacheAction = array(
395
			'cache_parsing' => 21600
396
		);
397
		$this->Controller->request->here = '/cacheTest/cache_parsing';
398
		$this->Controller->cache_parsing();
399
 
400
		$View = new View($this->Controller);
401
		$result = $View->render('index');
402
 
403
		$this->assertNotRegExp('/cake:nocache/', $result);
404
		$this->assertNotRegExp('/php echo/', $result);
405
 
406
		$filename = CACHE . 'views' . DS . 'cachetest_cache_parsing.php';
407
		$this->assertTrue(file_exists($filename));
408
		unlink($filename);
409
	}
410
 
411
/**
412
 * test with named and pass args.
413
 *
414
 * @return void
415
 */
416
	public function testCacheWithNamedAndPassedArgs() {
417
		Router::reload();
418
 
419
		$this->Controller->cache_parsing();
420
		$this->Controller->request->addParams(array(
421
			'controller' => 'cache_test',
422
			'action' => 'cache_parsing',
423
			'pass' => array(1, 2),
424
			'named' => array(
425
				'name' => 'mark',
426
				'ice' => 'cream'
427
			)
428
		));
429
		$this->Controller->cacheAction = array(
430
			'cache_parsing' => 21600
431
		);
432
		$this->Controller->request->here = '/cache_test/cache_parsing/1/2/name:mark/ice:cream';
433
 
434
		$View = new View($this->Controller);
435
		$result = $View->render('index');
436
 
437
		$this->assertNotRegExp('/cake:nocache/', $result);
438
		$this->assertNotRegExp('/php echo/', $result);
439
 
440
		$filename = CACHE . 'views' . DS . 'cache_test_cache_parsing_1_2_name_mark_ice_cream.php';
441
		$this->assertTrue(file_exists($filename));
442
		unlink($filename);
443
	}
444
 
445
/**
446
 * Test that query string parameters are included in the cache filename.
447
 *
448
 * @return void
449
 */
450
	public function testCacheWithQueryStringParams() {
451
		Router::reload();
452
 
453
		$this->Controller->cache_parsing();
454
		$this->Controller->request->addParams(array(
455
			'controller' => 'cache_test',
456
			'action' => 'cache_parsing',
457
			'pass' => array(),
458
			'named' => array()
459
		));
460
		$this->Controller->request->query = array('q' => 'cakephp');
461
		$this->Controller->cacheAction = array(
462
			'cache_parsing' => 21600
463
		);
464
		$this->Controller->request->here = '/cache_test/cache_parsing';
465
 
466
		$View = new View($this->Controller);
467
		$result = $View->render('index');
468
 
469
		$this->assertNotRegExp('/cake:nocache/', $result);
470
		$this->assertNotRegExp('/php echo/', $result);
471
 
472
		$filename = CACHE . 'views' . DS . 'cache_test_cache_parsing_q_cakephp.php';
473
		$this->assertTrue(file_exists($filename), 'Missing cache file ' . $filename);
474
		unlink($filename);
475
	}
476
 
477
/**
478
 * test that custom routes are respected when generating cache files.
479
 *
480
 * @return void
481
 */
482
	public function testCacheWithCustomRoutes() {
483
		Router::reload();
484
		Router::connect('/:lang/:controller/:action/*', array(), array('lang' => '[a-z]{3}'));
485
 
486
		$this->Controller->cache_parsing();
487
		$this->Controller->request->addParams(array(
488
			'lang' => 'en',
489
			'controller' => 'cache_test',
490
			'action' => 'cache_parsing',
491
			'pass' => array(),
492
			'named' => array()
493
		));
494
		$this->Controller->cacheAction = array(
495
			'cache_parsing' => 21600
496
		);
497
		$this->Controller->request->here = '/en/cache_test/cache_parsing';
498
		$this->Controller->action = 'cache_parsing';
499
 
500
		$View = new View($this->Controller);
501
		$result = $View->render('index');
502
 
503
		$this->assertNotRegExp('/cake:nocache/', $result);
504
		$this->assertNotRegExp('/php echo/', $result);
505
 
506
		$filename = CACHE . 'views' . DS . 'en_cache_test_cache_parsing.php';
507
		$this->assertTrue(file_exists($filename));
508
		unlink($filename);
509
	}
510
 
511
/**
512
 * test ControllerName contains AppName
513
 *
514
 * This test verifies view cache is created correctly when the app name is contained in part of the controller name.
515
 * (webapp Name) base name is 'cache' controller is 'cacheTest' action is 'cache_name'
516
 * apps URL would look something like http://localhost/cache/cacheTest/cache_name
517
 *
518
 * @return void
519
 */
520
	public function testCacheBaseNameControllerName() {
521
		$this->Controller->cache_parsing();
522
		$this->Controller->cacheAction = array(
523
			'cache_name' => 21600
524
		);
525
		$this->Controller->params = array(
526
			'controller' => 'cacheTest',
527
			'action' => 'cache_name',
528
			'pass' => array(),
529
			'named' => array()
530
		);
531
		$this->Controller->here = '/cache/cacheTest/cache_name';
532
		$this->Controller->action = 'cache_name';
533
		$this->Controller->base = '/cache';
534
 
535
		$View = new View($this->Controller);
536
		$result = $View->render('index');
537
 
538
		$this->assertNotRegExp('/cake:nocache/', $result);
539
		$this->assertNotRegExp('/php echo/', $result);
540
 
541
		$filename = CACHE . 'views' . DS . 'cache_cachetest_cache_name.php';
542
		$this->assertTrue(file_exists($filename));
543
		unlink($filename);
544
	}
545
 
546
/**
547
 * test that afterRender checks the conditions correctly.
548
 *
549
 * @return void
550
 */
551
	public function testAfterRenderConditions() {
552
		Configure::write('Cache.check', true);
553
		$View = new View($this->Controller);
554
		$View->cacheAction = '+1 day';
555
		$View->output = 'test';
556
 
557
		$Cache = $this->getMock('CacheHelper', array('_parseContent'), array($View));
558
		$Cache->expects($this->once())
559
			->method('_parseContent')
560
			->with('posts/index', 'content')
561
			->will($this->returnValue(''));
562
 
563
		$Cache->afterRenderFile('posts/index', 'content');
564
 
565
		Configure::write('Cache.check', false);
566
		$Cache->afterRender('posts/index');
567
 
568
		Configure::write('Cache.check', true);
569
		$View->cacheAction = false;
570
		$Cache->afterRender('posts/index');
571
	}
572
 
573
/**
574
 * test that afterRender checks the conditions correctly.
575
 *
576
 * @return void
577
 */
578
	public function testAfterLayoutConditions() {
579
		Configure::write('Cache.check', true);
580
		$View = new View($this->Controller);
581
		$View->cacheAction = '+1 day';
582
		$View->output = 'test';
583
 
584
		$Cache = $this->getMock('CacheHelper', array('cache'), array($View));
585
		$Cache->expects($this->once())
586
			->method('cache')
587
			->with('posts/index', $View->output)
588
			->will($this->returnValue(''));
589
 
590
		$Cache->afterLayout('posts/index');
591
 
592
		Configure::write('Cache.check', false);
593
		$Cache->afterLayout('posts/index');
594
 
595
		Configure::write('Cache.check', true);
596
		$View->cacheAction = false;
597
		$Cache->afterLayout('posts/index');
598
	}
599
 
600
/**
601
 * testCacheEmptySections method
602
 *
603
 * This test must be uncommented/fixed in next release (1.2+)
604
 *
605
 * @return void
606
 */
607
	public function testCacheEmptySections() {
608
		$this->Controller->cache_parsing();
609
		$this->Controller->params = array(
610
			'controller' => 'cacheTest',
611
			'action' => 'cache_empty_sections',
612
			'pass' => array(),
613
			'named' => array()
614
		);
615
		$this->Controller->cacheAction = array('cache_empty_sections' => 21600);
616
		$this->Controller->here = '/cacheTest/cache_empty_sections';
617
		$this->Controller->action = 'cache_empty_sections';
618
		$this->Controller->layout = 'cache_empty_sections';
619
		$this->Controller->viewPath = 'Posts';
620
 
621
		$View = new View($this->Controller);
622
		$result = $View->render('cache_empty_sections');
623
		$this->assertNotRegExp('/nocache/', $result);
624
		$this->assertNotRegExp('/php echo/', $result);
625
		$this->assertRegExp(
626
			'@</title>\s*</head>\s*' .
627
			'<body>\s*' .
628
			'View Content\s*' .
629
			'cached count is: 3\s*' .
630
			'</body>@', $result);
631
 
632
		$filename = CACHE . 'views' . DS . 'cachetest_cache_empty_sections.php';
633
		$this->assertTrue(file_exists($filename));
634
		$contents = file_get_contents($filename);
635
		$this->assertNotRegExp('/nocache/', $contents);
636
		$this->assertRegExp(
637
			'@<head>\s*<title>Posts</title>\s*' .
638
			'<\?php \$x \= 1; \?>\s*' .
639
			'</head>\s*' .
640
			'<body>\s*' .
641
			'<\?php \$x\+\+; \?>\s*' .
642
			'<\?php \$x\+\+; \?>\s*' .
643
			'View Content\s*' .
644
			'<\?php \$y = 1; \?>\s*' .
645
			'<\?php echo \'cached count is: \' . \$x; \?>\s*' .
646
			'@', $contents);
647
		unlink($filename);
648
	}
649
}