‪TYPO3CMS  ‪main
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 org\bovigo\vfs\vfsStream;
21 use PHPUnit\Framework\MockObject\MockObject;
26 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
27 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
28 
29 class ‪ResourceCompressorTest extends UnitTestCase
30 {
31  protected bool ‪$backupEnvironment = true;
32 
36  protected ‪$subject;
37 
38  protected string ‪$basedir = 'basedir';
39  protected ?string ‪$mountDir;
40  protected array ‪$vfsContents = [];
41 
42  protected function ‪setUp(): void
43  {
44  parent::setUp();
45  $this->mountDir = ‪StringUtility::getUniqueId('mount-');
46  $this->basedir = ‪StringUtility::getUniqueId('base-');
47  vfsStream::setup($this->basedir);
48  // Add an entry for the mount directory to the VFS contents
49  $this->vfsContents = [$this->mountDir => []];
50  $this->subject = $this->getAccessibleMock(ResourceCompressor::class, ['compressCssFile', 'compressJsFile', 'createMergedCssFile', 'createMergedJsFile', 'getFilenameFromMainDir', 'checkBaseDirectory']);
51  }
52 
56  public function ‪cssFixStatementsDataProvider(): array
57  {
58  return [
59  'nothing to do - no charset/import/namespace' => [
60  'body { background: #ffffff; }',
61  'body { background: #ffffff; }',
62  ],
63  'import in front' => [
64  '@import url(http://www.example.com/css); body { background: #ffffff; }',
65  'LF/* moved by compressor */LF@import url(http://www.example.com/css);LF/* moved by compressor */LFbody { background: #ffffff; }',
66  ],
67  'import in back, without quotes' => [
68  'body { background: #ffffff; } @import url(http://www.example.com/css);',
69  'LF/* moved by compressor */LF@import url(http://www.example.com/css);LF/* moved by compressor */LFbody { background: #ffffff; }',
70  ],
71  'import in back, with double-quotes' => [
72  'body { background: #ffffff; } @import url("http://www.example.com/css");',
73  'LF/* moved by compressor */LF@import url("http://www.example.com/css");LF/* moved by compressor */LFbody { background: #ffffff; }',
74  ],
75  'import in back, with single-quotes' => [
76  'body { background: #ffffff; } @import url(\'http://www.example.com/css\');',
77  'LF/* moved by compressor */LF@import url(\'http://www.example.com/css\');LF/* moved by compressor */LFbody { background: #ffffff; }',
78  ],
79  'import in middle and back, without quotes' => [
80  'body { background: #ffffff; } @import url(http://www.example.com/A); div { background: #000; } @import url(http://www.example.com/B);',
81  '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; }',
82  ],
83  'charset declaration is unique' => [
84  'body { background: #ffffff; } @charset "UTF-8"; div { background: #000; }; @charset "UTF-8";',
85  '@charset "UTF-8";LF/* moved by compressor */LFbody { background: #ffffff; } div { background: #000; };',
86  ],
87  'order of charset, namespace and import is correct' => [
88  'body { background: #ffffff; } @charset "UTF-8"; div { background: #000; }; @import "file2.css"; @namespace url(http://www.w3.org/1999/xhtml);',
89  '@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; };',
90  ],
91  ];
92  }
93 
100  public function ‪cssFixStatementsMovesStatementsToTopIfNeeded(string $input, string $expected): void
101  {
102  $this->subject->_call('initialize');
103  $result = $this->subject->_call('cssFixStatements', $input);
104  $resultWithReadableLinefeed = str_replace(LF, 'LF', $result);
105  self::assertEquals($expected, $resultWithReadableLinefeed);
106  }
107 
112  {
113  $fileName = 'fooFile.css';
114  $compressedFileName = $fileName . '.gz';
115  $testFileFixture = [
116  $fileName => [
117  'file' => $fileName,
118  'compress' => true,
119  ],
120  ];
121  $this->subject->expects(self::once())
122  ->method('compressCssFile')
123  ->with($fileName)
124  ->willReturn($compressedFileName);
125 
126  $result = $this->subject->compressCssFiles($testFileFixture);
127 
128  self::assertArrayHasKey($compressedFileName, $result);
129  self::assertArrayHasKey('compress', $result[$compressedFileName]);
130  self::assertFalse($result[$compressedFileName]['compress']);
131  }
132 
136  public function ‪compressedJsFileIsFlaggedToNotCompressAgain(): void
137  {
138  $fileName = 'fooFile.js';
139  $compressedFileName = $fileName . '.gz';
140  $testFileFixture = [
141  $fileName => [
142  'file' => $fileName,
143  'compress' => true,
144  ],
145  ];
146  $this->subject->expects(self::once())
147  ->method('compressJsFile')
148  ->with($fileName)
149  ->willReturn($compressedFileName);
150 
151  $result = $this->subject->compressJsFiles($testFileFixture);
152 
153  self::assertArrayHasKey($compressedFileName, $result);
154  self::assertArrayHasKey('compress', $result[$compressedFileName]);
155  self::assertFalse($result[$compressedFileName]['compress']);
156  }
157 
162  {
163  $fileName = 'fooFile.css';
164  $concatenatedFileName = 'merged_' . $fileName;
165  $testFileFixture = [
166  $fileName => [
167  'file' => $fileName,
168  'excludeFromConcatenation' => false,
169  'media' => 'all',
170  ],
171  ];
172  $this->subject->expects(self::once())
173  ->method('createMergedCssFile')
174  ->willReturn($concatenatedFileName);
175 
176  $result = $this->subject->concatenateCssFiles($testFileFixture);
177 
178  self::assertArrayHasKey($concatenatedFileName, $result);
179  self::assertArrayHasKey('excludeFromConcatenation', $result[$concatenatedFileName]);
180  self::assertTrue($result[$concatenatedFileName]['excludeFromConcatenation']);
181  }
182 
186  public function ‪concatenatedCssFilesAreSeparatedByMediaType(): void
187  {
188  $allFileName = 'allFile.css';
189  $screenFileName1 = 'screenFile.css';
190  $screenFileName2 = 'screenFile2.css';
191  $testFileFixture = [
192  $allFileName => [
193  'file' => $allFileName,
194  'excludeFromConcatenation' => false,
195  'media' => 'all',
196  ],
197  // use two screen files to check if they are merged into one, even with a different media type
198  $screenFileName1 => [
199  'file' => $screenFileName1,
200  'excludeFromConcatenation' => false,
201  'media' => 'screen',
202  ],
203  $screenFileName2 => [
204  'file' => $screenFileName2,
205  'excludeFromConcatenation' => false,
206  'media' => 'screen',
207  ],
208  ];
209  $this->subject->expects(self::exactly(2))
210  ->method('createMergedCssFile')
211  ->will(self::onConsecutiveCalls(
212  self::returnValue('merged_' . $allFileName),
213  self::returnValue('merged_' . $screenFileName1)
214  ));
215 
216  $result = $this->subject->concatenateCssFiles($testFileFixture);
217 
218  self::assertEquals([
219  'merged_' . $allFileName,
220  'merged_' . $screenFileName1,
221  ], array_keys($result));
222  self::assertEquals('all', $result['merged_' . $allFileName]['media']);
223  self::assertEquals('screen', $result['merged_' . $screenFileName1]['media']);
224  }
225 
229  public function ‪concatenatedCssFilesObeyForceOnTopOption(): void
230  {
231  $screen1FileName = 'screen1File.css';
232  $screen2FileName = 'screen2File.css';
233  $screen3FileName = 'screen3File.css';
234  $testFileFixture = [
235  $screen1FileName => [
236  'file' => $screen1FileName,
237  'excludeFromConcatenation' => false,
238  'media' => 'screen',
239  ],
240  $screen2FileName => [
241  'file' => $screen2FileName,
242  'excludeFromConcatenation' => false,
243  'media' => 'screen',
244  ],
245  $screen3FileName => [
246  'file' => $screen3FileName,
247  'excludeFromConcatenation' => false,
248  'forceOnTop' => true,
249  'media' => 'screen',
250  ],
251  ];
252  // Replace mocked method getFilenameFromMainDir by passthrough callback
253  $this->subject->method('getFilenameFromMainDir')->willReturnArgument(0);
254  $this->subject->expects(self::once())
255  ->method('createMergedCssFile')
256  ->with(self::equalTo([$screen3FileName, $screen1FileName, $screen2FileName]));
257 
258  $this->subject->concatenateCssFiles($testFileFixture);
259  }
260 
265  {
266  $screen1FileName = 'screen1File.css';
267  $screen2FileName = 'screen2File.css';
268  $screen3FileName = 'screen3File.css';
269  $testFileFixture = [
270  $screen1FileName => [
271  'file' => $screen1FileName,
272  'excludeFromConcatenation' => false,
273  'media' => 'screen',
274  ],
275  $screen2FileName => [
276  'file' => $screen2FileName,
277  'excludeFromConcatenation' => true,
278  'media' => 'screen',
279  ],
280  $screen3FileName => [
281  'file' => $screen3FileName,
282  'excludeFromConcatenation' => false,
283  'media' => 'screen',
284  ],
285  ];
286  $this->subject->method('getFilenameFromMainDir')->willReturnArgument(0);
287  $this->subject->expects(self::once())
288  ->method('createMergedCssFile')
289  ->with(self::equalTo([$screen1FileName, $screen3FileName]))
290  ->willReturn('merged_screen');
291 
292  $result = $this->subject->concatenateCssFiles($testFileFixture);
293  self::assertEquals([
294  $screen2FileName,
295  'merged_screen',
296  ], array_keys($result));
297  self::assertEquals('screen', $result[$screen2FileName]['media']);
298  self::assertEquals('screen', $result['merged_screen']['media']);
299  }
300 
305  {
306  $fileName = 'fooFile.js';
307  $concatenatedFileName = 'merged_' . $fileName;
308  $testFileFixture = [
309  $fileName => [
310  'file' => $fileName,
311  'excludeFromConcatenation' => false,
312  'section' => 'top',
313  ],
314  ];
315  $this->subject->expects(self::once())
316  ->method('createMergedJsFile')
317  ->willReturn($concatenatedFileName);
318 
319  $result = $this->subject->concatenateJsFiles($testFileFixture);
320 
321  self::assertArrayHasKey($concatenatedFileName, $result);
322  self::assertArrayHasKey('excludeFromConcatenation', $result[$concatenatedFileName]);
323  self::assertTrue($result[$concatenatedFileName]['excludeFromConcatenation']);
324  }
325 
329  public function ‪concatenateJsFileAsyncDataProvider(): array
330  {
331  return [
332  'all files have no async' => [
333  [
334  [
335  'file' => 'file1.js',
336  'excludeFromConcatenation' => false,
337  'section' => 'top',
338  ],
339  [
340  'file' => 'file2.js',
341  'excludeFromConcatenation' => false,
342  'section' => 'top',
343  ],
344  ],
345  false,
346  ],
347  'all files have async false' => [
348  [
349  [
350  'file' => 'file1.js',
351  'excludeFromConcatenation' => false,
352  'section' => 'top',
353  'async' => false,
354  ],
355  [
356  'file' => 'file2.js',
357  'excludeFromConcatenation' => false,
358  'section' => 'top',
359  'async' => false,
360  ],
361  ],
362  false,
363  ],
364  'all files have async true' => [
365  [
366  [
367  'file' => 'file1.js',
368  'excludeFromConcatenation' => false,
369  'section' => 'top',
370  'async' => true,
371  ],
372  [
373  'file' => 'file2.js',
374  'excludeFromConcatenation' => false,
375  'section' => 'top',
376  'async' => true,
377  ],
378  ],
379  true,
380  ],
381  'one file async true and one file async false' => [
382  [
383  [
384  'file' => 'file1.js',
385  'excludeFromConcatenation' => false,
386  'section' => 'top',
387  'async' => true,
388  ],
389  [
390  'file' => 'file2.js',
391  'excludeFromConcatenation' => false,
392  'section' => 'top',
393  'async' => false,
394  ],
395  ],
396  false,
397  ],
398  'one file async true and one file async false but is excluded form concatenation' => [
399  [
400  [
401  'file' => 'file1.js',
402  'excludeFromConcatenation' => false,
403  'section' => 'top',
404  'async' => true,
405  ],
406  [
407  'file' => 'file2.js',
408  'excludeFromConcatenation' => true,
409  'section' => 'top',
410  'async' => false,
411  ],
412  ],
413  true,
414  ],
415  'one file async false and one file async true but is excluded form concatenation' => [
416  [
417  [
418  'file' => 'file1.js',
419  'excludeFromConcatenation' => false,
420  'section' => 'top',
421  'async' => false,
422  ],
423  [
424  'file' => 'file2.js',
425  'excludeFromConcatenation' => true,
426  'section' => 'top',
427  'async' => true,
428  ],
429  ],
430  false,
431  ],
432  ];
433  }
434 
441  public function ‪concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync(array $input, bool $expected): void
442  {
443  $concatenatedFileName = 'merged_foo.js';
444  $this->subject->expects(self::once())
445  ->method('createMergedJsFile')
446  ->willReturn($concatenatedFileName);
447 
448  $result = $this->subject->concatenateJsFiles($input);
449 
450  self::assertSame($expected, $result[$concatenatedFileName]['async']);
451  }
452 
456  public function ‪calcStatementsDataProvider(): array
457  {
458  return [
459  'simple calc' => [
460  'calc(100% - 3px)',
461  'calc(100% - 3px)',
462  ],
463  'complex calc with parentheses at the beginning' => [
464  'calc((100%/20) - 2*3px)',
465  'calc((100%/20) - 2*3px)',
466  ],
467  'complex calc with parentheses at the end' => [
468  'calc(100%/20 - 2*3px - (200px + 3%))',
469  'calc(100%/20 - 2*3px - (200px + 3%))',
470  ],
471  'complex calc with many parentheses' => [
472  'calc((100%/20) - (2 * (3px - (200px + 3%))))',
473  'calc((100%/20) - (2 * (3px - (200px + 3%))))',
474  ],
475  ];
476  }
477 
484  public function ‪calcFunctionMustRetainWhitespaces(string $input, string $expected): void
485  {
486  $this->subject->_call('initialize');
487  $result = $this->subject->_call('compressCssString', $input);
488  self::assertSame($expected, trim($result));
489  }
490 
494  public function ‪compressCssFileContentDataProvider(): array
495  {
496  $path = __DIR__ . '/ResourceCompressorTest/Fixtures/';
497  return [
498  // File. Tests:
499  // - Stripped comments and white-space.
500  // - Retain white-space in selectors. (http://drupal.org/node/472820)
501  // - Retain pseudo-selectors. (http://drupal.org/node/460448)
502  0 => [
503  $path . 'css_input_without_import.css',
504  $path . 'css_input_without_import.css.optimized.css',
505  ],
506  // File. Tests:
507  // - Retain comment hacks.
508  2 => [
509  $path . 'comment_hacks.css',
510  $path . 'comment_hacks.css.optimized.css',
511  ], /*
512  // File. Tests:
513  // - Any @charset declaration at the beginning of a file should be
514  // removed without breaking subsequent CSS.*/
515  6 => [
516  $path . 'charset_sameline.css',
517  $path . 'charset.css.optimized.css',
518  ],
519  7 => [
520  $path . 'charset_newline.css',
521  $path . 'charset.css.optimized.css',
522  ],
523  ];
524  }
525 
534  public function ‪compressCssFileContent(string $cssFile, string $expected): void
535  {
536  $cssContent = file_get_contents($cssFile);
537  $this->subject->_call('initialize');
538  $compressedCss = $this->subject->_call('compressCssString', $cssContent);
539  // we have to fix relative paths, if we aren't working on a file in our target directory
540  $relativeFilename = str_replace(‪Environment::getPublicPath() . '/', '', $cssFile);
541  if (!str_contains($relativeFilename, $this->subject->_get('targetDirectory'))) {
542  $compressedCss = $this->subject->_call('cssFixRelativeUrlPaths', $compressedCss, ‪PathUtility::dirname($relativeFilename) . '/');
543  }
544  self::assertStringEqualsFile($expected, $compressedCss, 'Group of file CSS assets optimized correctly.');
545  }
546 
551  {
552  return [
553  // Get filename using EXT:
554  [
555  'EXT:core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
556  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
557  ],
558  // Get filename using relative path
559  [
560  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
561  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
562  ],
563  [
564  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
565  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
566  ],
567  [
568  'typo3temp/assets/compressed/.htaccess',
569  '../typo3temp/assets/compressed/.htaccess',
570  ],
571  // Get filename using absolute path
572  [
573  ‪Environment::getPublicPath() . '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
574  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
575  ],
576  // Get filename using docroot relative path
577  [
578  '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
579  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
580  ],
581  ];
582  }
583 
588  {
589  $subfolderFake = basename(‪Environment::getPublicPath());
590  return [
591  // Get filename using absolute path
592  [
593  ‪Environment::getPublicPath() . '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
594  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
595  ],
596  // Get filename using docroot relative path
597  [
598  '/' . $subfolderFake . '/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
599  'sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
600  ],
601  ];
602  }
603 
608  {
609  return [
610  // Get filename using EXT:
611  [
612  'EXT:core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
613  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
614  ],
615  // Get filename using relative path
616  [
617  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
618  'typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest/Fixtures/Resources/Public/charset.css',
619  ],
620  [
621  'typo3temp/assets/compressed/.htaccess',
622  'typo3temp/assets/compressed/.htaccess',
623  ],
624  ];
625  }
626 
633  public function ‪getFilenamesFromMainDirInFrontendContext(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 .../index.php as entry
637  // script point here to fake the frontend call.
638  $fePath = ‪Environment::getPublicPath();
641  true,
642  false,
647  $fePath . '/index.php',
648  ‪Environment::isWindows() ? 'WINDOWS' : 'UNIX'
649  );
650  ‪$subject = $this->getAccessibleMock(ResourceCompressor::class, ['dummy']);
651  ‪$subject->_call('initialize');
652  ‪$subject->_set('rootPath', $fePath . '/');
653  $relativeToRootPath = ‪$subject->_call('getFilenameFromMainDir', $filename);
654  self::assertSame($expected, $relativeToRootPath);
655  }
656 
660  public function ‪nomoduleJavascriptIsNotConcatenated(): void
661  {
662  $fileName = 'fooFile.js';
663  $concatenatedFileName = 'merged_' . $fileName;
664  $testFileFixture = [
665  $fileName => [
666  'file' => $fileName,
667  'nomodule' => true,
668  'section' => 'top',
669  ],
670  ];
671 
672  $result = $this->subject->concatenateJsFiles($testFileFixture);
673 
674  self::assertArrayNotHasKey($concatenatedFileName, $result);
675  self::assertTrue($result[$fileName]['nomodule']);
676  }
677 
681  public function ‪deferJavascriptIsNotConcatenated(): void
682  {
683  $fileName = 'fooFile.js';
684  $concatenatedFileName = 'merged_' . $fileName;
685  $testFileFixture = [
686  $fileName => [
687  'file' => $fileName,
688  'defer' => true,
689  'section' => 'top',
690  ],
691  ];
692 
693  $result = $this->subject->concatenateJsFiles($testFileFixture);
694 
695  self::assertArrayNotHasKey($concatenatedFileName, $result);
696  self::assertTrue($result[$fileName]['defer']);
697  }
698 }
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\calcFunctionMustRetainWhitespaces
‪calcFunctionMustRetainWhitespaces(string $input, string $expected)
Definition: ResourceCompressorTest.php:483
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$mountDir
‪string $mountDir
Definition: ResourceCompressorTest.php:38
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:27
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$backupEnvironment
‪bool $backupEnvironment
Definition: ResourceCompressorTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\cssFixStatementsDataProvider
‪array cssFixStatementsDataProvider()
Definition: ResourceCompressorTest.php:55
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFilesObeyExcludeFromConcatenation
‪concatenatedCssFilesObeyExcludeFromConcatenation()
Definition: ResourceCompressorTest.php:263
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static string getPublicPath()
Definition: Environment.php:204
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInFrontendContextDataProvider
‪array getFilenamesFromMainDirInFrontendContextDataProvider()
Definition: ResourceCompressorTest.php:606
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFilesAreSeparatedByMediaType
‪concatenatedCssFilesAreSeparatedByMediaType()
Definition: ResourceCompressorTest.php:185
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\calcStatementsDataProvider
‪array calcStatementsDataProvider()
Definition: ResourceCompressorTest.php:455
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\nomoduleJavascriptIsNotConcatenated
‪nomoduleJavascriptIsNotConcatenated()
Definition: ResourceCompressorTest.php:659
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest
Definition: ResourceCompressorTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Resource
Definition: AbstractFileTest.php:18
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static bool isWindows()
Definition: Environment.php:321
‪TYPO3\CMS\Core\Resource\ResourceCompressor
Definition: ResourceCompressor.php:30
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$vfsContents
‪array $vfsContents
Definition: ResourceCompressorTest.php:39
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$basedir
‪string $basedir
Definition: ResourceCompressorTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInBackendContextDataProvider
‪array getFilenamesFromMainDirInBackendContextDataProvider()
Definition: ResourceCompressorTest.php:549
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenateJsFileAsyncDataProvider
‪array concatenateJsFileAsyncDataProvider()
Definition: ResourceCompressorTest.php:328
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressCssFileContentDataProvider
‪array compressCssFileContentDataProvider()
Definition: ResourceCompressorTest.php:493
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static ApplicationContext getContext()
Definition: Environment.php:139
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\$subject
‪ResourceCompressor MockObject AccessibleObjectInterface $subject
Definition: ResourceCompressorTest.php:35
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync
‪concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync(array $input, bool $expected)
Definition: ResourceCompressorTest.php:440
‪TYPO3\CMS\Core\Core\Environment\getProjectPath
‪static string getProjectPath()
Definition: Environment.php:175
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenateJsFileIsFlaggedToNotConcatenateAgain
‪concatenateJsFileIsFlaggedToNotConcatenateAgain()
Definition: ResourceCompressorTest.php:303
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\deferJavascriptIsNotConcatenated
‪deferJavascriptIsNotConcatenated()
Definition: ResourceCompressorTest.php:680
‪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:109
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInBackendContextInSubfolderDataProvider
‪array getFilenamesFromMainDirInBackendContextInSubfolderDataProvider()
Definition: ResourceCompressorTest.php:586
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressCssFileContent
‪compressCssFileContent(string $cssFile, string $expected)
Definition: ResourceCompressorTest.php:533
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressedCssFileIsFlaggedToNotCompressAgain
‪compressedCssFileIsFlaggedToNotCompressAgain()
Definition: ResourceCompressorTest.php:110
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\getFilenamesFromMainDirInFrontendContext
‪getFilenamesFromMainDirInFrontendContext(string $filename, string $expected)
Definition: ResourceCompressorTest.php:632
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\setUp
‪setUp()
Definition: ResourceCompressorTest.php:41
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\compressedJsFileIsFlaggedToNotCompressAgain
‪compressedJsFileIsFlaggedToNotCompressAgain()
Definition: ResourceCompressorTest.php:135
‪TYPO3\CMS\Core\Core\Environment\getConfigPath
‪static string getConfigPath()
Definition: Environment.php:233
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFileIsFlaggedToNotConcatenateAgain
‪concatenatedCssFileIsFlaggedToNotConcatenateAgain()
Definition: ResourceCompressorTest.php:160
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Utility\PathUtility\dirname
‪static string dirname(string $path)
Definition: PathUtility.php:255
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\cssFixStatementsMovesStatementsToTopIfNeeded
‪cssFixStatementsMovesStatementsToTopIfNeeded(string $input, string $expected)
Definition: ResourceCompressorTest.php:99
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:29
‪TYPO3\CMS\Core\Tests\Unit\Resource\ResourceCompressorTest\concatenatedCssFilesObeyForceOnTopOption
‪concatenatedCssFilesObeyForceOnTopOption()
Definition: ResourceCompressorTest.php:228
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static string getVarPath()
Definition: Environment.php:216