[!!!][TASK] Extract testing framework for TYPO3
[Packages/TYPO3.CMS.git] / typo3 / sysext / core / Tests / Functional / Page / PageRendererTest.php
1 <?php
2 namespace TYPO3\CMS\Core\Tests\Functional\Page;
3
4 /*
5 * This file is part of the TYPO3 CMS project.
6 *
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
10 *
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
13 *
14 * The TYPO3 project - inspiring people to share!
15 */
16
17 /**
18 * Test case
19 */
20 class PageRendererTest extends \TYPO3\CMS\Components\TestingFramework\Core\FunctionalTestCase
21 {
22 /**
23 * @test
24 */
25 public function pageRendererRendersInsertsMainContentStringsInOutput()
26 {
27 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
28 $subject->setCharSet('utf-8');
29 $subject->setLanguage('default');
30
31 $prologueString = $expectedPrologueString = '<?xml version="1.0" encoding="utf-8" ?>';
32 $subject->setXmlPrologAndDocType($prologueString);
33
34 $title = $this->getUniqueId('aTitle-');
35 $subject->setTitle($title);
36 $expectedTitleString = '<title>' . $title . '</title>';
37
38 $charset = 'utf-8';
39 $subject->setCharSet($charset);
40 $expectedCharsetString = '<meta http-equiv="Content-Type" content="text/html; charset=' . $charset . '" />';
41
42 $favouriteIcon = 'http://google.com/favicon.ico';
43 $subject->setFavIcon($favouriteIcon);
44 $expectedFavouriteIconPartOne = '<link rel="shortcut icon" href="' . $favouriteIcon . '" />';
45
46 $baseUrl = 'http://google.com/';
47 $subject->setBaseUrl($baseUrl);
48 $expectedBaseUrlString = '<base href="' . $baseUrl . '" />';
49
50 $metaTag = $expectedMetaTagString = '<meta name="author" content="Anna Lyse">';
51 $subject->addMetaTag($metaTag);
52
53 $inlineComment = $this->getUniqueId('comment');
54 $subject->addInlineComment($inlineComment);
55 $expectedInlineCommentString = '<!-- ' . LF . $inlineComment . '-->';
56
57 $headerData = $expectedHeaderData = '<tag method="private" name="test" />';
58 $subject->addHeaderData($headerData);
59
60 $subject->addJsLibrary('test', 'fileadmin/test.js', 'text/javascript', false, false, 'wrapBeforeXwrapAfter', false, 'X');
61 $expectedJsLibraryRegExp = '#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
62
63 $subject->addJsFile('fileadmin/test.js', 'text/javascript', false, false, 'wrapBeforeXwrapAfter', false, 'X');
64 $expectedJsFileRegExp = '#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
65
66 $jsInlineCode = $expectedJsInlineCodeString = 'var x = "' . $this->getUniqueId('jsInline-') . '"';
67 $subject->addJsInlineCode($this->getUniqueId(), $jsInlineCode);
68
69 $extOnReadyCode = $expectedExtOnReadyCodePartOne = $this->getUniqueId('extOnReady-');
70 $expectedExtOnReadyCodePartTwo = 'Ext.onReady(function() {';
71 $subject->loadExtJS();
72 $subject->addExtOnReadyCode($extOnReadyCode);
73
74 $cssFile = $this->getUniqueId('cssFile-');
75 $expectedCssFileString = 'wrapBefore<link rel="stylesheet" type="text/css" href="' . $cssFile . '" media="print" />wrapAfter';
76 $subject->addCssFile($cssFile, 'stylesheet', 'print', '', true, false, 'wrapBeforeXwrapAfter', false, 'X');
77
78 $expectedCssInlineBlockOnTopString = '/*general3*/' . LF . 'h1 {margin:20px;}' . LF . '/*general2*/' . LF . 'body {margin:20px;}';
79 $subject->addCssInlineBlock('general2', 'body {margin:20px;}');
80 $subject->addCssInlineBlock('general3', 'h1 {margin:20px;}', null, true);
81
82 $subject->loadJquery();
83 $expectedJqueryRegExp = '#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-' . \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_VERSION_LATEST . '\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
84 $expectedJqueryStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.jQuery = jQuery.noConflict(true);';
85
86 $expectedBodyContent = $this->getUniqueId('ABCDE-');
87 $subject->setBodyContent($expectedBodyContent);
88
89 $renderedString = $subject->render();
90
91 $this->assertContains($expectedPrologueString, $renderedString);
92 $this->assertContains($expectedTitleString, $renderedString);
93 $this->assertContains($expectedCharsetString, $renderedString);
94 $this->assertContains($expectedFavouriteIconPartOne, $renderedString);
95 $this->assertContains($expectedBaseUrlString, $renderedString);
96 $this->assertContains($expectedMetaTagString, $renderedString);
97 $this->assertContains($expectedInlineCommentString, $renderedString);
98 $this->assertContains($expectedHeaderData, $renderedString);
99 $this->assertRegExp($expectedJsLibraryRegExp, $renderedString);
100 $this->assertRegExp($expectedJsFileRegExp, $renderedString);
101 $this->assertContains($expectedJsInlineCodeString, $renderedString);
102 $this->assertContains($expectedExtOnReadyCodePartOne, $renderedString);
103 $this->assertContains($expectedExtOnReadyCodePartTwo, $renderedString);
104 $this->assertContains($expectedCssFileString, $renderedString);
105 $this->assertContains($expectedCssInlineBlockOnTopString, $renderedString);
106 $this->assertRegExp($expectedJqueryRegExp, $renderedString);
107 $this->assertContains($expectedJqueryStatement, $renderedString);
108 $this->assertContains($expectedBodyContent, $renderedString);
109 }
110
111 /**
112 * @test
113 */
114 public function pageRendererRendersFooterValues()
115 {
116 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
117 $subject->setCharSet('utf-8');
118 $subject->setLanguage('default');
119
120 $subject->enableMoveJsFromHeaderToFooter();
121
122 $footerData = $expectedFooterData = '<tag method="private" name="test" />';
123 $subject->addFooterData($footerData);
124
125 $expectedJsFooterLibraryRegExp = '#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
126 $subject->addJsFooterLibrary('test', 'fileadmin/test.js', 'text/javascript', false, false, 'wrapBeforeXwrapAfter', false, 'X');
127
128 $expectedJsFooterRegExp = '#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
129 $subject->addJsFooterFile('fileadmin/test.js', 'text/javascript', false, false, 'wrapBeforeXwrapAfter', false, 'X');
130
131 $jsFooterInlineCode = $expectedJsFooterInlineCodeString = 'var x = "' . $this->getUniqueId('jsFooterInline-') . '"';
132 $subject->addJsFooterInlineCode($this->getUniqueId(), $jsFooterInlineCode);
133
134 // Bunch of label tests
135 $subject->loadExtJS();
136 $subject->addInlineLanguageLabel('myKey', 'myValue');
137 $subject->addInlineLanguageLabelArray([
138 'myKeyArray1' => 'myValueArray1',
139 'myKeyArray2' => 'myValueArray2'
140 ]);
141 $subject->addInlineLanguageLabelArray([
142 'myKeyArray3' => 'myValueArray3'
143 ]);
144 $expectedInlineLabelReturnValue = 'TYPO3.lang = {"myKey":"myValue","myKeyArray1":"myValueArray1","myKeyArray2":"myValueArray2","myKeyArray3":"myValueArray3"';
145
146 $subject->addInlineLanguageLabelFile('EXT:lang/Resources/Private/Language/locallang_core.xlf');
147 $expectedLanguageLabel1 = 'labels.beUser';
148 $expectedLanguageLabel2 = 'labels.feUser';
149
150 // Bunch of inline settings test
151 $subject->addInlineSetting('myApp', 'myKey', 'myValue');
152 $subject->addInlineSettingArray('myApp', [
153 'myKey1' => 'myValue1',
154 'myKey2' => 'myValue2'
155 ]);
156 $subject->addInlineSettingArray('myApp', [
157 'myKey3' => 'myValue3'
158 ]);
159 $expectedInlineSettingsReturnValue = 'TYPO3.settings = {"myApp":{"myKey":"myValue","myKey1":"myValue1","myKey2":"myValue2","myKey3":"myValue3"}';
160
161 $renderedString = $subject->render(\TYPO3\CMS\Core\Page\PageRenderer::PART_FOOTER);
162
163 $this->assertContains($expectedFooterData, $renderedString);
164 $this->assertRegExp($expectedJsFooterLibraryRegExp, $renderedString);
165 $this->assertRegExp($expectedJsFooterRegExp, $renderedString);
166 $this->assertContains($expectedJsFooterInlineCodeString, $renderedString);
167 $this->assertContains($expectedInlineLabelReturnValue, $renderedString);
168 $this->assertContains($expectedLanguageLabel1, $renderedString);
169 $this->assertContains($expectedLanguageLabel2, $renderedString);
170 $this->assertContains($expectedInlineSettingsReturnValue, $renderedString);
171 }
172
173 /**
174 * @test
175 */
176 public function loadJqueryRespectsGivenNamespace()
177 {
178 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
179
180 $expectedRegExp = '#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-' . \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_VERSION_LATEST . '\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
181 $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.MyNameSpace = jQuery.noConflict(true);';
182 $subject->loadJquery(null, null, 'MyNameSpace');
183 $out = $subject->render();
184 $this->assertRegExp($expectedRegExp, $out);
185 $this->assertContains($expectedStatement, $out);
186 }
187
188 /**
189 * @test
190 */
191 public function loadJqueryWithDefaultNoConflictModeDoesNotSetNamespace()
192 {
193 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
194
195 $expectedRegExp = '#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-' . \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_VERSION_LATEST . '\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
196 $expectedStatement = 'jQuery.noConflict();';
197 $subject->loadJquery(null, null, \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_NAMESPACE_DEFAULT_NOCONFLICT);
198 $out = $subject->render();
199 $this->assertRegExp($expectedRegExp, $out);
200 $this->assertContains($expectedStatement, $out);
201 $this->assertNotContains('var TYPO3 = TYPO3 || {}; TYPO3.', $out);
202 }
203
204 /**
205 * @test
206 */
207 public function loadJqueryWithNamespaceNoneDoesNotIncludeNoConflictHandling()
208 {
209 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
210
211 $expectedRegExp = '#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-' . \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_VERSION_LATEST . '\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
212 $subject->loadJquery(null, null, \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_NAMESPACE_NONE);
213 $out = $subject->render();
214 $this->assertRegExp($expectedRegExp, $out);
215 $this->assertNotContains('jQuery.noConflict', $out);
216 }
217
218 /**
219 * @test
220 */
221 public function loadJqueryLoadsTheLatestJqueryVersionInNoConflictModeUncompressedInDebugMode()
222 {
223 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
224
225 $expectedRegExp = '#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-' . \TYPO3\CMS\Core\Page\PageRenderer::JQUERY_VERSION_LATEST . '\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
226 $expectedStatement = 'var TYPO3 = TYPO3 || {}; TYPO3.jQuery = jQuery.noConflict(true);';
227 $subject->loadJquery();
228 $subject->enableDebugMode();
229 $out = $subject->render();
230 $this->assertRegExp($expectedRegExp, $out);
231 $this->assertContains($expectedStatement, $out);
232 }
233
234 /**
235 * @return array
236 */
237 public function loadJqueryFromSourceDataProvider()
238 {
239 return [
240 'google with version number' => [
241 '1.6.3',
242 'google',
243 '#<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.js" type="text/javascript"></script>#'
244 ],
245 'msn with version number' => [
246 '1.6.3',
247 'msn',
248 '#<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.3.js" type="text/javascript"></script>#'
249 ],
250 'jquery with version number' => [
251 '1.6.3',
252 'jquery',
253 '#<script src="https://code.jquery.com/jquery-1.6.3.js" type="text/javascript"></script>#'
254 ],
255 'jquery with custom URL' => [
256 '1.6.3',
257 'https://my.cool.cdn/foo/jquery.js',
258 '#<script src="https://my.cool.cdn/foo/jquery.js" type="text/javascript"></script>#'
259 ],
260 ];
261 }
262
263 /**
264 * @dataProvider loadJqueryFromSourceDataProvider
265 * @test
266 */
267 public function isJqueryLoadedFromSourceUncompressedIfDebugModeIsEnabled($version, $source, $regex)
268 {
269 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
270
271 $subject->loadJquery($version, $source);
272 $subject->enableDebugMode();
273 $out = $subject->render();
274 $this->assertRegExp($regex, $out);
275 }
276
277 /**
278 * @test
279 */
280 public function isJqueryLoadedMinifiedFromGoogleByDefault()
281 {
282 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
283
284 $expectedRegex = '#<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js" type="text/javascript"></script>#';
285 $subject->loadJquery('1.6.3', 'google');
286 $out = $subject->render();
287 $this->assertRegExp($expectedRegex, $out);
288 }
289
290 /**
291 * @test
292 */
293 public function loadExtJsInDebugLoadsDebugExtJs()
294 {
295 $subject = new \TYPO3\CMS\Core\Page\PageRenderer();
296
297 $expectedRegExp = '#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/extjs/ext-all-debug\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
298 $subject->loadExtJS(true, true);
299 $subject->enableExtJsDebug();
300 $out = $subject->render();
301 $this->assertRegExp($expectedRegExp, $out);
302 }
303 }