‪TYPO3CMS  ‪main
ImportMapTest.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\CMS\Core\Package\PackageManager;
27 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
28 
29 final class ‪ImportMapTest extends UnitTestCase
30 {
31  protected array ‪$packages = [];
32 
33  protected bool ‪$backupEnvironment = true;
34 
35  protected ?PackageManager ‪$backupPackageManager = null;
36 
37  protected function ‪setUp(): void
38  {
39  parent::setUp();
40 
46  __DIR__,
50  ‪Environment::isWindows() ? 'WINDOWS' : 'UNIX'
51  );
52  $this->backupPackageManager = \Closure::bind(fn (): PackageManager => ‪ExtensionManagementUtility::$packageManager, null, ExtensionManagementUtility::class)();
54  }
55 
56  protected function ‪tearDown(): void
57  {
58  ‪ExtensionManagementUtility::setPackageManager($this->backupPackageManager);
59  $this->backupPackageManager = null;
60  $this->packages = [];
61  parent::tearDown();
62  }
63 
67  public function ‪emptyOutputIfNoModuleIsLoaded(): void
68  {
69  $this->packages = ['core'];
70 
71  $importMap = new ‪ImportMap($this->‪getPackages());
72  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
73 
74  self::assertSame('', ‪$output);
75  }
76 
80  public function ‪emptyOutputIfNoModuleIsDefined(): void
81  {
82  $this->packages = ['package1'];
83 
84  $importMap = new ‪ImportMap($this->‪getPackages());
85  ‪$url = $importMap->resolveImport('lit');
86  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
87 
88  self::assertSame('', ‪$output);
89  self::assertNull(‪$url);
90  }
91 
95  public function ‪resolveImport(): void
96  {
97  $this->packages = ['core'];
98 
99  $importMap = new ‪ImportMap($this->‪getPackages());
100  ‪$url = $importMap->resolveImport('lit');
101 
102  self::assertStringStartsWith('Fixtures/ImportMap/core/Resources/Public/JavaScript/Contrib/lit/index.js?bust=', ‪$url);
103  }
104 
109  {
110  $this->packages = ['core'];
111 
112  $importMap = new ‪ImportMap($this->‪getPackages());
113  ‪$url = $importMap->resolveImport('lit');
114  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
115 
116  self::assertStringStartsWith('Fixtures/ImportMap/core/Resources/Public/JavaScript/Contrib/lit/index.js?bust=', ‪$url);
117  self::assertStringContainsString('"lit/":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/Contrib/lit/"', ‪$output);
118  self::assertStringContainsString('"@typo3/core/Module1.js":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/Module1.js?bust=', ‪$output);
119  ‪ExtensionManagementUtility::setPackageManager($this->createMock(PackageManager::class));
120  }
121 
125  public function ‪renderIncludedImportConfiguration(): void
126  {
127  $this->packages = ['core'];
128 
129  $importMap = new ‪ImportMap($this->‪getPackages());
130  $importMap->includeImportsFor('@typo3/core/Module1.js');
131  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
132 
133  self::assertStringContainsString('"@typo3/core/":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/', ‪$output);
134  self::assertStringContainsString('"@typo3/core/Module1.js":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/Module1.js?bust=', ‪$output);
135  }
136 
140  public function ‪composesTwoImportMaps(): void
141  {
142  $this->packages = ['core', 'package2'];
143 
144  $importMap = new ‪ImportMap($this->‪getPackages());
145  $importMap->includeImportsFor('@typo3/core/Module1.js');
146  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
147 
148  self::assertStringContainsString('"@typo3/core/":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/', ‪$output);
149  self::assertStringContainsString('"@typo3/core/Module1.js":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/Module1.js?bust=', ‪$output);
150  ‪ExtensionManagementUtility::setPackageManager($this->createMock(PackageManager::class));
151  }
152 
156  public function ‪handlesImportMapOverwrites(): void
157  {
158  $this->packages = ['package2', 'package3'];
159 
160  $importMap = new ‪ImportMap($this->‪getPackages());
161  $importMap->includeImportsFor('@typo3/package2/File.js');
162  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
163 
164  self::assertStringContainsString('"@typo3/package2/File.js":"/Fixtures/ImportMap/package3/Resources/Public/JavaScript/Overrides/Package2/File.js?bust=', ‪$output);
165  self::assertThat(
166  ‪$output,
167  self::logicalNot(
168  self::stringContains('"@typo3/package2/File.js":"/Fixtures/ImportMap/package2/')
169  )
170  );
171  }
172 
176  public function ‪dependenciesAreLoaded(): void
177  {
178  $this->packages = ['core', 'package2'];
179  $importMap = new ‪ImportMap($this->‪getPackages());
180  $importMap->includeImportsFor('@typo3/package2/file.js');
181  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
182 
183  self::assertStringContainsString('@typo3/core/', ‪$output);
184  }
185 
189  public function ‪unusedConfigurationsAreOmitted(): void
190  {
191  $this->packages = ['core', 'package2', 'package4'];
192  $importMap = new ‪ImportMap($this->‪getPackages());
193  $importMap->includeImportsFor('@typo3/package2/file.js');
194  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
195 
196  self::assertThat(
197  ‪$output,
198  self::logicalNot(
199  self::stringContains('@acme/package4/Backend/Helper.js')
200  )
201  );
202  }
203 
207  public function ‪includeAllImportsIsRespected(): void
208  {
209  $this->packages = ['core', 'package2', 'package4'];
210  $importMap = new ‪ImportMap($this->‪getPackages());
211  $importMap->includeAllImports();
212  $importMap->includeImportsFor('@typo3/package2/file.js');
213  ‪$output = $importMap->render('/', new ‪ConsumableString('rAnd0m'));
214 
215  self::assertStringContainsString('@typo3/core/', ‪$output);
216  self::assertStringContainsString('@acme/package4/Backend/Helper.js', ‪$output);
217  }
218 
219  protected function ‪getPackages(): array
220  {
221  $packageInstances = [];
222  foreach ($this->packages as $key) {
223  $packageMock = $this->createMock(PackageInterface::class);
224  $packageMock->method('getPackagePath')->willReturn(__DIR__ . '/Fixtures/ImportMap/' . $key . '/');
225  $packageMock->method('getPackageKey')->willReturn($key);
226  $packageMetadataMock = $this->createMock(MetaData::class);
227  $packageMetadataMock->method('getVersion')->willReturn('1.0.0');
228  $packageMock->method('getPackageMetadata')->willReturn($packageMetadataMock);
229  $packageInstances[$key] = $packageMock;
230  }
231 
232  return $packageInstances;
233  }
234 
235  protected function ‪mockPackageManager(): PackageManager
236  {
237  $test = $this;
238  $packageManagerMock = $this->createMock(PackageManager::class);
239  $packageManagerMock->method('resolvePackagePath')->willReturnCallback(
240  fn (string $path): string => str_replace(
241  array_map(fn (‪PackageInterface $package): string => 'EXT:' . $package->‪getPackageKey() . '/', $test->getPackages()),
242  array_map(fn (‪PackageInterface $package): string => $package->‪getPackagePath(), $test->getPackages()),
243  $path
244  )
245  );
246  return $packageManagerMock;
247  }
248 }
‪TYPO3\CMS\Core\Package\PackageInterface\getPackageKey
‪string getPackageKey()
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\emptyOutputIfNoModuleIsDefined
‪emptyOutputIfNoModuleIsDefined()
Definition: ImportMapTest.php:80
‪TYPO3\CMS\Core\Tests\Unit\Page
Definition: AssetCollectorTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\mockPackageManager
‪mockPackageManager()
Definition: ImportMapTest.php:235
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static isComposerMode()
Definition: Environment.php:137
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\emptyOutputIfNoModuleIsLoaded
‪emptyOutputIfNoModuleIsLoaded()
Definition: ImportMapTest.php:67
‪TYPO3\CMS\Core\Package\PackageInterface\getPackagePath
‪string getPackagePath()
‪TYPO3\CMS\Core\Page\ImportMap
Definition: ImportMap.php:34
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\includeAllImportsIsRespected
‪includeAllImportsIsRespected()
Definition: ImportMapTest.php:207
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\composesTwoImportMaps
‪composesTwoImportMaps()
Definition: ImportMapTest.php:140
‪TYPO3\CMS\Core\Core\Environment\getCurrentScript
‪static getCurrentScript()
Definition: Environment.php:220
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\setUp
‪setUp()
Definition: ImportMapTest.php:37
‪TYPO3\CMS\Core\Package\PackageInterface
Definition: PackageInterface.php:22
‪TYPO3\CMS\Core\Core\Environment\getConfigPath
‪static getConfigPath()
Definition: Environment.php:212
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\$backupEnvironment
‪bool $backupEnvironment
Definition: ImportMapTest.php:33
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:40
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\$backupPackageManager
‪PackageManager $backupPackageManager
Definition: ImportMapTest.php:35
‪TYPO3\CMS\Core\Core\Environment\getProjectPath
‪static string getProjectPath()
Definition: Environment.php:160
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\setPackageManager
‪static setPackageManager(PackageManager $packageManager)
Definition: ExtensionManagementUtility.php:61
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest
Definition: ImportMapTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\resolveAndImplicitlyIncludeModuleConfiguration
‪resolveAndImplicitlyIncludeModuleConfiguration()
Definition: ImportMapTest.php:108
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\renderIncludedImportConfiguration
‪renderIncludedImportConfiguration()
Definition: ImportMapTest.php:125
‪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\Package\MetaData
Definition: PackageConstraint.php:16
‪TYPO3\CMS\Core\Core\Environment\isCli
‪static isCli()
Definition: Environment.php:145
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\unusedConfigurationsAreOmitted
‪unusedConfigurationsAreOmitted()
Definition: ImportMapTest.php:189
‪TYPO3\CMS\Core\Domain\ConsumableString
Definition: ConsumableString.php:26
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\$packageManager
‪static PackageManager $packageManager
Definition: ExtensionManagementUtility.php:51
‪$output
‪$output
Definition: annotationChecker.php:119
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\dependenciesAreLoaded
‪dependenciesAreLoaded()
Definition: ImportMapTest.php:176
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\$packages
‪array $packages
Definition: ImportMapTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\getPackages
‪getPackages()
Definition: ImportMapTest.php:219
‪TYPO3\CMS\Webhooks\Message\$url
‪identifier readonly UriInterface $url
Definition: LoginErrorOccurredMessage.php:36
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\tearDown
‪tearDown()
Definition: ImportMapTest.php:56
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\handlesImportMapOverwrites
‪handlesImportMapOverwrites()
Definition: ImportMapTest.php:156
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static getContext()
Definition: Environment.php:128
‪TYPO3\CMS\Core\Tests\Unit\Page\ImportMapTest\resolveImport
‪resolveImport()
Definition: ImportMapTest.php:95
‪TYPO3\CMS\Core\Core\Environment\isWindows
‪static isWindows()
Definition: Environment.php:276