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