‪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 PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
26 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
27 
28 final class ‪ResourceCompressorTest extends FunctionalTestCase
29 {
30  protected bool ‪$initializeDatabase = false;
31 
32  public function ‪tearDown(): void
33  {
34  ‪GeneralUtility::rmdir($this->instancePath . '/typo3temp/assets/compressed/', true);
35  parent::tearDown();
36  }
37 
38  #[Test]
39  public function ‪initializeCreatesTargetDirectory(): void
40  {
41  $subject = $this->getAccessibleMock(ResourceCompressor::class, null);
42  $subject->_call('initialize');
43  self::assertFileExists($this->instancePath . '/typo3temp/assets/compressed');
44  }
45 
46  #[Test]
47  public function ‪initializeCreatesHtaccessFileIfSet(): void
48  {
49  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['generateApacheHtaccess'] = true;
50  $subject = $this->getAccessibleMock(ResourceCompressor::class, null);
51  $subject->_call('initialize');
52  $htaccessPath = $this->instancePath . '/typo3temp/assets/compressed/.htaccess';
53  self::assertStringEqualsFile($htaccessPath, $subject->_get('htaccessTemplate'));
54  }
55 
56  #[Test]
58  {
59  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['generateApacheHtaccess'] = false;
60  $subject = $this->getAccessibleMock(ResourceCompressor::class, null);
61  $subject->_call('initialize');
62  $htaccessPath = $this->instancePath . '/typo3temp/assets/compressed/.htaccess';
63  self::assertFileDoesNotExist($htaccessPath);
64  }
65 
66  #[Test]
67  public function ‪concatenateCssFiles(): void
68  {
69  $files = [
70  'sampleFile1' => [
71  'excludeFromConcatenation' => false,
72  'file' => 'typo3/sysext/core/Tests/Functional/Resource/Fixtures/ResourceCompressor/css_input_with_import.css',
73  'media' => 'screen',
74  'forceOnTop' => false,
75  ],
76  ];
77  $subject = new ‪ResourceCompressor();
78  $concatFiles = $subject->concatenateCssFiles($files);
79  $mergedFile = array_pop($concatFiles);
80  self::assertStringEqualsFile(
81  __DIR__ . '/Fixtures/ResourceCompressor/css_input_with_import.expected.css',
82  file_get_contents(‪Environment::getPublicPath() . '/' . $mergedFile['file']) . chr(10)
83  );
84  }
85 
86  public static function ‪compressCssFileContentDataProvider(): array
87  {
88  return [
89  // File. Tests:
90  // - Stripped comments and white-space.
91  // - Retain white-space in selectors. (http://drupal.org/node/472820)
92  // - Retain pseudo-selectors. (http://drupal.org/node/460448)
93  0 => [
94  __DIR__ . '/Fixtures/ResourceCompressor/css_input_without_import.css',
95  __DIR__ . '/Fixtures/ResourceCompressor/css_input_without_import.css.optimized.css',
96  ],
97  // File. Tests:
98  // - Retain comment hacks.
99  2 => [
100  __DIR__ . '/Fixtures/ResourceCompressor/comment_hacks.css',
101  __DIR__ . '/Fixtures/ResourceCompressor/comment_hacks.css.optimized.css',
102  ], /*
103  // File. Tests:
104  // - Any @charset declaration at the beginning of a file should be
105  // removed without breaking subsequent CSS.*/
106  6 => [
107  __DIR__ . '/Fixtures/ResourceCompressor/charset_sameline.css',
108  __DIR__ . '/Fixtures/ResourceCompressor/charset.css.optimized.css',
109  ],
110  7 => [
111  __DIR__ . '/Fixtures/ResourceCompressor/charset_newline.css',
112  __DIR__ . '/Fixtures/ResourceCompressor/charset.css.optimized.css',
113  ],
114  ];
115  }
116 
120  #[DataProvider('compressCssFileContentDataProvider')]
121  #[Test]
122  public function ‪compressCssFileContent(string $cssFile, string $expected): void
123  {
124  $cssContent = file_get_contents($cssFile);
125  $subject = $this->getAccessibleMock(ResourceCompressor::class, ['compressCssFile', 'compressJsFile', 'createMergedCssFile', 'createMergedJsFile', 'getFilenameFromMainDir', 'checkBaseDirectory']);
126  $subject->_call('initialize');
127  $compressedCss = $subject->_call('compressCssString', $cssContent);
128  // we have to fix relative paths, if we aren't working on a file in our target directory
129  $relativeFilename = str_replace(‪Environment::getPublicPath() . '/', '', $cssFile);
130  $compressedCss = $subject->_call('cssFixRelativeUrlPaths', $compressedCss, ‪PathUtility::dirname($relativeFilename) . '/');
131  self::assertStringEqualsFile($expected, $compressedCss);
132  }
133 
135  {
136  return [
137  // Get filename using EXT:
138  [
139  'EXT:core/Tests/Functional/Resource/Fixtures/ResourceCompressor/Resources/Public/charset.css',
140  'typo3/sysext/core/Tests/Functional/Resource/Fixtures/ResourceCompressor/Resources/Public/charset.css',
141  ],
142  // Get filename using relative path
143  [
144  'typo3/sysext/core/Tests/Functional/Resource/Fixtures/ResourceCompressor/Resources/Public/charset.css',
145  'typo3/sysext/core/Tests/Functional/Resource/Fixtures/ResourceCompressor/Resources/Public/charset.css',
146  ],
147  [
148  'typo3temp/assets/compressed/.htaccess',
149  'typo3temp/assets/compressed/.htaccess',
150  ],
151  ];
152  }
153 
154  #[DataProvider('getFilenamesFromMainDirInFrontendContextDataProvider')]
155  #[Test]
156  public function ‪getFilenamesFromMainDirInFrontendContext(string $filename, string $expected): void
157  {
158  // getCurrentScript() called by PathUtility::getRelativePathTo() is usually something
159  // like '.../bin/phpunit' in testing context, but we want .../index.php as entry
160  // script point here to fake the frontend call.
161  $fePath = ‪Environment::getPublicPath();
164  true,
165  false,
170  $fePath . '/index.php',
171  ‪Environment::isWindows() ? 'WINDOWS' : 'UNIX'
172  );
173  $subject = $this->getAccessibleMock(ResourceCompressor::class, null);
174  $subject->_call('initialize');
175  $subject->_set('rootPath', $fePath . '/');
176  $relativeToRootPath = $subject->_call('getFilenameFromMainDir', $filename);
177  self::assertSame($expected, $relativeToRootPath);
178  }
179 }
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\getFilenamesFromMainDirInFrontendContext
‪getFilenamesFromMainDirInFrontendContext(string $filename, string $expected)
Definition: ResourceCompressorTest.php:156
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:27
‪TYPO3\CMS\Core\Tests\Functional\Resource
Definition: DefaultUploadFolderResolverTest.php:18
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static getPublicPath()
Definition: Environment.php:187
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\tearDown
‪tearDown()
Definition: ResourceCompressorTest.php:32
‪TYPO3\CMS\Core\Resource\ResourceCompressor
Definition: ResourceCompressor.php:31
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\getFilenamesFromMainDirInFrontendContextDataProvider
‪static getFilenamesFromMainDirInFrontendContextDataProvider()
Definition: ResourceCompressorTest.php:134
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\initializeDoesNotCreateHtaccessFileIfSetToFalse
‪initializeDoesNotCreateHtaccessFileIfSetToFalse()
Definition: ResourceCompressorTest.php:57
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Core\Environment\getConfigPath
‪static getConfigPath()
Definition: Environment.php:212
‪TYPO3\CMS\Core\Utility\PathUtility\dirname
‪static dirname(string $path)
Definition: PathUtility.php:243
‪TYPO3\CMS\Core\Core\Environment\getProjectPath
‪static string getProjectPath()
Definition: Environment.php:160
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\initializeCreatesHtaccessFileIfSet
‪initializeCreatesHtaccessFileIfSet()
Definition: ResourceCompressorTest.php:47
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\compressCssFileContentDataProvider
‪static compressCssFileContentDataProvider()
Definition: ResourceCompressorTest.php:86
‪TYPO3\CMS\Core\Utility\GeneralUtility\rmdir
‪static bool rmdir(string $path, bool $removeNonEmpty=false)
Definition: GeneralUtility.php:1702
‪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:100
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\$initializeDatabase
‪bool $initializeDatabase
Definition: ResourceCompressorTest.php:30
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest
Definition: ResourceCompressorTest.php:29
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\concatenateCssFiles
‪concatenateCssFiles()
Definition: ResourceCompressorTest.php:67
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\initializeCreatesTargetDirectory
‪initializeCreatesTargetDirectory()
Definition: ResourceCompressorTest.php:39
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static getContext()
Definition: Environment.php:128
‪TYPO3\CMS\Core\Tests\Functional\Resource\ResourceCompressorTest\compressCssFileContent
‪compressCssFileContent(string $cssFile, string $expected)
Definition: ResourceCompressorTest.php:122
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static isWindows()
Definition: Environment.php:276