‪TYPO3CMS  11.5
ResourceCompressorTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\MockObject\MockObject;
24 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
25 
30 {
34  protected ‪$backupEnvironment = true;
35 
39  protected ‪$subject;
40 
44  protected function ‪setUp(): void
45  {
46  parent::setUp();
47  $this->subject = $this->getAccessibleMock(ResourceCompressor::class, ['compressCssFile', 'compressJsFile', 'createMergedCssFile', 'createMergedJsFile', 'getFilenameFromMainDir', 'checkBaseDirectory']);
48  }
49 
53  public function ‪cssFixStatementsDataProvider(): array
54  {
55  return [
56  'nothing to do - no charset/import/namespace' => [
57  'body { background: #ffffff; }',
58  'body { background: #ffffff; }',
59  ],
60  'import in front' => [
61  '@import url(http://www.example.com/css); body { background: #ffffff; }',
62  'LF/* moved by compressor */LF@import url(http://www.example.com/css);LF/* moved by compressor */LFbody { background: #ffffff; }',
63  ],
64  'import in back, without quotes' => [
65  'body { background: #ffffff; } @import url(http://www.example.com/css);',
66  'LF/* moved by compressor */LF@import url(http://www.example.com/css);LF/* moved by compressor */LFbody { background: #ffffff; }',
67  ],
68  'import in back, with double-quotes' => [
69  'body { background: #ffffff; } @import url("http://www.example.com/css");',
70  'LF/* moved by compressor */LF@import url("http://www.example.com/css");LF/* moved by compressor */LFbody { background: #ffffff; }',
71  ],
72  'import in back, with single-quotes' => [
73  'body { background: #ffffff; } @import url(\'http://www.example.com/css\');',
74  'LF/* moved by compressor */LF@import url(\'http://www.example.com/css\');LF/* moved by compressor */LFbody { background: #ffffff; }',
75  ],
76  'import in middle and back, without quotes' => [
77  'body { background: #ffffff; } @import url(http://www.example.com/A); div { background: #000; } @import url(http://www.example.com/B);',
78  'LF/* moved by compressor */LF@import url(http://www.example.com/A);@import url(http://www.example.com/B);LF/* moved by compressor */LFbody { background: #ffffff; } div { background: #000; }',
79  ],
80  'charset declaration is unique' => [
81  'body { background: #ffffff; } @charset "UTF-8"; div { background: #000; }; @charset "UTF-8";',
82  '@charset "UTF-8";LF/* moved by compressor */LFbody { background: #ffffff; } div { background: #000; };',
83  ],
84  'order of charset, namespace and import is correct' => [
85  'body { background: #ffffff; } @charset "UTF-8"; div { background: #000; }; @import "file2.css"; @namespace url(http://www.w3.org/1999/xhtml);',
86  '@charset "UTF-8";LF/* moved by compressor */LF@namespace url(http://www.w3.org/1999/xhtml);LF/* moved by compressor */LF@import "file2.css";LF/* moved by compressor */LFbody { background: #ffffff; } div { background: #000; };',
87  ],
88  ];
89  }
90 
97  public function ‪cssFixStatementsMovesStatementsToTopIfNeeded(string $input, string $expected): void
98  {
99  $result = $this->subject->_call('cssFixStatements', $input);
100  $resultWithReadableLinefeed = str_replace(LF, 'LF', $result);
101  self::assertEquals($expected, $resultWithReadableLinefeed);
102  }
103 
108  {
109  $fileName = 'fooFile.css';
110  $compressedFileName = $fileName . '.gzip';
111  $testFileFixture = [
112  $fileName => [
113  'file' => $fileName,
114  'compress' => true,
115  ],
116  ];
117  $this->subject->expects(self::once())
118  ->method('compressCssFile')
119  ->with($fileName)
120  ->willReturn($compressedFileName);
121 
122  $result = $this->subject->compressCssFiles($testFileFixture);
123 
124  self::assertArrayHasKey($compressedFileName, $result);
125  self::assertArrayHasKey('compress', $result[$compressedFileName]);
126  self::assertFalse($result[$compressedFileName]['compress']);
127  }
128 
132  public function ‪compressedJsFileIsFlaggedToNotCompressAgain(): void
133  {
134  $fileName = 'fooFile.js';
135  $compressedFileName = $fileName . '.gzip';
136  $testFileFixture = [
137  $fileName => [
138  'file' => $fileName,
139  'compress' => true,
140  ],
141  ];
142  $this->subject->expects(self::once())
143  ->method('compressJsFile')
144  ->with($fileName)
145  ->willReturn($compressedFileName);
146 
147  $result = $this->subject->compressJsFiles($testFileFixture);
148 
149  self::assertArrayHasKey($compressedFileName, $result);
150  self::assertArrayHasKey('compress', $result[$compressedFileName]);
151  self::assertFalse($result[$compressedFileName]['compress']);
152  }
153 
158  {
159  $fileName = 'fooFile.css';
160  $concatenatedFileName = 'merged_' . $fileName;
161  $testFileFixture = [
162  $fileName => [
163  'file' => $fileName,
164  'excludeFromConcatenation' => false,
165  'media' => 'all',
166  ],
167  ];
168  $this->subject->expects(self::once())
169  ->method('createMergedCssFile')
170  ->willReturn($concatenatedFileName);
171 
172  $result = $this->subject->concatenateCssFiles($testFileFixture);
173 
174  self::assertArrayHasKey($concatenatedFileName, $result);
175  self::assertArrayHasKey('excludeFromConcatenation', $result[$concatenatedFileName]);
176  self::assertTrue($result[$concatenatedFileName]['excludeFromConcatenation']);
177  }
178 
182  public function ‪concatenatedCssFilesAreSeparatedByMediaType(): void
183  {
184  $allFileName = 'allFile.css';
185  $screenFileName1 = 'screenFile.css';
186  $screenFileName2 = 'screenFile2.css';
187  $testFileFixture = [
188  $allFileName => [
189  'file' => $allFileName,
190  'excludeFromConcatenation' => false,
191  'media' => 'all',
192  ],
193  // use two screen files to check if they are merged into one, even with a different media type
194  $screenFileName1 => [
195  'file' => $screenFileName1,
196  'excludeFromConcatenation' => false,
197  'media' => 'screen',
198  ],
199  $screenFileName2 => [
200  'file' => $screenFileName2,
201  'excludeFromConcatenation' => false,
202  'media' => 'screen',
203  ],
204  ];
205  $this->subject->expects(self::exactly(2))
206  ->method('createMergedCssFile')
207  ->will(self::onConsecutiveCalls(
208  self::returnValue('merged_' . $allFileName),
209  self::returnValue('merged_' . $screenFileName1)
210  ));
211 
212  $result = $this->subject->concatenateCssFiles($testFileFixture);
213 
214  self::assertEquals([
215  'merged_' . $allFileName,
216  'merged_' . $screenFileName1,
217  ], array_keys($result));
218  self::assertEquals('all', $result['merged_' . $allFileName]['media']);
219  self::assertEquals('screen', $result['merged_' . $screenFileName1]['media']);
220  }
221 
225  public function ‪concatenatedCssFilesObeyForceOnTopOption(): void
226  {
227  $screen1FileName = 'screen1File.css';
228  $screen2FileName = 'screen2File.css';
229  $screen3FileName = 'screen3File.css';
230  $testFileFixture = [
231  $screen1FileName => [
232  'file' => $screen1FileName,
233  'excludeFromConcatenation' => false,
234  'media' => 'screen',
235  ],
236  $screen2FileName => [
237  'file' => $screen2FileName,
238  'excludeFromConcatenation' => false,
239  'media' => 'screen',
240  ],
241  $screen3FileName => [
242  'file' => $screen3FileName,
243  'excludeFromConcatenation' => false,
244  'forceOnTop' => true,
245  'media' => 'screen',
246  ],
247  ];
248  // Replace mocked method getFilenameFromMainDir by passthrough callback
249  $this->subject->method('getFilenameFromMainDir')->willReturnArgument(0);
250  $this->subject->expects(self::once())
251  ->method('createMergedCssFile')
252  ->with(self::equalTo([$screen3FileName, $screen1FileName, $screen2FileName]));
253 
254  $this->subject->concatenateCssFiles($testFileFixture);
255  }
256 
261  {
262  $screen1FileName = 'screen1File.css';
263  $screen2FileName = 'screen2File.css';
264  $screen3FileName = 'screen3File.css';
265  $testFileFixture = [
266  $screen1FileName => [
267  'file' => $screen1FileName,
268  'excludeFromConcatenation' => false,
269  'media' => 'screen',
270  ],
271  $screen2FileName => [
272  'file' => $screen2FileName,
273  'excludeFromConcatenation' => true,
274  'media' => 'screen',
275  ],
276  $screen3FileName => [
277  'file' => $screen3FileName,
278  'excludeFromConcatenation' => false,
279  'media' => 'screen',
280  ],
281  ];
282  $this->subject->method('getFilenameFromMainDir')->willReturnArgument(0);
283  $this->subject->expects(self::once())
284  ->method('createMergedCssFile')
285  ->with(self::equalTo([$screen1FileName, $screen3FileName]))
286  ->willReturn('merged_screen');
287 
288  $result = $this->subject->concatenateCssFiles($testFileFixture);
289  self::assertEquals([
290  $screen2FileName,
291  'merged_screen',
292  ], array_keys($result));
293  self::assertEquals('screen', $result[$screen2FileName]['media']);
294  self::assertEquals('screen', $result['merged_screen']['media']);
295  }
296 
301  {
302  $fileName = 'fooFile.js';
303  $concatenatedFileName = 'merged_' . $fileName;
304  $testFileFixture = [
305  $fileName => [
306  'file' => $fileName,
307  'excludeFromConcatenation' => false,
308  'section' => 'top',
309  ],
310  ];
311  $this->subject->expects(self::once())
312  ->method('createMergedJsFile')
313  ->willReturn($concatenatedFileName);
314 
315  $result = $this->subject->concatenateJsFiles($testFileFixture);
316 
317  self::assertArrayHasKey($concatenatedFileName, $result);
318  self::assertArrayHasKey('excludeFromConcatenation', $result[$concatenatedFileName]);
319  self::assertTrue($result[$concatenatedFileName]['excludeFromConcatenation']);
320  }
321 
325  public function ‪concatenateJsFileAsyncDataProvider(): array
326  {
327  return [
328  'all files have no async' => [
329  [
330  [
331  'file' => 'file1.js',
332  'excludeFromConcatenation' => false,
333  'section' => 'top',
334  ],
335  [
336  'file' => 'file2.js',
337  'excludeFromConcatenation' => false,
338  'section' => 'top',
339  ],
340  ],
341  false,
342  ],
343  'all files have async false' => [
344  [
345  [
346  'file' => 'file1.js',
347  'excludeFromConcatenation' => false,
348  'section' => 'top',
349  'async' => false,
350  ],
351  [
352  'file' => 'file2.js',
353  'excludeFromConcatenation' => false,
354  'section' => 'top',
355  'async' => false,
356  ],
357  ],
358  false,
359  ],
360  'all files have async true' => [
361  [
362  [
363  'file' => 'file1.js',
364  'excludeFromConcatenation' => false,
365  'section' => 'top',
366  'async' => true,
367  ],
368  [
369  'file' => 'file2.js',
370  'excludeFromConcatenation' => false,
371  'section' => 'top',
372  'async' => true,
373  ],
374  ],
375  true,
376  ],
377  'one file async true and one file async false' => [
378  [
379  [
380  'file' => 'file1.js',
381  'excludeFromConcatenation' => false,
382  'section' => 'top',
383  'async' => true,
384  ],
385  [
386  'file' => 'file2.js',
387  'excludeFromConcatenation' => false,
388  'section' => 'top',
389  'async' => false,
390  ],
391  ],
392  false,
393  ],
394  'one file async true and one file async false but is excluded form concatenation' => [
395  [
396  [
397  'file' => 'file1.js',
398  'excludeFromConcatenation' => false,
399  'section' => 'top',
400  'async' => true,
401  ],
402  [
403  'file' => 'file2.js',
404  'excludeFromConcatenation' => true,
405  'section' => 'top',
406  'async' => false,
407  ],
408  ],
409  true,
410  ],
411  'one file async false and one file async true but is excluded form concatenation' => [
412  [
413  [
414  'file' => 'file1.js',
415  'excludeFromConcatenation' => false,
416  'section' => 'top',
417  'async' => false,
418  ],
419  [
420  'file' => 'file2.js',
421  'excludeFromConcatenation' => true,
422  'section' => 'top',
423  'async' => true,
424  ],
425  ],
426  false,
427  ],
428  ];
429  }
430 
437  public function ‪concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync(array $input, bool $expected): void
438  {
439  $concatenatedFileName = 'merged_foo.js';
440  $this->subject->expects(self::once())
441  ->method('createMergedJsFile')
442  ->willReturn($concatenatedFileName);
443 
444  $result = $this->subject->concatenateJsFiles($input);
445 
446  self::assertSame($expected, $result[$concatenatedFileName]['async']);
447  }
448 
452  public function ‪calcStatementsDataProvider(): array
453  {
454  return [
455  'simple calc' => [
456  'calc(100% - 3px)',
457  'calc(100% - 3px)',
458  ],
459  'complex calc with parentheses at the beginning' => [
460  'calc((100%/20) - 2*3px)',
461  'calc((100%/20) - 2*3px)',
462  ],
463  'complex calc with parentheses at the end' => [
464  'calc(100%/20 - 2*3px - (200px + 3%))',
465  'calc(100%/20 - 2*3px - (200px + 3%))',
466  ],
467  'complex calc with many parentheses' => [
468  'calc((100%/20) - (2 * (3px - (200px + 3%))))',
469  'calc((100%/20) - (2 * (3px - (200px + 3%))))',
470  ],
471  ];
472  }
473 
480  public function ‪calcFunctionMustRetainWhitespaces(string $input, string $expected): void
481  {
482  $result = $this->subject->_call('compressCssString', $input);
483  self::assertSame($expected, trim($result));
484  }
485 
489  public function ‪compressCssFileContentDataProvider(): array
490  {
491  $path = __DIR__ . '/ResourceCompressorTest/Fixtures/';
492  return [
493  // File. Tests:
494  // - Stripped comments and white-space.
495  // - Retain white-space in selectors. (http://drupal.org/node/472820)
496  // - Retain pseudo-selectors. (http://drupal.org/node/460448)
497  0 => [
498  $path . 'css_input_without_import.css',
499  $path . 'css_input_without_import.css.optimized.css',
500  ],
501  // File. Tests:
502  // - Retain comment hacks.
503  2 => [
504  $path . 'comment_hacks.css',
505  $path . 'comment_hacks.css.optimized.css',
506  ], /*
507  // File. Tests:
508  // - Any @charset declaration at the beginning of a file should be
509  // removed without breaking subsequent CSS.*/
510  6 => [
511  $path . 'charset_sameline.css',
512  $path . 'charset.css.optimized.css',
513  ],
514  7 => [
515  $path . 'charset_newline.css',
516  $path . 'charset.css.optimized.css',
517  ],
518  ];
519  }
520 
529  public function ‪compressCssFileContent(string $cssFile, string $expected): void
530  {
531  $cssContent = file_get_contents($cssFile);
532  $compressedCss = $this->subject->_call('compressCssString', $cssContent);
533  // we have to fix relative paths, if we aren't working on a file in our target directory
534  $relativeFilename = str_replace(‪Environment::getPublicPath() . '/', '', $cssFile);
535  if (!str_contains($relativeFilename, $this->subject->_get('targetDirectory'))) {
536  $compressedCss = $this->subject->_call('cssFixRelativeUrlPaths', $compressedCss, ‪PathUtility::dirname($relativeFilename) . '/');
537  }
538  self::assertStringEqualsFile($expected, $compressedCss, 'Group of file CSS assets optimized correctly.');
539  }
540 
545  {
546  return [
547  // Get filename using EXT:
548  [
549  'EXT:core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
550  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
551  ],
552  // Get filename using relative path
553  [
554  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
555  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
556  ],
557  [
558  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
559  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
560  ],
561  [
562  'typo3temp/assets/compressed/.htaccess',
563  '../typo3temp/assets/compressed/.htaccess',
564  ],
565  // Get filename using absolute path
566  [
567  ‪Environment::getPublicPath() . '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
568  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
569  ],
570  // Get filename using docroot relative path
571  [
572  '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
573  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
574  ],
575  ];
576  }
577 
584  public function ‪getFilenamesFromMainDirInBackendContext(string $filename, string $expected): void
585  {
586  // getCurrentScript() called by PathUtility::getRelativePathTo() is usually something
587  // like '.../bin/phpunit' in testing context, but we want .../typo3/index.php as entry
588  // script point here to fake the backend call.
589  $bePath = ‪Environment::getBackendPath();
592  true,
593  false,
598  $bePath . '/index.php',
599  ‪Environment::isWindows() ? 'WINDOWS' : 'UNIX'
600  );
601  ‪$subject = $this->getAccessibleMock(ResourceCompressor::class, ['dummy']);
602  ‪$subject->‪setRootPath($bePath . '/');
603  $relativeToRootPath = ‪$subject->_call('getFilenameFromMainDir', $filename);
604  self::assertSame($expected, $relativeToRootPath);
605  }
606 
611  {
612  $subfolderFake = basename(‪Environment::getPublicPath());
613  return [
614  // Get filename using absolute path
615  [
616  ‪Environment::getPublicPath() . '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
617  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
618  ],
619  // Get filename using docroot relative path
620  [
621  '/' . $subfolderFake . '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
622  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
623  ],
624  ];
625  }
626 
633  public function ‪getFilenamesFromMainDirInBackendContextWithSubFolder(string $filename, string $expected): void
634  {
635  // getCurrentScript() called by PathUtility::getRelativePathTo() is usually something
636  // like '.../bin/phpunit' in testing context, but we want .../typo3/index.php as entry
637  // script point here to fake the backend call.
638  $bePath = ‪Environment::getBackendPath();
639  $subfolderFake = basename(‪Environment::getPublicPath());
640  $_SERVER['SCRIPT_NAME'] = '/' . $subfolderFake . '/typo3/index.php';
643  true,
644  false,
649  $bePath . '/index.php',
650  ‪Environment::isWindows() ? 'WINDOWS' : 'UNIX'
651  );
652  ‪$subject = $this->getAccessibleMock(ResourceCompressor::class, ['dummy']);
653  ‪$subject->‪setRootPath($bePath . '/');
654  $relativeToRootPath = ‪$subject->_call('getFilenameFromMainDir', $filename);
655  self::assertSame($expected, $relativeToRootPath);
656  }
657 
662  {
663  return [
664  // Get filename using EXT:
665  [
666  'EXT:core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
667  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
668  ],
669  // Get filename using relative path
670  [
671  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
672  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
673  ],
674  [
675  'typo3temp/assets/compressed/.htaccess',
676  'typo3temp/assets/compressed/.htaccess',
677  ],
678  ];
679  }
680 
687  public function ‪getFilenamesFromMainDirInFrontendContext(string $filename, string $expected): void
688  {
689  // getCurrentScript() called by PathUtility::getRelativePathTo() is usually something
690  // like '.../bin/phpunit' in testing context, but we want .../index.php as entry
691  // script point here to fake the frontend call.
692  $fePath = ‪Environment::getPublicPath();
695  true,
696  false,
701  $fePath . '/index.php',
702  ‪Environment::isWindows() ? 'WINDOWS' : 'UNIX'
703  );
704  ‪$subject = $this->getAccessibleMock(ResourceCompressor::class, ['dummy']);
705  ‪$subject->‪setRootPath($fePath . '/');
706  $relativeToRootPath = ‪$subject->_call('getFilenameFromMainDir', $filename);
707  self::assertSame($expected, $relativeToRootPath);
708  }
709 
713  public function ‪nomoduleJavascriptIsNotConcatenated(): void
714  {
715  $fileName = 'fooFile.js';
716  $concatenatedFileName = 'merged_' . $fileName;
717  $testFileFixture = [
718  $fileName => [
719  'file' => $fileName,
720  'nomodule' => true,
721  'section' => 'top',
722  ],
723  ];
724 
725  $result = $this->subject->concatenateJsFiles($testFileFixture);
726 
727  self::assertArrayNotHasKey($concatenatedFileName, $result);
728  self::assertTrue($result[$fileName]['nomodule']);
729  }
730 
734  public function ‪deferJavascriptIsNotConcatenated(): void
735  {
736  $fileName = 'fooFile.js';
737  $concatenatedFileName = 'merged_' . $fileName;
738  $testFileFixture = [
739  $fileName => [
740  'file' => $fileName,
741  'defer' => true,
742  'section' => 'top',
743  ],
744  ];
745 
746  $result = $this->subject->concatenateJsFiles($testFileFixture);
747 
748  self::assertArrayNotHasKey($concatenatedFileName, $result);
749  self::assertTrue($result[$fileName]['defer']);
750  }
751 }
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\calcFunctionMustRetainWhitespaces
‪calcFunctionMustRetainWhitespaces(string $input, string $expected)
Definition: ResourceCompressorTest.php:478
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:25
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$backupEnvironment
‪bool $backupEnvironment
Definition: ResourceCompressorTest.php:33
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInBackendContextWithSubFolder
‪getFilenamesFromMainDirInBackendContextWithSubFolder(string $filename, string $expected)
Definition: ResourceCompressorTest.php:631
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\cssFixStatementsDataProvider
‪array cssFixStatementsDataProvider()
Definition: ResourceCompressorTest.php:51
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFilesObeyExcludeFromConcatenation
‪concatenatedCssFilesObeyExcludeFromConcatenation()
Definition: ResourceCompressorTest.php:258
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static string getPublicPath()
Definition: Environment.php:206
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInBackendContext
‪getFilenamesFromMainDirInBackendContext(string $filename, string $expected)
Definition: ResourceCompressorTest.php:582
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInFrontendContextDataProvider
‪array getFilenamesFromMainDirInFrontendContextDataProvider()
Definition: ResourceCompressorTest.php:659
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFilesAreSeparatedByMediaType
‪concatenatedCssFilesAreSeparatedByMediaType()
Definition: ResourceCompressorTest.php:180
‪TYPO3\CMS\Core\Utility\PathUtility\dirname
‪static string dirname($path)
Definition: PathUtility.php:251
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\calcStatementsDataProvider
‪array calcStatementsDataProvider()
Definition: ResourceCompressorTest.php:450
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\nomoduleJavascriptIsNotConcatenated
‪nomoduleJavascriptIsNotConcatenated()
Definition: ResourceCompressorTest.php:711
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest
Definition: ResourceCompressorTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Resource
Definition: AbstractFileTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Resource\BaseTestCase
Definition: BaseTestCase.php:31
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static bool isWindows()
Definition: Environment.php:318
‪TYPO3\CMS\Core\Resource\ResourceCompressor
Definition: ResourceCompressor.php:32
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInBackendContextDataProvider
‪array getFilenamesFromMainDirInBackendContextDataProvider()
Definition: ResourceCompressorTest.php:542
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenateJsFileAsyncDataProvider
‪array concatenateJsFileAsyncDataProvider()
Definition: ResourceCompressorTest.php:323
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressCssFileContentDataProvider
‪array compressCssFileContentDataProvider()
Definition: ResourceCompressorTest.php:487
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static ApplicationContext getContext()
Definition: Environment.php:141
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$subject
‪ResourceCompressor MockObject AccessibleObjectInterface $subject
Definition: ResourceCompressorTest.php:37
‪TYPO3\CMS\Core\Resource\ResourceCompressor\setRootPath
‪setRootPath($rootPath)
Definition: ResourceCompressor.php:101
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync
‪concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync(array $input, bool $expected)
Definition: ResourceCompressorTest.php:435
‪TYPO3\CMS\Core\Core\Environment\getProjectPath
‪static string getProjectPath()
Definition: Environment.php:177
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenateJsFileIsFlaggedToNotConcatenateAgain
‪concatenateJsFileIsFlaggedToNotConcatenateAgain()
Definition: ResourceCompressorTest.php:298
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\deferJavascriptIsNotConcatenated
‪deferJavascriptIsNotConcatenated()
Definition: ResourceCompressorTest.php:732
‪TYPO3\CMS\Core\Core\Environment\initialize
‪static initialize(ApplicationContext $context, bool $cli, bool $composerMode, string $projectPath, string $publicPath, string $varPath, string $configPath, string $currentScript, string $os)
Definition: Environment.php:111
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInBackendContextInSubfolderDataProvider
‪array getFilenamesFromMainDirInBackendContextInSubfolderDataProvider()
Definition: ResourceCompressorTest.php:608
‪TYPO3\CMS\Core\Core\Environment\getBackendPath
‪static string getBackendPath()
Definition: Environment.php:276
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressCssFileContent
‪compressCssFileContent(string $cssFile, string $expected)
Definition: ResourceCompressorTest.php:527
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressedCssFileIsFlaggedToNotCompressAgain
‪compressedCssFileIsFlaggedToNotCompressAgain()
Definition: ResourceCompressorTest.php:105
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:43
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInFrontendContext
‪getFilenamesFromMainDirInFrontendContext(string $filename, string $expected)
Definition: ResourceCompressorTest.php:685
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\setUp
‪setUp()
Definition: ResourceCompressorTest.php:42
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressedJsFileIsFlaggedToNotCompressAgain
‪compressedJsFileIsFlaggedToNotCompressAgain()
Definition: ResourceCompressorTest.php:130
‪TYPO3\CMS\Core\Core\Environment\getConfigPath
‪static string getConfigPath()
Definition: Environment.php:236
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFileIsFlaggedToNotConcatenateAgain
‪concatenatedCssFileIsFlaggedToNotConcatenateAgain()
Definition: ResourceCompressorTest.php:155
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\cssFixStatementsMovesStatementsToTopIfNeeded
‪cssFixStatementsMovesStatementsToTopIfNeeded(string $input, string $expected)
Definition: ResourceCompressorTest.php:95
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFilesObeyForceOnTopOption
‪concatenatedCssFilesObeyForceOnTopOption()
Definition: ResourceCompressorTest.php:223
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static string getVarPath()
Definition: Environment.php:218