Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
16591 anikendra 1
<?php
2
/**
3
 * HtmlHelperTest 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('Helper', 'View');
21
App::uses('AppHelper', 'View/Helper');
22
App::uses('HtmlHelper', 'View/Helper');
23
App::uses('FormHelper', 'View/Helper');
24
App::uses('ClassRegistry', 'Utility');
25
App::uses('Folder', 'Utility');
26
App::uses('CakePlugin', 'Core');
27
 
28
if (!defined('FULL_BASE_URL')) {
29
	define('FULL_BASE_URL', 'http://cakephp.org');
30
}
31
 
32
/**
33
 * TheHtmlTestController class
34
 *
35
 * @package       Cake.Test.Case.View.Helper
36
 */
37
class TheHtmlTestController extends Controller {
38
 
39
/**
40
 * name property
41
 *
42
 * @var string
43
 */
44
	public $name = 'TheTest';
45
 
46
/**
47
 * uses property
48
 *
49
 * @var mixed
50
 */
51
	public $uses = null;
52
}
53
 
54
class TestHtmlHelper extends HtmlHelper {
55
 
56
/**
57
 * expose a method as public
58
 *
59
 * @param string $options
60
 * @param string $exclude
61
 * @param string $insertBefore
62
 * @param string $insertAfter
63
 * @return void
64
 */
65
	public function parseAttributes($options, $exclude = null, $insertBefore = ' ', $insertAfter = null) {
66
		return $this->_parseAttributes($options, $exclude, $insertBefore, $insertAfter);
67
	}
68
 
69
/**
70
 * Get a protected attribute value
71
 *
72
 * @param string $attribute
73
 * @return mixed
74
 */
75
	public function getAttribute($attribute) {
76
		if (!isset($this->{$attribute})) {
77
			return null;
78
		}
79
		return $this->{$attribute};
80
	}
81
 
82
}
83
 
84
/**
85
 * Html5TestHelper class
86
 *
87
 * @package       Cake.Test.Case.View.Helper
88
 */
89
class Html5TestHelper extends TestHtmlHelper {
90
 
91
/**
92
 * Minimized
93
 *
94
 * @var array
95
 */
96
	protected $_minimizedAttributes = array('require', 'checked');
97
 
98
/**
99
 * Allow compact use in HTML
100
 *
101
 * @var string
102
 */
103
	protected $_minimizedAttributeFormat = '%s';
104
 
105
/**
106
 * Test to attribute format
107
 *
108
 * @var string
109
 */
110
	protected $_attributeFormat = 'data-%s="%s"';
111
}
112
 
113
/**
114
 * HtmlHelperTest class
115
 *
116
 * @package       Cake.Test.Case.View.Helper
117
 */
118
class HtmlHelperTest extends CakeTestCase {
119
 
120
/**
121
 * Regexp for CDATA start block
122
 *
123
 * @var string
124
 */
125
	public $cDataStart = 'preg:/^\/\/<!\[CDATA\[[\n\r]*/';
126
 
127
/**
128
 * Regexp for CDATA end block
129
 *
130
 * @var string
131
 */
132
	public $cDataEnd = 'preg:/[^\]]*\]\]\>[\s\r\n]*/';
133
 
134
/**
135
 * html property
136
 *
137
 * @var object
138
 */
139
	public $Html = null;
140
 
141
/**
142
 * setUp method
143
 *
144
 * @return void
145
 */
146
	public function setUp() {
147
		parent::setUp();
148
		$this->View = $this->getMock('View', array('append'), array(new TheHtmlTestController()));
149
		$this->Html = new TestHtmlHelper($this->View);
150
		$this->Html->request = new CakeRequest(null, false);
151
		$this->Html->request->webroot = '';
152
 
153
		App::build(array(
154
			'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
155
		));
156
 
157
		Configure::write('Asset.timestamp', false);
158
	}
159
 
160
/**
161
 * tearDown method
162
 *
163
 * @return void
164
 */
165
	public function tearDown() {
166
		parent::tearDown();
167
		unset($this->Html, $this->View);
168
	}
169
 
170
/**
171
 * testDocType method
172
 *
173
 * @return void
174
 */
175
	public function testDocType() {
176
		$result = $this->Html->docType();
177
		$expected = '<!DOCTYPE html>';
178
		$this->assertEquals($expected, $result);
179
 
180
		$result = $this->Html->docType('html4-strict');
181
		$expected = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">';
182
		$this->assertEquals($expected, $result);
183
 
184
		$this->assertNull($this->Html->docType('non-existing-doctype'));
185
	}
186
 
187
/**
188
 * testLink method
189
 *
190
 * @return void
191
 */
192
	public function testLink() {
193
		Router::connect('/:controller/:action/*');
194
 
195
		$this->Html->request->webroot = '';
196
 
197
		$result = $this->Html->link('/home');
198
		$expected = array('a' => array('href' => '/home'), 'preg:/\/home/', '/a');
199
		$this->assertTags($result, $expected);
200
 
201
		$result = $this->Html->link(array('action' => 'login', '<[You]>'));
202
		$expected = array(
203
			'a' => array('href' => '/login/%3C%5BYou%5D%3E'),
204
			'preg:/\/login\/&lt;\[You\]&gt;/',
205
			'/a'
206
		);
207
		$this->assertTags($result, $expected);
208
 
209
		Router::reload();
210
 
211
		$result = $this->Html->link('Posts', array('controller' => 'posts', 'action' => 'index', 'full_base' => true));
212
		$expected = array('a' => array('href' => Router::fullBaseUrl() . '/posts'), 'Posts', '/a');
213
		$this->assertTags($result, $expected);
214
 
215
		$result = $this->Html->link('Home', '/home', array('confirm' => 'Are you sure you want to do this?'));
216
		$expected = array(
217
			'a' => array('href' => '/home', 'onclick' => 'if (confirm(&quot;Are you sure you want to do this?&quot;)) { return true; } return false;'),
218
			'Home',
219
			'/a'
220
		);
221
		$this->assertTags($result, $expected);
222
 
223
		$result = $this->Html->link('Home', '/home', array('escape' => false, 'confirm' => 'Confirm\'s "nightmares"'));
224
		$expected = array(
225
			'a' => array('href' => '/home', 'onclick' => 'if (confirm(&quot;Confirm&#039;s \&quot;nightmares\&quot;&quot;)) { return true; } return false;'),
226
			'Home',
227
			'/a'
228
		);
229
		$this->assertTags($result, $expected);
230
 
231
		$result = $this->Html->link('Home', '/home', array('default' => false));
232
		$expected = array(
233
			'a' => array('href' => '/home', 'onclick' => 'event.returnValue = false; return false;'),
234
			'Home',
235
			'/a'
236
		);
237
		$this->assertTags($result, $expected);
238
 
239
		$result = $this->Html->link('Home', '/home', array('default' => false, 'onclick' => 'someFunction();'));
240
		$expected = array(
241
			'a' => array('href' => '/home', 'onclick' => 'someFunction(); event.returnValue = false; return false;'),
242
			'Home',
243
			'/a'
244
		);
245
		$this->assertTags($result, $expected);
246
 
247
		$result = $this->Html->link('Next >', '#');
248
		$expected = array(
249
			'a' => array('href' => '#'),
250
			'Next &gt;',
251
			'/a'
252
		);
253
		$this->assertTags($result, $expected);
254
 
255
		$result = $this->Html->link('Next >', '#', array('escape' => true));
256
		$expected = array(
257
			'a' => array('href' => '#'),
258
			'Next &gt;',
259
			'/a'
260
		);
261
		$this->assertTags($result, $expected);
262
 
263
		$result = $this->Html->link('Next >', '#', array('escape' => 'utf-8'));
264
		$expected = array(
265
			'a' => array('href' => '#'),
266
			'Next &gt;',
267
			'/a'
268
		);
269
		$this->assertTags($result, $expected);
270
 
271
		$result = $this->Html->link('Next >', '#', array('escape' => false));
272
		$expected = array(
273
			'a' => array('href' => '#'),
274
			'Next >',
275
			'/a'
276
		);
277
		$this->assertTags($result, $expected);
278
 
279
		$result = $this->Html->link('Next >', '#', array(
280
			'title' => 'to escape &#8230; or not escape?',
281
			'escape' => false
282
		));
283
		$expected = array(
284
			'a' => array('href' => '#', 'title' => 'to escape &#8230; or not escape?'),
285
			'Next >',
286
			'/a'
287
		);
288
		$this->assertTags($result, $expected);
289
 
290
		$result = $this->Html->link('Next >', '#', array(
291
			'title' => 'to escape &#8230; or not escape?',
292
			'escape' => true
293
		));
294
		$expected = array(
295
			'a' => array('href' => '#', 'title' => 'to escape &amp;#8230; or not escape?'),
296
			'Next &gt;',
297
			'/a'
298
		);
299
		$this->assertTags($result, $expected);
300
 
301
		$result = $this->Html->link('Next >', '#', array(
302
			'title' => 'Next >',
303
			'escapeTitle' => false
304
		));
305
		$expected = array(
306
			'a' => array('href' => '#', 'title' => 'Next &gt;'),
307
			'Next >',
308
			'/a'
309
		);
310
		$this->assertTags($result, $expected);
311
 
312
		$result = $this->Html->link('Original size', array(
313
			'controller' => 'images', 'action' => 'view', 3, '?' => array('height' => 100, 'width' => 200)
314
		));
315
		$expected = array(
316
			'a' => array('href' => '/images/view/3?height=100&amp;width=200'),
317
			'Original size',
318
			'/a'
319
		);
320
		$this->assertTags($result, $expected);
321
 
322
		Configure::write('Asset.timestamp', false);
323
 
324
		$result = $this->Html->link($this->Html->image('test.gif'), '#', array('escape' => false));
325
		$expected = array(
326
			'a' => array('href' => '#'),
327
			'img' => array('src' => 'img/test.gif', 'alt' => ''),
328
			'/a'
329
		);
330
		$this->assertTags($result, $expected);
331
 
332
		$result = $this->Html->link($this->Html->image('test.gif'), '#', array(
333
			'title' => 'hey "howdy"',
334
			'escapeTitle' => false
335
		));
336
		$expected = array(
337
			'a' => array('href' => '#', 'title' => 'hey &quot;howdy&quot;'),
338
			'img' => array('src' => 'img/test.gif', 'alt' => ''),
339
			'/a'
340
		);
341
		$this->assertTags($result, $expected);
342
 
343
		$result = $this->Html->image('test.gif', array('url' => '#'));
344
		$expected = array(
345
			'a' => array('href' => '#'),
346
			'img' => array('src' => 'img/test.gif', 'alt' => ''),
347
			'/a'
348
		);
349
		$this->assertTags($result, $expected);
350
 
351
		$result = $this->Html->link($this->Html->image('../favicon.ico'), '#', array('escape' => false));
352
		$expected = array(
353
			'a' => array('href' => '#'),
354
			'img' => array('src' => 'img/../favicon.ico', 'alt' => ''),
355
			'/a'
356
		);
357
		$this->assertTags($result, $expected);
358
 
359
		$result = $this->Html->image('../favicon.ico', array('url' => '#'));
360
		$expected = array(
361
			'a' => array('href' => '#'),
362
			'img' => array('src' => 'img/../favicon.ico', 'alt' => ''),
363
			'/a'
364
		);
365
		$this->assertTags($result, $expected);
366
 
367
		$result = $this->Html->link('http://www.example.org?param1=value1&param2=value2');
368
		$expected = array('a' => array('href' => 'http://www.example.org?param1=value1&amp;param2=value2'), 'http://www.example.org?param1=value1&amp;param2=value2', '/a');
369
		$this->assertTags($result, $expected);
370
 
371
		$result = $this->Html->link('alert', 'javascript:alert(\'cakephp\');');
372
		$expected = array('a' => array('href' => 'javascript:alert(&#039;cakephp&#039;);'), 'alert', '/a');
373
		$this->assertTags($result, $expected);
374
 
375
		$result = $this->Html->link('write me', 'mailto:example@cakephp.org');
376
		$expected = array('a' => array('href' => 'mailto:example@cakephp.org'), 'write me', '/a');
377
		$this->assertTags($result, $expected);
378
 
379
		$result = $this->Html->link('call me on 0123465-798', 'tel:0123465-798');
380
		$expected = array('a' => array('href' => 'tel:0123465-798'), 'call me on 0123465-798', '/a');
381
		$this->assertTags($result, $expected);
382
 
383
		$result = $this->Html->link('text me on 0123465-798', 'sms:0123465-798');
384
		$expected = array('a' => array('href' => 'sms:0123465-798'), 'text me on 0123465-798', '/a');
385
		$this->assertTags($result, $expected);
386
 
387
		$result = $this->Html->link('say hello to 0123465-798', 'sms:0123465-798?body=hello there');
388
		$expected = array('a' => array('href' => 'sms:0123465-798?body=hello there'), 'say hello to 0123465-798', '/a');
389
		$this->assertTags($result, $expected);
390
 
391
		$result = $this->Html->link('say hello to 0123465-798', 'sms:0123465-798?body=hello "cakephp"');
392
		$expected = array('a' => array('href' => 'sms:0123465-798?body=hello &quot;cakephp&quot;'), 'say hello to 0123465-798', '/a');
393
		$this->assertTags($result, $expected);
394
	}
395
 
396
/**
397
 * testImageTag method
398
 *
399
 * @return void
400
 */
401
	public function testImageTag() {
402
		$this->Html->request->webroot = '';
403
 
404
		$result = $this->Html->image('test.gif');
405
		$this->assertTags($result, array('img' => array('src' => 'img/test.gif', 'alt' => '')));
406
 
407
		$result = $this->Html->image('http://google.com/logo.gif');
408
		$this->assertTags($result, array('img' => array('src' => 'http://google.com/logo.gif', 'alt' => '')));
409
 
410
		$result = $this->Html->image('//google.com/logo.gif');
411
		$this->assertTags($result, array('img' => array('src' => '//google.com/logo.gif', 'alt' => '')));
412
 
413
		$result = $this->Html->image(array('controller' => 'test', 'action' => 'view', 1, 'ext' => 'gif'));
414
		$this->assertTags($result, array('img' => array('src' => '/test/view/1.gif', 'alt' => '')));
415
 
416
		$result = $this->Html->image('/test/view/1.gif');
417
		$this->assertTags($result, array('img' => array('src' => '/test/view/1.gif', 'alt' => '')));
418
	}
419
 
420
/**
421
 * Test image() with query strings.
422
 *
423
 * @return void
424
 */
425
	public function testImageQueryString() {
426
		$result = $this->Html->image('test.gif?one=two&three=four');
427
		$this->assertTags($result, array('img' => array('src' => 'img/test.gif?one=two&amp;three=four', 'alt' => '')));
428
 
429
		$result = $this->Html->image(array(
430
			'controller' => 'images',
431
			'action' => 'display',
432
			'test',
433
			'?' => array('one' => 'two', 'three' => 'four')
434
		));
435
		$this->assertTags($result, array('img' => array('src' => '/images/display/test?one=two&amp;three=four', 'alt' => '')));
436
	}
437
 
438
/**
439
 * Test that image works with pathPrefix.
440
 *
441
 * @return void
442
 */
443
	public function testImagePathPrefix() {
444
		$result = $this->Html->image('test.gif', array('pathPrefix' => '/my/custom/path/'));
445
		$this->assertTags($result, array('img' => array('src' => '/my/custom/path/test.gif', 'alt' => '')));
446
 
447
		$result = $this->Html->image('test.gif', array('pathPrefix' => 'http://cakephp.org/assets/img/'));
448
		$this->assertTags($result, array('img' => array('src' => 'http://cakephp.org/assets/img/test.gif', 'alt' => '')));
449
 
450
		$result = $this->Html->image('test.gif', array('pathPrefix' => '//cakephp.org/assets/img/'));
451
		$this->assertTags($result, array('img' => array('src' => '//cakephp.org/assets/img/test.gif', 'alt' => '')));
452
 
453
		$previousConfig = Configure::read('App.imageBaseUrl');
454
		Configure::write('App.imageBaseUrl', '//cdn.cakephp.org/img/');
455
		$result = $this->Html->image('test.gif');
456
		$this->assertTags($result, array('img' => array('src' => '//cdn.cakephp.org/img/test.gif', 'alt' => '')));
457
		Configure::write('App.imageBaseUrl', $previousConfig);
458
	}
459
 
460
/**
461
 * Test that image() works with fullBase and a webroot not equal to /
462
 *
463
 * @return void
464
 */
465
	public function testImageWithFullBase() {
466
		$result = $this->Html->image('test.gif', array('fullBase' => true));
467
		$here = $this->Html->url('/', true);
468
		$this->assertTags($result, array('img' => array('src' => $here . 'img/test.gif', 'alt' => '')));
469
 
470
		$result = $this->Html->image('sub/test.gif', array('fullBase' => true));
471
		$here = $this->Html->url('/', true);
472
		$this->assertTags($result, array('img' => array('src' => $here . 'img/sub/test.gif', 'alt' => '')));
473
 
474
		$request = $this->Html->request;
475
		$request->webroot = '/myproject/';
476
		$request->base = '/myproject';
477
		Router::setRequestInfo($request);
478
 
479
		$result = $this->Html->image('sub/test.gif', array('fullBase' => true));
480
		$here = $this->Html->url('/', true);
481
		$this->assertTags($result, array('img' => array('src' => $here . 'img/sub/test.gif', 'alt' => '')));
482
	}
483
 
484
/**
485
 * test image() with Asset.timestamp
486
 *
487
 * @return void
488
 */
489
	public function testImageWithTimestampping() {
490
		Configure::write('Asset.timestamp', 'force');
491
 
492
		$this->Html->request->webroot = '/';
493
		$result = $this->Html->image('cake.icon.png');
494
		$this->assertTags($result, array('img' => array('src' => 'preg:/\/img\/cake\.icon\.png\?\d+/', 'alt' => '')));
495
 
496
		Configure::write('debug', 0);
497
		Configure::write('Asset.timestamp', 'force');
498
 
499
		$result = $this->Html->image('cake.icon.png');
500
		$this->assertTags($result, array('img' => array('src' => 'preg:/\/img\/cake\.icon\.png\?\d+/', 'alt' => '')));
501
 
502
		$this->Html->request->webroot = '/testing/longer/';
503
		$result = $this->Html->image('cake.icon.png');
504
		$expected = array(
505
			'img' => array('src' => 'preg:/\/testing\/longer\/img\/cake\.icon\.png\?[0-9]+/', 'alt' => '')
506
		);
507
		$this->assertTags($result, $expected);
508
	}
509
 
510
/**
511
 * Tests creation of an image tag using a theme and asset timestamping
512
 *
513
 * @return void
514
 */
515
	public function testImageTagWithTheme() {
516
		$this->skipIf(!is_writable(WWW_ROOT), 'Cannot write to webroot.');
517
		$themeExists = is_dir(WWW_ROOT . 'theme');
518
 
519
		App::uses('File', 'Utility');
520
 
521
		$testfile = WWW_ROOT . 'theme' . DS . 'test_theme' . DS . 'img' . DS . '__cake_test_image.gif';
522
		new File($testfile, true);
523
 
524
		App::build(array(
525
			'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
526
		));
527
		Configure::write('Asset.timestamp', true);
528
		Configure::write('debug', 1);
529
 
530
		$this->Html->request->webroot = '/';
531
		$this->Html->theme = 'test_theme';
532
		$result = $this->Html->image('__cake_test_image.gif');
533
		$this->assertTags($result, array(
534
			'img' => array(
535
				'src' => 'preg:/\/theme\/test_theme\/img\/__cake_test_image\.gif\?\d+/',
536
				'alt' => ''
537
		)));
538
 
539
		$this->Html->request->webroot = '/testing/';
540
		$result = $this->Html->image('__cake_test_image.gif');
541
 
542
		$this->assertTags($result, array(
543
			'img' => array(
544
				'src' => 'preg:/\/testing\/theme\/test_theme\/img\/__cake_test_image\.gif\?\d+/',
545
				'alt' => ''
546
		)));
547
 
548
		$dir = new Folder(WWW_ROOT . 'theme' . DS . 'test_theme');
549
		$dir->delete();
550
		if (!$themeExists) {
551
			$dir = new Folder(WWW_ROOT . 'theme');
552
			$dir->delete();
553
		}
554
	}
555
 
556
/**
557
 * test theme assets in main webroot path
558
 *
559
 * @return void
560
 */
561
	public function testThemeAssetsInMainWebrootPath() {
562
		App::build(array(
563
			'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
564
		));
565
		$webRoot = Configure::read('App.www_root');
566
		Configure::write('App.www_root', CAKE . 'Test' . DS . 'test_app' . DS . 'webroot' . DS);
567
 
568
		$this->Html->theme = 'test_theme';
569
		$result = $this->Html->css('webroot_test');
570
		$expected = array(
571
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*theme\/test_theme\/css\/webroot_test\.css/')
572
		);
573
		$this->assertTags($result, $expected);
574
 
575
		$this->Html->theme = 'test_theme';
576
		$result = $this->Html->css('theme_webroot');
577
		$expected = array(
578
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*theme\/test_theme\/css\/theme_webroot\.css/')
579
		);
580
		$this->assertTags($result, $expected);
581
 
582
		Configure::write('App.www_root', $webRoot);
583
	}
584
 
585
/**
586
 * testStyle method
587
 *
588
 * @return void
589
 */
590
	public function testStyle() {
591
		$result = $this->Html->style('display: none;');
592
		$this->assertEquals('display: none;', $result);
593
 
594
		$result = $this->Html->style(array('display' => 'none', 'margin' => '10px'));
595
		$expected = 'display:none; margin:10px;';
596
		$this->assertRegExp('/^display\s*:\s*none\s*;\s*margin\s*:\s*10px\s*;?$/', $expected);
597
 
598
		$result = $this->Html->style(array('display' => 'none', 'margin' => '10px'), false);
599
		$lines = explode("\n", $result);
600
		$this->assertRegExp('/^\s*display\s*:\s*none\s*;\s*$/', $lines[0]);
601
		$this->assertRegExp('/^\s*margin\s*:\s*10px\s*;?$/', $lines[1]);
602
	}
603
 
604
/**
605
 * testCssLink method
606
 *
607
 * @return void
608
 */
609
	public function testCssLink() {
610
		Configure::write('Asset.filter.css', false);
611
 
612
		$result = $this->Html->css('screen');
613
		$expected = array(
614
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*css\/screen\.css/')
615
		);
616
		$this->assertTags($result, $expected);
617
 
618
		$result = $this->Html->css('screen.css');
619
		$this->assertTags($result, $expected);
620
 
621
		CakePlugin::load('TestPlugin');
622
		$result = $this->Html->css('TestPlugin.style', array('plugin' => false));
623
		$expected['link']['href'] = 'preg:/.*css\/TestPlugin\.style\.css/';
624
		$this->assertTags($result, $expected);
625
		CakePlugin::unload('TestPlugin');
626
 
627
		$result = $this->Html->css('my.css.library');
628
		$expected['link']['href'] = 'preg:/.*css\/my\.css\.library\.css/';
629
		$this->assertTags($result, $expected);
630
 
631
		$result = $this->Html->css('screen.css?1234');
632
		$expected['link']['href'] = 'preg:/.*css\/screen\.css\?1234/';
633
		$this->assertTags($result, $expected);
634
 
635
		$result = $this->Html->css('screen.css?with=param&other=param');
636
		$expected['link']['href'] = 'css/screen.css?with=param&amp;other=param';
637
		$this->assertTags($result, $expected);
638
 
639
		$result = $this->Html->css('http://whatever.com/screen.css?1234');
640
		$expected['link']['href'] = 'preg:/http:\/\/.*\/screen\.css\?1234/';
641
		$this->assertTags($result, $expected);
642
 
643
		$result = $this->Html->css('cake.generic', array('pathPrefix' => '/my/custom/path/'));
644
		$expected['link']['href'] = '/my/custom/path/cake.generic.css';
645
		$this->assertTags($result, $expected);
646
 
647
		$result = $this->Html->css('cake.generic', array('pathPrefix' => 'http://cakephp.org/assets/css/'));
648
		$expected['link']['href'] = 'http://cakephp.org/assets/css/cake.generic.css';
649
		$this->assertTags($result, $expected);
650
 
651
		$previousConfig = Configure::read('App.cssBaseUrl');
652
		Configure::write('App.cssBaseUrl', '//cdn.cakephp.org/css/');
653
		$result = $this->Html->css('cake.generic');
654
		$expected['link']['href'] = '//cdn.cakephp.org/css/cake.generic.css';
655
		$this->assertTags($result, $expected);
656
		Configure::write('App.cssBaseUrl', $previousConfig);
657
 
658
		Configure::write('Asset.filter.css', 'css.php');
659
		$result = $this->Html->css('cake.generic');
660
		$expected['link']['href'] = 'preg:/.*ccss\/cake\.generic\.css/';
661
		$this->assertTags($result, $expected);
662
 
663
		$result = $this->Html->css('//example.com/css/cake.generic.css');
664
		$expected['link']['href'] = 'preg:/.*example\.com\/css\/cake\.generic\.css/';
665
		$this->assertTags($result, $expected);
666
 
667
		Configure::write('Asset.filter.css', false);
668
 
669
		$result = explode("\n", trim($this->Html->css(array('cake.generic', 'vendor.generic'))));
670
		$expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css/';
671
		$this->assertTags($result[0], $expected);
672
		$expected['link']['href'] = 'preg:/.*css\/vendor\.generic\.css/';
673
		$this->assertTags($result[1], $expected);
674
		$this->assertEquals(2, count($result));
675
 
676
		$this->View->expects($this->at(0))
677
			->method('append')
678
			->with('css', $this->matchesRegularExpression('/css_in_head.css/'));
679
 
680
		$this->View->expects($this->at(1))
681
			->method('append')
682
			->with('css', $this->matchesRegularExpression('/more_css_in_head.css/'));
683
 
684
		$result = $this->Html->css('css_in_head', array('inline' => false));
685
		$this->assertNull($result);
686
 
687
		$result = $this->Html->css('more_css_in_head', array('inline' => false));
688
		$this->assertNull($result);
689
 
690
		$result = $this->Html->css('screen', array('rel' => 'import'));
691
		$expected = array(
692
			'style' => array('type' => 'text/css'),
693
			'preg:/@import url\(.*css\/screen\.css\);/',
694
			'/style'
695
		);
696
		$this->assertTags($result, $expected);
697
	}
698
 
699
/**
700
 * Test css() with once option.
701
 *
702
 * @return void
703
 */
704
	public function testCssLinkOnce() {
705
		Configure::write('Asset.filter.css', false);
706
 
707
		$result = $this->Html->css('screen', array('once' => true));
708
		$expected = array(
709
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*css\/screen\.css/')
710
		);
711
		$this->assertTags($result, $expected);
712
 
713
		$result = $this->Html->css('screen', array('once' => true));
714
		$this->assertEquals('', $result);
715
 
716
		// Default is once=false
717
		$result = $this->Html->css('screen');
718
		$expected = array(
719
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*css\/screen\.css/')
720
		);
721
		$this->assertTags($result, $expected);
722
	}
723
 
724
/**
725
 * Test css link BC usage
726
 *
727
 * @return void
728
 */
729
	public function testCssLinkBC() {
730
		Configure::write('Asset.filter.css', false);
731
 
732
		CakePlugin::load('TestPlugin');
733
		$result = $this->Html->css('TestPlugin.style', null, array('plugin' => false));
734
		$expected = array(
735
			'link' => array(
736
				'rel' => 'stylesheet',
737
				'type' => 'text/css',
738
				'href' => 'preg:/.*css\/TestPlugin\.style\.css/'
739
			)
740
		);
741
		$this->assertTags($result, $expected);
742
		CakePlugin::unload('TestPlugin');
743
 
744
		$result = $this->Html->css('screen', 'import');
745
		$expected = array(
746
			'style' => array('type' => 'text/css'),
747
			'preg:/@import url\(.*css\/screen\.css\);/',
748
			'/style'
749
		);
750
		$this->assertTags($result, $expected);
751
 
752
		$result = $this->Html->css('css_in_head', null, array('inline' => false));
753
		$this->assertNull($result);
754
 
755
		$result = $this->Html->css('more_css_in_head', null, array('inline' => false));
756
		$this->assertNull($result);
757
	}
758
 
759
/**
760
 * testCssWithFullBase method
761
 *
762
 * @return void
763
 */
764
	public function testCssWithFullBase() {
765
		Configure::write('Asset.filter.css', false);
766
		$here = $this->Html->url('/', true);
767
 
768
		$result = $this->Html->css('screen', null, array('fullBase' => true));
769
		$expected = array(
770
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => $here . 'css/screen.css')
771
		);
772
		$this->assertTags($result, $expected);
773
	}
774
 
775
/**
776
 * testPluginCssLink method
777
 *
778
 * @return void
779
 */
780
	public function testPluginCssLink() {
781
		Configure::write('Asset.filter.css', false);
782
		CakePlugin::load('TestPlugin');
783
 
784
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
785
		$expected = array(
786
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => 'preg:/.*test_plugin\/css\/test_plugin_asset\.css/')
787
		);
788
		$this->assertTags($result, $expected);
789
 
790
		$result = $this->Html->css('TestPlugin.test_plugin_asset.css');
791
		$this->assertTags($result, $expected);
792
 
793
		$result = $this->Html->css('TestPlugin.my.css.library');
794
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/my\.css\.library\.css/';
795
		$this->assertTags($result, $expected);
796
 
797
		$result = $this->Html->css('TestPlugin.test_plugin_asset.css?1234');
798
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/test_plugin_asset\.css\?1234/';
799
		$this->assertTags($result, $expected);
800
 
801
		Configure::write('Asset.filter.css', 'css.php');
802
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
803
		$expected['link']['href'] = 'preg:/.*test_plugin\/ccss\/test_plugin_asset\.css/';
804
		$this->assertTags($result, $expected);
805
 
806
		Configure::write('Asset.filter.css', false);
807
 
808
		$result = explode("\n", trim($this->Html->css(array('TestPlugin.test_plugin_asset', 'TestPlugin.vendor.generic'))));
809
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/test_plugin_asset\.css/';
810
		$this->assertTags($result[0], $expected);
811
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/vendor\.generic\.css/';
812
		$this->assertTags($result[1], $expected);
813
		$this->assertEquals(2, count($result));
814
 
815
		CakePlugin::unload('TestPlugin');
816
	}
817
 
818
/**
819
 * test use of css() and timestamping
820
 *
821
 * @return void
822
 */
823
	public function testCssTimestamping() {
824
		Configure::write('debug', 2);
825
		Configure::write('Asset.timestamp', true);
826
 
827
		$expected = array(
828
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => '')
829
		);
830
 
831
		$result = $this->Html->css('cake.generic');
832
		$expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css\?[0-9]+/';
833
		$this->assertTags($result, $expected);
834
 
835
		Configure::write('debug', 0);
836
 
837
		$result = $this->Html->css('cake.generic');
838
		$expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css/';
839
		$this->assertTags($result, $expected);
840
 
841
		Configure::write('Asset.timestamp', 'force');
842
 
843
		$result = $this->Html->css('cake.generic');
844
		$expected['link']['href'] = 'preg:/.*css\/cake\.generic\.css\?[0-9]+/';
845
		$this->assertTags($result, $expected);
846
 
847
		$this->Html->request->webroot = '/testing/';
848
		$result = $this->Html->css('cake.generic');
849
		$expected['link']['href'] = 'preg:/\/testing\/css\/cake\.generic\.css\?[0-9]+/';
850
		$this->assertTags($result, $expected);
851
 
852
		$this->Html->request->webroot = '/testing/longer/';
853
		$result = $this->Html->css('cake.generic');
854
		$expected['link']['href'] = 'preg:/\/testing\/longer\/css\/cake\.generic\.css\?[0-9]+/';
855
		$this->assertTags($result, $expected);
856
	}
857
 
858
/**
859
 * test use of css() and timestamping with plugin syntax
860
 *
861
 * @return void
862
 */
863
	public function testPluginCssTimestamping() {
864
		CakePlugin::load('TestPlugin');
865
 
866
		Configure::write('debug', 2);
867
		Configure::write('Asset.timestamp', true);
868
 
869
		$expected = array(
870
			'link' => array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => '')
871
		);
872
 
873
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
874
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/test_plugin_asset\.css\?[0-9]+/';
875
		$this->assertTags($result, $expected);
876
 
877
		Configure::write('debug', 0);
878
 
879
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
880
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/test_plugin_asset\.css/';
881
		$this->assertTags($result, $expected);
882
 
883
		Configure::write('Asset.timestamp', 'force');
884
 
885
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
886
		$expected['link']['href'] = 'preg:/.*test_plugin\/css\/test_plugin_asset\.css\?[0-9]+/';
887
		$this->assertTags($result, $expected);
888
 
889
		$this->Html->request->webroot = '/testing/';
890
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
891
		$expected['link']['href'] = 'preg:/\/testing\/test_plugin\/css\/test_plugin_asset\.css\?[0-9]+/';
892
		$this->assertTags($result, $expected);
893
 
894
		$this->Html->request->webroot = '/testing/longer/';
895
		$result = $this->Html->css('TestPlugin.test_plugin_asset');
896
		$expected['link']['href'] = 'preg:/\/testing\/longer\/test_plugin\/css\/test_plugin_asset\.css\?[0-9]+/';
897
		$this->assertTags($result, $expected);
898
 
899
		CakePlugin::unload('TestPlugin');
900
	}
901
 
902
/**
903
 * Resource names must be treated differently for css() and script()
904
 *
905
 * @return void
906
 */
907
	public function testBufferedCssAndScriptWithIdenticalResourceName() {
908
		$this->View->expects($this->at(0))
909
			->method('append')
910
			->with('css', $this->stringContains('test.min.css'));
911
		$this->View->expects($this->at(1))
912
			->method('append')
913
			->with('script', $this->stringContains('test.min.js'));
914
		$this->Html->css('test.min', array('inline' => false));
915
		$this->Html->script('test.min', array('inline' => false));
916
	}
917
 
918
/**
919
 * test timestamp enforcement for script tags.
920
 *
921
 * @return void
922
 */
923
	public function testScriptTimestamping() {
924
		$this->skipIf(!is_writable(WWW_ROOT . 'js'), 'webroot/js is not Writable, timestamp testing has been skipped.');
925
 
926
		Configure::write('debug', 2);
927
		Configure::write('Asset.timestamp', true);
928
 
929
		touch(WWW_ROOT . 'js' . DS . '__cake_js_test.js');
930
		$timestamp = substr(strtotime('now'), 0, 8);
931
 
932
		$result = $this->Html->script('__cake_js_test', array('inline' => true, 'once' => false));
933
		$this->assertRegExp('/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"/', $result, 'Timestamp value not found %s');
934
 
935
		Configure::write('debug', 0);
936
		Configure::write('Asset.timestamp', 'force');
937
		$result = $this->Html->script('__cake_js_test', array('inline' => true, 'once' => false));
938
		$this->assertRegExp('/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"/', $result, 'Timestamp value not found %s');
939
		unlink(WWW_ROOT . 'js' . DS . '__cake_js_test.js');
940
		Configure::write('Asset.timestamp', false);
941
	}
942
 
943
/**
944
 * test timestamp enforcement for script tags with plugin syntax.
945
 *
946
 * @return void
947
 */
948
	public function testPluginScriptTimestamping() {
949
		CakePlugin::load('TestPlugin');
950
 
951
		$pluginPath = CakePlugin::path('TestPlugin');
952
		$pluginJsPath = $pluginPath . 'webroot/js';
953
		$this->skipIf(!is_writable($pluginJsPath), $pluginJsPath . ' is not Writable, timestamp testing has been skipped.');
954
 
955
		Configure::write('debug', 2);
956
		Configure::write('Asset.timestamp', true);
957
 
958
		touch($pluginJsPath . DS . '__cake_js_test.js');
959
		$timestamp = substr(strtotime('now'), 0, 8);
960
 
961
		$result = $this->Html->script('TestPlugin.__cake_js_test', array('inline' => true, 'once' => false));
962
		$this->assertRegExp('/test_plugin\/js\/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"/', $result, 'Timestamp value not found %s');
963
 
964
		Configure::write('debug', 0);
965
		Configure::write('Asset.timestamp', 'force');
966
		$result = $this->Html->script('TestPlugin.__cake_js_test', array('inline' => true, 'once' => false));
967
		$this->assertRegExp('/test_plugin\/js\/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"/', $result, 'Timestamp value not found %s');
968
		unlink($pluginJsPath . DS . '__cake_js_test.js');
969
		Configure::write('Asset.timestamp', false);
970
 
971
		CakePlugin::unload('TestPlugin');
972
	}
973
 
974
/**
975
 * test that scripts added with uses() are only ever included once.
976
 * test script tag generation
977
 *
978
 * @return void
979
 */
980
	public function testScript() {
981
		$result = $this->Html->script('foo');
982
		$expected = array(
983
			'script' => array('type' => 'text/javascript', 'src' => 'js/foo.js')
984
		);
985
		$this->assertTags($result, $expected);
986
 
987
		$result = $this->Html->script(array('foobar', 'bar'));
988
		$expected = array(
989
			array('script' => array('type' => 'text/javascript', 'src' => 'js/foobar.js')),
990
			'/script',
991
			array('script' => array('type' => 'text/javascript', 'src' => 'js/bar.js')),
992
			'/script',
993
		);
994
		$this->assertTags($result, $expected);
995
 
996
		$result = $this->Html->script('jquery-1.3');
997
		$expected = array(
998
			'script' => array('type' => 'text/javascript', 'src' => 'js/jquery-1.3.js')
999
		);
1000
		$this->assertTags($result, $expected);
1001
 
1002
		$result = $this->Html->script('test.json');
1003
		$expected = array(
1004
			'script' => array('type' => 'text/javascript', 'src' => 'js/test.json.js')
1005
		);
1006
		$this->assertTags($result, $expected);
1007
 
1008
		$result = $this->Html->script('http://example.com/test.json');
1009
		$expected = array(
1010
			'script' => array('type' => 'text/javascript', 'src' => 'http://example.com/test.json')
1011
		);
1012
		$this->assertTags($result, $expected);
1013
 
1014
		$result = $this->Html->script('/plugin/js/jquery-1.3.2.js?someparam=foo');
1015
		$expected = array(
1016
			'script' => array('type' => 'text/javascript', 'src' => '/plugin/js/jquery-1.3.2.js?someparam=foo')
1017
		);
1018
		$this->assertTags($result, $expected);
1019
 
1020
		$result = $this->Html->script('test.json.js?foo=bar');
1021
		$expected = array(
1022
			'script' => array('type' => 'text/javascript', 'src' => 'js/test.json.js?foo=bar')
1023
		);
1024
		$this->assertTags($result, $expected);
1025
 
1026
		$result = $this->Html->script('test.json.js?foo=bar&other=test');
1027
		$expected = array(
1028
			'script' => array('type' => 'text/javascript', 'src' => 'js/test.json.js?foo=bar&amp;other=test')
1029
		);
1030
		$this->assertTags($result, $expected);
1031
 
1032
		$result = $this->Html->script('foo2', array('pathPrefix' => '/my/custom/path/'));
1033
		$expected = array(
1034
			'script' => array('type' => 'text/javascript', 'src' => '/my/custom/path/foo2.js')
1035
		);
1036
		$this->assertTags($result, $expected);
1037
 
1038
		$result = $this->Html->script('foo3', array('pathPrefix' => 'http://cakephp.org/assets/js/'));
1039
		$expected = array(
1040
			'script' => array('type' => 'text/javascript', 'src' => 'http://cakephp.org/assets/js/foo3.js')
1041
		);
1042
		$this->assertTags($result, $expected);
1043
 
1044
		$previousConfig = Configure::read('App.jsBaseUrl');
1045
		Configure::write('App.jsBaseUrl', '//cdn.cakephp.org/js/');
1046
		$result = $this->Html->script('foo4');
1047
		$expected = array(
1048
			'script' => array('type' => 'text/javascript', 'src' => '//cdn.cakephp.org/js/foo4.js')
1049
		);
1050
		$this->assertTags($result, $expected);
1051
		Configure::write('App.jsBaseUrl', $previousConfig);
1052
 
1053
		$result = $this->Html->script('foo');
1054
		$this->assertNull($result, 'Script returned upon duplicate inclusion %s');
1055
 
1056
		$result = $this->Html->script(array('foo', 'bar', 'baz'));
1057
		$this->assertNotRegExp('/foo.js/', $result);
1058
 
1059
		$result = $this->Html->script('foo', array('inline' => true, 'once' => false));
1060
		$this->assertNotNull($result);
1061
 
1062
		$result = $this->Html->script('jquery-1.3.2', array('defer' => true, 'encoding' => 'utf-8'));
1063
		$expected = array(
1064
			'script' => array('type' => 'text/javascript', 'src' => 'js/jquery-1.3.2.js', 'defer' => 'defer', 'encoding' => 'utf-8')
1065
		);
1066
		$this->assertTags($result, $expected);
1067
	}
1068
 
1069
/**
1070
 * test that plugin scripts added with uses() are only ever included once.
1071
 * test script tag generation with plugin syntax
1072
 *
1073
 * @return void
1074
 */
1075
	public function testPluginScript() {
1076
		CakePlugin::load('TestPlugin');
1077
 
1078
		$result = $this->Html->script('TestPlugin.foo');
1079
		$expected = array(
1080
			'script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/foo.js')
1081
		);
1082
		$this->assertTags($result, $expected);
1083
 
1084
		$result = $this->Html->script(array('TestPlugin.foobar', 'TestPlugin.bar'));
1085
		$expected = array(
1086
			array('script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/foobar.js')),
1087
			'/script',
1088
			array('script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/bar.js')),
1089
			'/script',
1090
		);
1091
		$this->assertTags($result, $expected);
1092
 
1093
		$result = $this->Html->script('TestPlugin.jquery-1.3');
1094
		$expected = array(
1095
			'script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/jquery-1.3.js')
1096
		);
1097
		$this->assertTags($result, $expected);
1098
 
1099
		$result = $this->Html->script('TestPlugin.test.json');
1100
		$expected = array(
1101
			'script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/test.json.js')
1102
		);
1103
		$this->assertTags($result, $expected);
1104
 
1105
		$result = $this->Html->script('TestPlugin./jquery-1.3.2.js?someparam=foo');
1106
		$expected = array(
1107
			'script' => array('type' => 'text/javascript', 'src' => 'test_plugin/jquery-1.3.2.js?someparam=foo')
1108
		);
1109
		$this->assertTags($result, $expected);
1110
 
1111
		$result = $this->Html->script('TestPlugin.test.json.js?foo=bar');
1112
		$expected = array(
1113
			'script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/test.json.js?foo=bar')
1114
		);
1115
		$this->assertTags($result, $expected);
1116
 
1117
		$result = $this->Html->script('TestPlugin.foo');
1118
		$this->assertNull($result, 'Script returned upon duplicate inclusion %s');
1119
 
1120
		$result = $this->Html->script(array('TestPlugin.foo', 'TestPlugin.bar', 'TestPlugin.baz'));
1121
		$this->assertNotRegExp('/test_plugin\/js\/foo.js/', $result);
1122
 
1123
		$result = $this->Html->script('TestPlugin.foo', array('inline' => true, 'once' => false));
1124
		$this->assertNotNull($result);
1125
 
1126
		$result = $this->Html->script('TestPlugin.jquery-1.3.2', array('defer' => true, 'encoding' => 'utf-8'));
1127
		$expected = array(
1128
			'script' => array('type' => 'text/javascript', 'src' => 'test_plugin/js/jquery-1.3.2.js', 'defer' => 'defer', 'encoding' => 'utf-8')
1129
		);
1130
		$this->assertTags($result, $expected);
1131
 
1132
		CakePlugin::unload('TestPlugin');
1133
	}
1134
 
1135
/**
1136
 * test that script() works with blocks.
1137
 *
1138
 * @return void
1139
 */
1140
	public function testScriptWithBlocks() {
1141
		$this->View->expects($this->at(0))
1142
			->method('append')
1143
			->with('script', $this->matchesRegularExpression('/script_in_head.js/'));
1144
 
1145
		$this->View->expects($this->at(1))
1146
			->method('append')
1147
			->with('script', $this->matchesRegularExpression('/bool_false.js/'));
1148
 
1149
		$this->View->expects($this->at(2))
1150
			->method('append')
1151
			->with('headScripts', $this->matchesRegularExpression('/second_script.js/'));
1152
 
1153
		$result = $this->Html->script('script_in_head', array('inline' => false));
1154
		$this->assertNull($result);
1155
 
1156
		$result = $this->Html->script('bool_false', false);
1157
		$this->assertNull($result);
1158
 
1159
		$result = $this->Html->script('second_script', array('block' => 'headScripts'));
1160
		$this->assertNull($result);
1161
	}
1162
 
1163
/**
1164
 * Test that Asset.filter.js works.
1165
 *
1166
 * @return void
1167
 */
1168
	public function testScriptAssetFilter() {
1169
		Configure::write('Asset.filter.js', 'js.php');
1170
 
1171
		$result = $this->Html->script('jquery-1.3');
1172
		$expected = array(
1173
			'script' => array('type' => 'text/javascript', 'src' => 'cjs/jquery-1.3.js')
1174
		);
1175
		$this->assertTags($result, $expected);
1176
 
1177
		$result = $this->Html->script('//example.com/js/jquery-1.3.js');
1178
		$expected = array(
1179
			'script' => array('type' => 'text/javascript', 'src' => '//example.com/js/jquery-1.3.js')
1180
		);
1181
		$this->assertTags($result, $expected);
1182
	}
1183
 
1184
/**
1185
 * testScriptWithFullBase method
1186
 *
1187
 * @return void
1188
 */
1189
	public function testScriptWithFullBase() {
1190
		$here = $this->Html->url('/', true);
1191
 
1192
		$result = $this->Html->script('foo', array('fullBase' => true));
1193
		$expected = array(
1194
			'script' => array('type' => 'text/javascript', 'src' => $here . 'js/foo.js')
1195
		);
1196
		$this->assertTags($result, $expected);
1197
 
1198
		$result = $this->Html->script(array('foobar', 'bar'), array('fullBase' => true));
1199
		$expected = array(
1200
			array('script' => array('type' => 'text/javascript', 'src' => $here . 'js/foobar.js')),
1201
			'/script',
1202
			array('script' => array('type' => 'text/javascript', 'src' => $here . 'js/bar.js')),
1203
			'/script',
1204
		);
1205
		$this->assertTags($result, $expected);
1206
	}
1207
 
1208
/**
1209
 * test a script file in the webroot/theme dir.
1210
 *
1211
 * @return void
1212
 */
1213
	public function testScriptInTheme() {
1214
		$this->skipIf(!is_writable(WWW_ROOT), 'Cannot write to webroot.');
1215
		$themeExists = is_dir(WWW_ROOT . 'theme');
1216
 
1217
		App::uses('File', 'Utility');
1218
 
1219
		$testfile = WWW_ROOT . 'theme' . DS . 'test_theme' . DS . 'js' . DS . '__test_js.js';
1220
		new File($testfile, true);
1221
 
1222
		App::build(array(
1223
			'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
1224
		));
1225
 
1226
		$this->Html->webroot = '/';
1227
		$this->Html->theme = 'test_theme';
1228
		$result = $this->Html->script('__test_js.js');
1229
		$expected = array(
1230
			'script' => array('src' => '/theme/test_theme/js/__test_js.js', 'type' => 'text/javascript')
1231
		);
1232
		$this->assertTags($result, $expected);
1233
 
1234
		$Folder = new Folder(WWW_ROOT . 'theme' . DS . 'test_theme');
1235
		$Folder->delete();
1236
 
1237
		if (!$themeExists) {
1238
			$dir = new Folder(WWW_ROOT . 'theme');
1239
			$dir->delete();
1240
		}
1241
	}
1242
 
1243
/**
1244
 * test Script block generation
1245
 *
1246
 * @return void
1247
 */
1248
	public function testScriptBlock() {
1249
		$result = $this->Html->scriptBlock('window.foo = 2;');
1250
		$expected = array(
1251
			'script' => array('type' => 'text/javascript'),
1252
			$this->cDataStart,
1253
			'window.foo = 2;',
1254
			$this->cDataEnd,
1255
			'/script',
1256
		);
1257
		$this->assertTags($result, $expected);
1258
 
1259
		$result = $this->Html->scriptBlock('window.foo = 2;', array('type' => 'text/x-handlebars-template'));
1260
		$expected = array(
1261
			'script' => array('type' => 'text/x-handlebars-template'),
1262
			$this->cDataStart,
1263
			'window.foo = 2;',
1264
			$this->cDataEnd,
1265
			'/script',
1266
		);
1267
		$this->assertTags($result, $expected);
1268
 
1269
		$result = $this->Html->scriptBlock('window.foo = 2;', array('safe' => false));
1270
		$expected = array(
1271
			'script' => array('type' => 'text/javascript'),
1272
			'window.foo = 2;',
1273
			'/script',
1274
		);
1275
		$this->assertTags($result, $expected);
1276
 
1277
		$result = $this->Html->scriptBlock('window.foo = 2;', array('safe' => true));
1278
		$expected = array(
1279
			'script' => array('type' => 'text/javascript'),
1280
			$this->cDataStart,
1281
			'window.foo = 2;',
1282
			$this->cDataEnd,
1283
			'/script',
1284
		);
1285
		$this->assertTags($result, $expected);
1286
 
1287
		$this->View->expects($this->at(0))
1288
			->method('append')
1289
			->with('script', $this->matchesRegularExpression('/window\.foo\s\=\s2;/'));
1290
 
1291
		$this->View->expects($this->at(1))
1292
			->method('append')
1293
			->with('scriptTop', $this->stringContains('alert('));
1294
 
1295
		$result = $this->Html->scriptBlock('window.foo = 2;', array('inline' => false));
1296
		$this->assertNull($result);
1297
 
1298
		$result = $this->Html->scriptBlock('alert("hi")', array('block' => 'scriptTop'));
1299
		$this->assertNull($result);
1300
 
1301
		$result = $this->Html->scriptBlock('window.foo = 2;', array('safe' => false, 'encoding' => 'utf-8'));
1302
		$expected = array(
1303
			'script' => array('type' => 'text/javascript', 'encoding' => 'utf-8'),
1304
			'window.foo = 2;',
1305
			'/script',
1306
		);
1307
		$this->assertTags($result, $expected);
1308
	}
1309
 
1310
/**
1311
 * test script tag output buffering when using scriptStart() and scriptEnd();
1312
 *
1313
 * @return void
1314
 */
1315
	public function testScriptStartAndScriptEnd() {
1316
		$result = $this->Html->scriptStart(array('safe' => true));
1317
		$this->assertNull($result);
1318
		echo 'this is some javascript';
1319
 
1320
		$result = $this->Html->scriptEnd();
1321
		$expected = array(
1322
			'script' => array('type' => 'text/javascript'),
1323
			$this->cDataStart,
1324
			'this is some javascript',
1325
			$this->cDataEnd,
1326
			'/script'
1327
		);
1328
		$this->assertTags($result, $expected);
1329
 
1330
		$result = $this->Html->scriptStart(array('safe' => false));
1331
		$this->assertNull($result);
1332
		echo 'this is some javascript';
1333
 
1334
		$result = $this->Html->scriptEnd();
1335
		$expected = array(
1336
			'script' => array('type' => 'text/javascript'),
1337
			'this is some javascript',
1338
			'/script'
1339
		);
1340
		$this->assertTags($result, $expected);
1341
 
1342
		$result = $this->Html->scriptStart(array('safe' => true, 'type' => 'text/x-handlebars-template'));
1343
		$this->assertNull($result);
1344
		echo 'this is some template';
1345
 
1346
		$result = $this->Html->scriptEnd();
1347
		$expected = array(
1348
			'script' => array('type' => 'text/x-handlebars-template'),
1349
			$this->cDataStart,
1350
			'this is some template',
1351
			$this->cDataEnd,
1352
			'/script'
1353
		);
1354
		$this->assertTags($result, $expected);
1355
 
1356
		$this->View->expects($this->once())
1357
			->method('append');
1358
		$result = $this->Html->scriptStart(array('safe' => false, 'inline' => false));
1359
		$this->assertNull($result);
1360
		echo 'this is some javascript';
1361
 
1362
		$result = $this->Html->scriptEnd();
1363
		$this->assertNull($result);
1364
	}
1365
 
1366
/**
1367
 * testCharsetTag method
1368
 *
1369
 * @return void
1370
 */
1371
	public function testCharsetTag() {
1372
		Configure::write('App.encoding', null);
1373
		$result = $this->Html->charset();
1374
		$this->assertTags($result, array('meta' => array('http-equiv' => 'Content-Type', 'content' => 'text/html; charset=utf-8')));
1375
 
1376
		Configure::write('App.encoding', 'ISO-8859-1');
1377
		$result = $this->Html->charset();
1378
		$this->assertTags($result, array('meta' => array('http-equiv' => 'Content-Type', 'content' => 'text/html; charset=iso-8859-1')));
1379
 
1380
		$result = $this->Html->charset('UTF-7');
1381
		$this->assertTags($result, array('meta' => array('http-equiv' => 'Content-Type', 'content' => 'text/html; charset=UTF-7')));
1382
	}
1383
 
1384
/**
1385
 * testGetCrumb and addCrumb method
1386
 *
1387
 * @return void
1388
 */
1389
	public function testBreadcrumb() {
1390
		$this->assertNull($this->Html->getCrumbs());
1391
 
1392
		$this->Html->addCrumb('First', '#first');
1393
		$this->Html->addCrumb('Second', '#second');
1394
		$this->Html->addCrumb('Third', '#third');
1395
 
1396
		$result = $this->Html->getCrumbs();
1397
		$expected = array(
1398
			array('a' => array('href' => '#first')),
1399
			'First',
1400
			'/a',
1401
			'&raquo;',
1402
			array('a' => array('href' => '#second')),
1403
			'Second',
1404
			'/a',
1405
			'&raquo;',
1406
			array('a' => array('href' => '#third')),
1407
			'Third',
1408
			'/a',
1409
		);
1410
		$this->assertTags($result, $expected);
1411
 
1412
		$result = $this->Html->getCrumbs(' &gt; ');
1413
		$expected = array(
1414
			array('a' => array('href' => '#first')),
1415
			'First',
1416
			'/a',
1417
			' &gt; ',
1418
			array('a' => array('href' => '#second')),
1419
			'Second',
1420
			'/a',
1421
			' &gt; ',
1422
			array('a' => array('href' => '#third')),
1423
			'Third',
1424
			'/a',
1425
		);
1426
		$this->assertTags($result, $expected);
1427
 
1428
		$this->Html->addCrumb('Fourth', null);
1429
 
1430
		$result = $this->Html->getCrumbs();
1431
		$expected = array(
1432
			array('a' => array('href' => '#first')),
1433
			'First',
1434
			'/a',
1435
			'&raquo;',
1436
			array('a' => array('href' => '#second')),
1437
			'Second',
1438
			'/a',
1439
			'&raquo;',
1440
			array('a' => array('href' => '#third')),
1441
			'Third',
1442
			'/a',
1443
			'&raquo;',
1444
			'Fourth'
1445
		);
1446
		$this->assertTags($result, $expected);
1447
 
1448
		$result = $this->Html->getCrumbs('-', 'Start');
1449
		$expected = array(
1450
			array('a' => array('href' => '/')),
1451
			'Start',
1452
			'/a',
1453
			'-',
1454
			array('a' => array('href' => '#first')),
1455
			'First',
1456
			'/a',
1457
			'-',
1458
			array('a' => array('href' => '#second')),
1459
			'Second',
1460
			'/a',
1461
			'-',
1462
			array('a' => array('href' => '#third')),
1463
			'Third',
1464
			'/a',
1465
			'-',
1466
			'Fourth'
1467
		);
1468
		$this->assertTags($result, $expected);
1469
	}
1470
 
1471
/**
1472
 * Test the array form of $startText
1473
 *
1474
 * @return void
1475
 */
1476
	public function testGetCrumbFirstLink() {
1477
		$result = $this->Html->getCrumbList(null, 'Home');
1478
		$this->assertTags(
1479
			$result,
1480
			array(
1481
				'<ul',
1482
				array('li' => array('class' => 'first')),
1483
				array('a' => array('href' => '/')), 'Home', '/a',
1484
				'/li',
1485
				'/ul'
1486
			)
1487
		);
1488
 
1489
		$this->Html->addCrumb('First', '#first');
1490
		$this->Html->addCrumb('Second', '#second');
1491
 
1492
		$result = $this->Html->getCrumbs(' - ', array('url' => '/home', 'text' => '<img src="/home.png" />', 'escape' => false));
1493
		$expected = array(
1494
			array('a' => array('href' => '/home')),
1495
			'img' => array('src' => '/home.png'),
1496
			'/a',
1497
			' - ',
1498
			array('a' => array('href' => '#first')),
1499
			'First',
1500
			'/a',
1501
			' - ',
1502
			array('a' => array('href' => '#second')),
1503
			'Second',
1504
			'/a',
1505
		);
1506
		$this->assertTags($result, $expected);
1507
	}
1508
 
1509
/**
1510
 * testNestedList method
1511
 *
1512
 * @return void
1513
 */
1514
	public function testNestedList() {
1515
		$list = array(
1516
			'Item 1',
1517
			'Item 2' => array(
1518
				'Item 2.1'
1519
			),
1520
			'Item 3',
1521
			'Item 4' => array(
1522
				'Item 4.1',
1523
				'Item 4.2',
1524
				'Item 4.3' => array(
1525
					'Item 4.3.1',
1526
					'Item 4.3.2'
1527
				)
1528
			),
1529
			'Item 5' => array(
1530
				'Item 5.1',
1531
				'Item 5.2'
1532
			)
1533
		);
1534
 
1535
		$result = $this->Html->nestedList($list);
1536
		$expected = array(
1537
			'<ul',
1538
			'<li', 'Item 1', '/li',
1539
			'<li', 'Item 2',
1540
			'<ul', '<li', 'Item 2.1', '/li', '/ul',
1541
			'/li',
1542
			'<li', 'Item 3', '/li',
1543
			'<li', 'Item 4',
1544
			'<ul',
1545
			'<li', 'Item 4.1', '/li',
1546
			'<li', 'Item 4.2', '/li',
1547
			'<li', 'Item 4.3',
1548
			'<ul',
1549
			'<li', 'Item 4.3.1', '/li',
1550
			'<li', 'Item 4.3.2', '/li',
1551
			'/ul',
1552
			'/li',
1553
			'/ul',
1554
			'/li',
1555
			'<li', 'Item 5',
1556
			'<ul',
1557
			'<li', 'Item 5.1', '/li',
1558
			'<li', 'Item 5.2', '/li',
1559
			'/ul',
1560
			'/li',
1561
			'/ul'
1562
		);
1563
		$this->assertTags($result, $expected);
1564
 
1565
		$result = $this->Html->nestedList($list, null);
1566
		$this->assertTags($result, $expected);
1567
 
1568
		$result = $this->Html->nestedList($list, array(), array(), 'ol');
1569
		$expected = array(
1570
			'<ol',
1571
			'<li', 'Item 1', '/li',
1572
			'<li', 'Item 2',
1573
			'<ol', '<li', 'Item 2.1', '/li', '/ol',
1574
			'/li',
1575
			'<li', 'Item 3', '/li',
1576
			'<li', 'Item 4',
1577
			'<ol',
1578
			'<li', 'Item 4.1', '/li',
1579
			'<li', 'Item 4.2', '/li',
1580
			'<li', 'Item 4.3',
1581
			'<ol',
1582
			'<li', 'Item 4.3.1', '/li',
1583
			'<li', 'Item 4.3.2', '/li',
1584
			'/ol',
1585
			'/li',
1586
			'/ol',
1587
			'/li',
1588
			'<li', 'Item 5',
1589
			'<ol',
1590
			'<li', 'Item 5.1', '/li',
1591
			'<li', 'Item 5.2', '/li',
1592
			'/ol',
1593
			'/li',
1594
			'/ol'
1595
		);
1596
		$this->assertTags($result, $expected);
1597
 
1598
		$result = $this->Html->nestedList($list, 'ol');
1599
		$this->assertTags($result, $expected);
1600
 
1601
		$result = $this->Html->nestedList($list, array('class' => 'list'));
1602
		$expected = array(
1603
			array('ul' => array('class' => 'list')),
1604
			'<li', 'Item 1', '/li',
1605
			'<li', 'Item 2',
1606
			array('ul' => array('class' => 'list')), '<li', 'Item 2.1', '/li', '/ul',
1607
			'/li',
1608
			'<li', 'Item 3', '/li',
1609
			'<li', 'Item 4',
1610
			array('ul' => array('class' => 'list')),
1611
			'<li', 'Item 4.1', '/li',
1612
			'<li', 'Item 4.2', '/li',
1613
			'<li', 'Item 4.3',
1614
			array('ul' => array('class' => 'list')),
1615
			'<li', 'Item 4.3.1', '/li',
1616
			'<li', 'Item 4.3.2', '/li',
1617
			'/ul',
1618
			'/li',
1619
			'/ul',
1620
			'/li',
1621
			'<li', 'Item 5',
1622
			array('ul' => array('class' => 'list')),
1623
			'<li', 'Item 5.1', '/li',
1624
			'<li', 'Item 5.2', '/li',
1625
			'/ul',
1626
			'/li',
1627
			'/ul'
1628
		);
1629
		$this->assertTags($result, $expected);
1630
 
1631
		$result = $this->Html->nestedList($list, array(), array('class' => 'item'));
1632
		$expected = array(
1633
			'<ul',
1634
			array('li' => array('class' => 'item')), 'Item 1', '/li',
1635
			array('li' => array('class' => 'item')), 'Item 2',
1636
			'<ul', array('li' => array('class' => 'item')), 'Item 2.1', '/li', '/ul',
1637
			'/li',
1638
			array('li' => array('class' => 'item')), 'Item 3', '/li',
1639
			array('li' => array('class' => 'item')), 'Item 4',
1640
			'<ul',
1641
			array('li' => array('class' => 'item')), 'Item 4.1', '/li',
1642
			array('li' => array('class' => 'item')), 'Item 4.2', '/li',
1643
			array('li' => array('class' => 'item')), 'Item 4.3',
1644
			'<ul',
1645
			array('li' => array('class' => 'item')), 'Item 4.3.1', '/li',
1646
			array('li' => array('class' => 'item')), 'Item 4.3.2', '/li',
1647
			'/ul',
1648
			'/li',
1649
			'/ul',
1650
			'/li',
1651
			array('li' => array('class' => 'item')), 'Item 5',
1652
			'<ul',
1653
			array('li' => array('class' => 'item')), 'Item 5.1', '/li',
1654
			array('li' => array('class' => 'item')), 'Item 5.2', '/li',
1655
			'/ul',
1656
			'/li',
1657
			'/ul'
1658
		);
1659
		$this->assertTags($result, $expected);
1660
 
1661
		$result = $this->Html->nestedList($list, array(), array('even' => 'even', 'odd' => 'odd'));
1662
		$expected = array(
1663
			'<ul',
1664
			array('li' => array('class' => 'odd')), 'Item 1', '/li',
1665
			array('li' => array('class' => 'even')), 'Item 2',
1666
			'<ul', array('li' => array('class' => 'odd')), 'Item 2.1', '/li', '/ul',
1667
			'/li',
1668
			array('li' => array('class' => 'odd')), 'Item 3', '/li',
1669
			array('li' => array('class' => 'even')), 'Item 4',
1670
			'<ul',
1671
			array('li' => array('class' => 'odd')), 'Item 4.1', '/li',
1672
			array('li' => array('class' => 'even')), 'Item 4.2', '/li',
1673
			array('li' => array('class' => 'odd')), 'Item 4.3',
1674
			'<ul',
1675
			array('li' => array('class' => 'odd')), 'Item 4.3.1', '/li',
1676
			array('li' => array('class' => 'even')), 'Item 4.3.2', '/li',
1677
			'/ul',
1678
			'/li',
1679
			'/ul',
1680
			'/li',
1681
			array('li' => array('class' => 'odd')), 'Item 5',
1682
			'<ul',
1683
			array('li' => array('class' => 'odd')), 'Item 5.1', '/li',
1684
			array('li' => array('class' => 'even')), 'Item 5.2', '/li',
1685
			'/ul',
1686
			'/li',
1687
			'/ul'
1688
		);
1689
		$this->assertTags($result, $expected);
1690
 
1691
		$result = $this->Html->nestedList($list, array('class' => 'list'), array('class' => 'item'));
1692
		$expected = array(
1693
			array('ul' => array('class' => 'list')),
1694
			array('li' => array('class' => 'item')), 'Item 1', '/li',
1695
			array('li' => array('class' => 'item')), 'Item 2',
1696
			array('ul' => array('class' => 'list')), array('li' => array('class' => 'item')), 'Item 2.1', '/li', '/ul',
1697
			'/li',
1698
			array('li' => array('class' => 'item')), 'Item 3', '/li',
1699
			array('li' => array('class' => 'item')), 'Item 4',
1700
			array('ul' => array('class' => 'list')),
1701
			array('li' => array('class' => 'item')), 'Item 4.1', '/li',
1702
			array('li' => array('class' => 'item')), 'Item 4.2', '/li',
1703
			array('li' => array('class' => 'item')), 'Item 4.3',
1704
			array('ul' => array('class' => 'list')),
1705
			array('li' => array('class' => 'item')), 'Item 4.3.1', '/li',
1706
			array('li' => array('class' => 'item')), 'Item 4.3.2', '/li',
1707
			'/ul',
1708
			'/li',
1709
			'/ul',
1710
			'/li',
1711
			array('li' => array('class' => 'item')), 'Item 5',
1712
			array('ul' => array('class' => 'list')),
1713
			array('li' => array('class' => 'item')), 'Item 5.1', '/li',
1714
			array('li' => array('class' => 'item')), 'Item 5.2', '/li',
1715
			'/ul',
1716
			'/li',
1717
			'/ul'
1718
		);
1719
		$this->assertTags($result, $expected);
1720
	}
1721
 
1722
/**
1723
 * testMeta method
1724
 *
1725
 * @return void
1726
 */
1727
	public function testMeta() {
1728
		$result = $this->Html->meta('this is an rss feed', array('controller' => 'posts', 'ext' => 'rss'));
1729
		$this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.rss/', 'type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => 'this is an rss feed')));
1730
 
1731
		$result = $this->Html->meta('rss', array('controller' => 'posts', 'ext' => 'rss'), array('title' => 'this is an rss feed'));
1732
		$this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.rss/', 'type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => 'this is an rss feed')));
1733
 
1734
		$result = $this->Html->meta('atom', array('controller' => 'posts', 'ext' => 'xml'));
1735
		$this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.xml/', 'type' => 'application/atom+xml', 'title' => 'atom')));
1736
 
1737
		$result = $this->Html->meta('non-existing');
1738
		$this->assertTags($result, array('<meta'));
1739
 
1740
		$result = $this->Html->meta('non-existing', '/posts.xpp');
1741
		$this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.xpp/', 'type' => 'application/rss+xml', 'rel' => 'alternate', 'title' => 'non-existing')));
1742
 
1743
		$result = $this->Html->meta('non-existing', '/posts.xpp', array('type' => 'atom'));
1744
		$this->assertTags($result, array('link' => array('href' => 'preg:/.*\/posts\.xpp/', 'type' => 'application/atom+xml', 'title' => 'non-existing')));
1745
 
1746
		$result = $this->Html->meta('atom', array('controller' => 'posts', 'ext' => 'xml'), array('link' => '/articles.rss'));
1747
		$this->assertTags($result, array('link' => array('href' => 'preg:/.*\/articles\.rss/', 'type' => 'application/atom+xml', 'title' => 'atom')));
1748
 
1749
		$result = $this->Html->meta(array('link' => 'favicon.ico', 'rel' => 'icon'));
1750
		$expected = array(
1751
			'link' => array('href' => 'preg:/.*favicon\.ico/', 'rel' => 'icon'),
1752
			array('link' => array('href' => 'preg:/.*favicon\.ico/', 'rel' => 'shortcut icon'))
1753
		);
1754
		$this->assertTags($result, $expected);
1755
 
1756
		$result = $this->Html->meta('keywords', 'these, are, some, meta, keywords');
1757
		$this->assertTags($result, array('meta' => array('name' => 'keywords', 'content' => 'these, are, some, meta, keywords')));
1758
 
1759
		$result = $this->Html->meta('description', 'this is the meta description');
1760
		$this->assertTags($result, array('meta' => array('name' => 'description', 'content' => 'this is the meta description')));
1761
 
1762
		$result = $this->Html->meta(array('name' => 'ROBOTS', 'content' => 'ALL'));
1763
		$this->assertTags($result, array('meta' => array('name' => 'ROBOTS', 'content' => 'ALL')));
1764
	}
1765
 
1766
/**
1767
 * Test generating favicon's with meta()
1768
 *
1769
 * @return void
1770
 */
1771
	public function testMetaIcon() {
1772
		$result = $this->Html->meta('icon', 'favicon.ico');
1773
		$expected = array(
1774
			'link' => array('href' => 'preg:/.*favicon\.ico/', 'type' => 'image/x-icon', 'rel' => 'icon'),
1775
			array('link' => array('href' => 'preg:/.*favicon\.ico/', 'type' => 'image/x-icon', 'rel' => 'shortcut icon'))
1776
		);
1777
		$this->assertTags($result, $expected);
1778
 
1779
		$result = $this->Html->meta('icon');
1780
		$expected = array(
1781
			'link' => array('href' => 'preg:/.*favicon\.ico/', 'type' => 'image/x-icon', 'rel' => 'icon'),
1782
			array('link' => array('href' => 'preg:/.*favicon\.ico/', 'type' => 'image/x-icon', 'rel' => 'shortcut icon'))
1783
		);
1784
		$this->assertTags($result, $expected);
1785
 
1786
		$result = $this->Html->meta('icon', '/favicon.png?one=two&three=four');
1787
		$url = '/favicon.png?one=two&amp;three=four';
1788
		$expected = array(
1789
			'link' => array(
1790
				'href' => $url,
1791
				'type' => 'image/x-icon',
1792
				'rel' => 'icon'
1793
			),
1794
			array(
1795
				'link' => array(
1796
					'href' => $url,
1797
					'type' => 'image/x-icon',
1798
					'rel' => 'shortcut icon'
1799
				)
1800
			)
1801
		);
1802
		$this->assertTags($result, $expected);
1803
 
1804
		$this->Html->request->webroot = '/testing/';
1805
		$result = $this->Html->meta('icon');
1806
		$expected = array(
1807
			'link' => array('href' => '/testing/favicon.ico', 'type' => 'image/x-icon', 'rel' => 'icon'),
1808
			array('link' => array('href' => '/testing/favicon.ico', 'type' => 'image/x-icon', 'rel' => 'shortcut icon'))
1809
		);
1810
		$this->assertTags($result, $expected);
1811
	}
1812
 
1813
/**
1814
 * Test the inline and block options for meta()
1815
 *
1816
 * @return void
1817
 */
1818
	public function testMetaWithBlocks() {
1819
		$this->View->expects($this->at(0))
1820
			->method('append')
1821
			->with('meta', $this->stringContains('ROBOTS'));
1822
 
1823
		$this->View->expects($this->at(1))
1824
			->method('append')
1825
			->with('metaTags', $this->stringContains('favicon.ico'));
1826
 
1827
		$result = $this->Html->meta(array('name' => 'ROBOTS', 'content' => 'ALL'), null, array('inline' => false));
1828
		$this->assertNull($result);
1829
 
1830
		$result = $this->Html->meta('icon', 'favicon.ico', array('block' => 'metaTags'));
1831
		$this->assertNull($result);
1832
	}
1833
 
1834
/**
1835
 * testTableHeaders method
1836
 *
1837
 * @return void
1838
 */
1839
	public function testTableHeaders() {
1840
		$result = $this->Html->tableHeaders(array('ID', 'Name', 'Date'));
1841
		$expected = array('<tr', '<th', 'ID', '/th', '<th', 'Name', '/th', '<th', 'Date', '/th', '/tr');
1842
		$this->assertTags($result, $expected);
1843
 
1844
		$result = $this->Html->tableHeaders(array('ID', array('Name' => array('class' => 'highlight')), 'Date'));
1845
		$expected = array('<tr', '<th', 'ID', '/th', '<th class="highlight"', 'Name', '/th', '<th', 'Date', '/th', '/tr');
1846
		$this->assertTags($result, $expected);
1847
 
1848
		$result = $this->Html->tableHeaders(array('ID', array('Name' => array('class' => 'highlight', 'width' => '120px')), 'Date'));
1849
		$expected = array('<tr', '<th', 'ID', '/th', '<th class="highlight" width="120px"', 'Name', '/th', '<th', 'Date', '/th', '/tr');
1850
		$this->assertTags($result, $expected);
1851
 
1852
		$result = $this->Html->tableHeaders(array('ID', array('Name' => array()), 'Date'));
1853
		$expected = array('<tr', '<th', 'ID', '/th', '<th', 'Name', '/th', '<th', 'Date', '/th', '/tr');
1854
		$this->assertTags($result, $expected);
1855
	}
1856
 
1857
/**
1858
 * testTableCells method
1859
 *
1860
 * @return void
1861
 */
1862
	public function testTableCells() {
1863
		$tr = array(
1864
			'td content 1',
1865
			array('td content 2', array("width" => "100px")),
1866
			array('td content 3', "width=100px")
1867
		);
1868
		$result = $this->Html->tableCells($tr);
1869
		$expected = array(
1870
			'<tr',
1871
			'<td', 'td content 1', '/td',
1872
			array('td' => array('width' => '100px')), 'td content 2', '/td',
1873
			array('td' => array('width' => 'preg:/100px/')), 'td content 3', '/td',
1874
			'/tr'
1875
		);
1876
		$this->assertTags($result, $expected);
1877
 
1878
		$tr = array('td content 1', 'td content 2', 'td content 3');
1879
		$result = $this->Html->tableCells($tr, null, null, true);
1880
		$expected = array(
1881
			'<tr',
1882
			array('td' => array('class' => 'column-1')), 'td content 1', '/td',
1883
			array('td' => array('class' => 'column-2')), 'td content 2', '/td',
1884
			array('td' => array('class' => 'column-3')), 'td content 3', '/td',
1885
			'/tr'
1886
		);
1887
		$this->assertTags($result, $expected);
1888
 
1889
		$tr = array('td content 1', 'td content 2', 'td content 3');
1890
		$result = $this->Html->tableCells($tr, true);
1891
		$expected = array(
1892
			'<tr',
1893
			array('td' => array('class' => 'column-1')), 'td content 1', '/td',
1894
			array('td' => array('class' => 'column-2')), 'td content 2', '/td',
1895
			array('td' => array('class' => 'column-3')), 'td content 3', '/td',
1896
			'/tr'
1897
		);
1898
		$this->assertTags($result, $expected);
1899
 
1900
		$tr = array(
1901
			array('td content 1', 'td content 2', 'td content 3'),
1902
			array('td content 1', 'td content 2', 'td content 3'),
1903
			array('td content 1', 'td content 2', 'td content 3')
1904
		);
1905
		$result = $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even'));
1906
		$expected = "<tr class=\"even\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"odd\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"even\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>";
1907
		$this->assertEquals($expected, $result);
1908
 
1909
		$tr = array(
1910
			array('td content 1', 'td content 2', 'td content 3'),
1911
			array('td content 1', 'td content 2', 'td content 3'),
1912
			array('td content 1', 'td content 2', 'td content 3'),
1913
			array('td content 1', 'td content 2', 'td content 3')
1914
		);
1915
		$result = $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even'));
1916
		$expected = "<tr class=\"odd\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"even\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"odd\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"even\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>";
1917
		$this->assertEquals($expected, $result);
1918
 
1919
		$tr = array(
1920
			array('td content 1', 'td content 2', 'td content 3'),
1921
			array('td content 1', 'td content 2', 'td content 3'),
1922
			array('td content 1', 'td content 2', 'td content 3')
1923
		);
1924
		$this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even'));
1925
		$result = $this->Html->tableCells($tr, array('class' => 'odd'), array('class' => 'even'), false, false);
1926
		$expected = "<tr class=\"odd\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"even\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>\n<tr class=\"odd\"><td>td content 1</td> <td>td content 2</td> <td>td content 3</td></tr>";
1927
		$this->assertEquals($expected, $result);
1928
 
1929
		$tr = array(
1930
			'td content 1',
1931
			'td content 2',
1932
			array('td content 3', array('class' => 'foo'))
1933
		);
1934
		$result = $this->Html->tableCells($tr, null, null, true);
1935
		$expected = array(
1936
			'<tr',
1937
			array('td' => array('class' => 'column-1')), 'td content 1', '/td',
1938
			array('td' => array('class' => 'column-2')), 'td content 2', '/td',
1939
			array('td' => array('class' => 'foo column-3')), 'td content 3', '/td',
1940
			'/tr'
1941
		);
1942
		$this->assertTags($result, $expected);
1943
	}
1944
 
1945
/**
1946
 * testTag method
1947
 *
1948
 * @return void
1949
 */
1950
	public function testTag() {
1951
		$result = $this->Html->tag('div');
1952
		$this->assertTags($result, '<div');
1953
 
1954
		$result = $this->Html->tag('div', 'text');
1955
		$this->assertTags($result, '<div', 'text', '/div');
1956
 
1957
		$result = $this->Html->tag('div', '<text>', array('class' => 'class-name', 'escape' => true));
1958
		$this->assertTags($result, array('div' => array('class' => 'class-name'), '&lt;text&gt;', '/div'));
1959
 
1960
		$result = $this->Html->tag(false, '<em>stuff</em>');
1961
		$this->assertEquals('<em>stuff</em>', $result);
1962
 
1963
		$result = $this->Html->tag(null, '<em>stuff</em>');
1964
		$this->assertEquals('<em>stuff</em>', $result);
1965
 
1966
		$result = $this->Html->tag('', '<em>stuff</em>');
1967
		$this->assertEquals('<em>stuff</em>', $result);
1968
	}
1969
 
1970
/**
1971
 * testUseTag method
1972
 *
1973
 * @return void
1974
 */
1975
	public function testUseTag() {
1976
		$result = $this->Html->useTag('unknowntag');
1977
		$this->assertEquals('', $result);
1978
 
1979
		$result = $this->Html->useTag('formend');
1980
		$this->assertTags($result, '/form');
1981
 
1982
		$result = $this->Html->useTag('form', 'url', ' test');
1983
		$this->assertEquals('<form action="url" test>', $result);
1984
 
1985
		$result = $this->Html->useTag('form', 'example.com', array('test' => 'ok'));
1986
		$this->assertTags($result, array('form' => array('test' => 'ok', 'action' => 'example.com')));
1987
	}
1988
 
1989
/**
1990
 * testDiv method
1991
 *
1992
 * @return void
1993
 */
1994
	public function testDiv() {
1995
		$result = $this->Html->div('class-name');
1996
		$this->assertTags($result, array('div' => array('class' => 'class-name')));
1997
 
1998
		$result = $this->Html->div('class-name', 'text');
1999
		$this->assertTags($result, array('div' => array('class' => 'class-name'), 'text', '/div'));
2000
 
2001
		$result = $this->Html->div('class-name', '<text>', array('escape' => true));
2002
		$this->assertTags($result, array('div' => array('class' => 'class-name'), '&lt;text&gt;', '/div'));
2003
	}
2004
 
2005
/**
2006
 * testPara method
2007
 *
2008
 * @return void
2009
 */
2010
	public function testPara() {
2011
		$result = $this->Html->para('class-name', '');
2012
		$this->assertTags($result, array('p' => array('class' => 'class-name')));
2013
 
2014
		$result = $this->Html->para('class-name', 'text');
2015
		$this->assertTags($result, array('p' => array('class' => 'class-name'), 'text', '/p'));
2016
 
2017
		$result = $this->Html->para('class-name', '<text>', array('escape' => true));
2018
		$this->assertTags($result, array('p' => array('class' => 'class-name'), '&lt;text&gt;', '/p'));
2019
	}
2020
 
2021
/**
2022
 * testMedia method
2023
 *
2024
 * @return void
2025
 */
2026
	public function testMedia() {
2027
		$result = $this->Html->media('video.webm');
2028
		$expected = array('video' => array('src' => 'files/video.webm'), '/video');
2029
		$this->assertTags($result, $expected);
2030
 
2031
		$result = $this->Html->media('video.webm', array(
2032
			'text' => 'Your browser does not support the HTML5 Video element.'
2033
		));
2034
		$expected = array('video' => array('src' => 'files/video.webm'), 'Your browser does not support the HTML5 Video element.', '/video');
2035
		$this->assertTags($result, $expected);
2036
 
2037
		$result = $this->Html->media('video.webm', array('autoload', 'muted' => 'muted'));
2038
		$expected = array(
2039
			'video' => array(
2040
				'src' => 'files/video.webm',
2041
				'autoload' => 'autoload',
2042
				'muted' => 'muted'
2043
			),
2044
			'/video'
2045
		);
2046
		$this->assertTags($result, $expected);
2047
 
2048
		$result = $this->Html->media(
2049
			array('video.webm', array('src' => 'video.ogv', 'type' => "video/ogg; codecs='theora, vorbis'")),
2050
			array('pathPrefix' => 'videos/', 'poster' => 'poster.jpg', 'text' => 'Your browser does not support the HTML5 Video element.')
2051
		);
2052
		$expected = array(
2053
			'video' => array('poster' => Configure::read('App.imageBaseUrl') . 'poster.jpg'),
2054
				array('source' => array('src' => 'videos/video.webm', 'type' => 'video/webm')),
2055
				array('source' => array('src' => 'videos/video.ogv', 'type' => 'video/ogg; codecs=&#039;theora, vorbis&#039;')),
2056
				'Your browser does not support the HTML5 Video element.',
2057
			'/video'
2058
		);
2059
		$this->assertTags($result, $expected);
2060
 
2061
		$result = $this->Html->media('video.ogv', array('tag' => 'video'));
2062
		$expected = array('video' => array('src' => 'files/video.ogv'), '/video');
2063
		$this->assertTags($result, $expected);
2064
 
2065
		$result = $this->Html->media('audio.mp3');
2066
		$expected = array('audio' => array('src' => 'files/audio.mp3'), '/audio');
2067
		$this->assertTags($result, $expected);
2068
 
2069
		$result = $this->Html->media(
2070
			array(array('src' => 'video.mov', 'type' => 'video/mp4'), 'video.webm')
2071
		);
2072
		$expected = array(
2073
			'<video',
2074
				array('source' => array('src' => 'files/video.mov', 'type' => 'video/mp4')),
2075
				array('source' => array('src' => 'files/video.webm', 'type' => 'video/webm')),
2076
			'/video'
2077
		);
2078
		$this->assertTags($result, $expected);
2079
 
2080
		$result = $this->Html->media(null, array('src' => 'video.webm'));
2081
		$expected = array(
2082
			'video' => array('src' => 'files/video.webm'),
2083
			'/video'
2084
		);
2085
		$this->assertTags($result, $expected);
2086
	}
2087
 
2088
/**
2089
 * testCrumbList method
2090
 *
2091
 * @return void
2092
 */
2093
	public function testCrumbList() {
2094
		$this->assertNull($this->Html->getCrumbList());
2095
 
2096
		$this->Html->addCrumb('Home', '/', array('class' => 'home'));
2097
		$this->Html->addCrumb('Some page', '/some_page');
2098
		$this->Html->addCrumb('Another page');
2099
		$result = $this->Html->getCrumbList(
2100
			array('class' => 'breadcrumbs')
2101
		);
2102
		$this->assertTags(
2103
			$result,
2104
			array(
2105
				array('ul' => array('class' => 'breadcrumbs')),
2106
				array('li' => array('class' => 'first')),
2107
				array('a' => array('class' => 'home', 'href' => '/')), 'Home', '/a',
2108
				'/li',
2109
				'<li',
2110
				array('a' => array('href' => '/some_page')), 'Some page', '/a',
2111
				'/li',
2112
				array('li' => array('class' => 'last')),
2113
				'Another page',
2114
				'/li',
2115
				'/ul'
2116
			)
2117
		);
2118
	}
2119
 
2120
/**
2121
 * Test getCrumbList startText
2122
 *
2123
 * @return void
2124
 */
2125
	public function testCrumbListFirstLink() {
2126
		$this->Html->addCrumb('First', '#first');
2127
		$this->Html->addCrumb('Second', '#second');
2128
 
2129
		$result = $this->Html->getCrumbList(null, 'Home');
2130
		$this->assertTags(
2131
			$result,
2132
			array(
2133
				'<ul',
2134
				array('li' => array('class' => 'first')),
2135
				array('a' => array('href' => '/')), 'Home', '/a',
2136
				'/li',
2137
				'<li',
2138
				array('a' => array('href' => '#first')), 'First', '/a',
2139
				'/li',
2140
				array('li' => array('class' => 'last')),
2141
				array('a' => array('href' => '#second')), 'Second', '/a',
2142
				'/li',
2143
				'/ul'
2144
			)
2145
		);
2146
 
2147
		$result = $this->Html->getCrumbList(null, array('url' => '/home', 'text' => '<img src="/home.png" />', 'escape' => false));
2148
		$this->assertTags(
2149
			$result,
2150
			array(
2151
				'<ul',
2152
				array('li' => array('class' => 'first')),
2153
				array('a' => array('href' => '/home')), 'img' => array('src' => '/home.png'), '/a',
2154
				'/li',
2155
				'<li',
2156
				array('a' => array('href' => '#first')), 'First', '/a',
2157
				'/li',
2158
				array('li' => array('class' => 'last')),
2159
				array('a' => array('href' => '#second')), 'Second', '/a',
2160
				'/li',
2161
				'/ul'
2162
			)
2163
		);
2164
	}
2165
 
2166
/**
2167
 * test getCrumbList() in Twitter Bootstrap style.
2168
 *
2169
 * @return void
2170
 */
2171
	public function testCrumbListBootstrapStyle() {
2172
		$this->Html->addCrumb('Home', '/', array('class' => 'home'));
2173
		$this->Html->addCrumb('Library', '/lib');
2174
		$this->Html->addCrumb('Data');
2175
		$result = $this->Html->getCrumbList(array(
2176
			'class' => 'breadcrumb',
2177
			'separator' => '<span class="divider">-</span>',
2178
			'firstClass' => false,
2179
			'lastClass' => 'active'
2180
		));
2181
		$this->assertTags(
2182
			$result,
2183
			array(
2184
				array('ul' => array('class' => 'breadcrumb')),
2185
				'<li',
2186
				array('a' => array('class' => 'home', 'href' => '/')), 'Home', '/a',
2187
				array('span' => array('class' => 'divider')), '-', '/span',
2188
				'/li',
2189
				'<li',
2190
				array('a' => array('href' => '/lib')), 'Library', '/a',
2191
				array('span' => array('class' => 'divider')), '-', '/span',
2192
				'/li',
2193
				array('li' => array('class' => 'active')), 'Data', '/li',
2194
				'/ul'
2195
			)
2196
		);
2197
	}
2198
 
2199
/**
2200
 * Test GetCrumbList using style of Zurb Foundation.
2201
 *
2202
 * @return void
2203
 */
2204
	public function testCrumbListZurbStyle() {
2205
		$this->Html->addCrumb('Home', '#');
2206
		$this->Html->addCrumb('Features', '#');
2207
		$this->Html->addCrumb('Gene Splicing', '#');
2208
		$this->Html->addCrumb('Home', '#');
2209
		$result = $this->Html->getCrumbList(
2210
			array('class' => 'breadcrumbs', 'firstClass' => false, 'lastClass' => 'current')
2211
		);
2212
		$this->assertTags(
2213
			$result,
2214
			array(
2215
				array('ul' => array('class' => 'breadcrumbs')),
2216
				'<li',
2217
				array('a' => array('href' => '#')), 'Home', '/a',
2218
				'/li',
2219
				'<li',
2220
				array('a' => array('href' => '#')), 'Features', '/a',
2221
				'/li',
2222
				'<li',
2223
				array('a' => array('href' => '#')), 'Gene Splicing', '/a',
2224
				'/li',
2225
				array('li' => array('class' => 'current')),
2226
				array('a' => array('href' => '#')), 'Home', '/a',
2227
				'/li',
2228
				'/ul'
2229
			), true
2230
		);
2231
	}
2232
 
2233
/**
2234
 * testLoadConfig method
2235
 *
2236
 * @return void
2237
 */
2238
 
2239
	public function testLoadConfig() {
2240
		$path = CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS;
2241
 
2242
		$result = $this->Html->loadConfig('htmlhelper_tags', $path);
2243
		$expected = array(
2244
			'tags' => array(
2245
				'form' => 'start form',
2246
				'formend' => 'finish form',
2247
				'hiddenblock' => '<div class="hidden">%s</div>'
2248
			)
2249
		);
2250
		$this->assertEquals($expected, $result);
2251
		$tags = $this->Html->getAttribute('_tags');
2252
		$this->assertEquals('start form', $tags['form']);
2253
		$this->assertEquals('finish form', $tags['formend']);
2254
		$this->assertEquals('</select>', $tags['selectend']);
2255
 
2256
		$result = $this->Html->loadConfig(array('htmlhelper_minimized.ini', 'ini'), $path);
2257
		$expected = array(
2258
			'minimizedAttributeFormat' => 'format'
2259
		);
2260
		$this->assertEquals($expected, $result);
2261
		$this->assertEquals('format', $this->Html->getAttribute('_minimizedAttributeFormat'));
2262
	}
2263
 
2264
/**
2265
 * testLoadConfigWrongFile method
2266
 *
2267
 * @return void
2268
 * @expectedException ConfigureException
2269
 */
2270
	public function testLoadConfigWrongFile() {
2271
		$this->Html->loadConfig('wrong_file');
2272
	}
2273
 
2274
/**
2275
 * testLoadConfigWrongReader method
2276
 *
2277
 * @return void
2278
 * @expectedException ConfigureException
2279
 */
2280
	public function testLoadConfigWrongReader() {
2281
		$path = CAKE . 'Test' . DS . 'test_app' . DS . 'Config' . DS;
2282
		$this->Html->loadConfig(array('htmlhelper_tags', 'wrong_reader'), $path);
2283
	}
2284
 
2285
/**
2286
 * test parsing attributes.
2287
 *
2288
 * @return void
2289
 */
2290
	public function testParseAttributeCompact() {
2291
		$helper = new TestHtmlHelper($this->View);
2292
		$compact = array('compact', 'checked', 'declare', 'readonly', 'disabled',
2293
			'selected', 'defer', 'ismap', 'nohref', 'noshade', 'nowrap', 'multiple', 'noresize');
2294
 
2295
		foreach ($compact as $attribute) {
2296
			foreach (array('true', true, 1, '1', $attribute) as $value) {
2297
				$attrs = array($attribute => $value);
2298
				$expected = ' ' . $attribute . '="' . $attribute . '"';
2299
				$this->assertEquals($expected, $helper->parseAttributes($attrs), '%s Failed on ' . $value);
2300
			}
2301
		}
2302
		$this->assertEquals(' compact="compact"', $helper->parseAttributes(array('compact')));
2303
 
2304
		$attrs = array('class' => array('foo', 'bar'));
2305
		$expected = ' class="foo bar"';
2306
		$this->assertEquals(' class="foo bar"', $helper->parseAttributes($attrs));
2307
 
2308
		$helper = new Html5TestHelper($this->View);
2309
		$expected = ' require';
2310
		$this->assertEquals($expected, $helper->parseAttributes(array('require')));
2311
		$this->assertEquals($expected, $helper->parseAttributes(array('require' => true)));
2312
		$this->assertEquals('', $helper->parseAttributes(array('require' => false)));
2313
	}
2314
 
2315
}