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