Skip to content

Commit f26669d

Browse files
committed
Adding missing test
1 parent 43ba9f0 commit f26669d

File tree

2 files changed

+168
-4
lines changed

2 files changed

+168
-4
lines changed

src/Symfony/Component/AssetMapper/Tests/ImportMap/ImportMapManagerTest.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -937,10 +937,6 @@ private function createImportMapManager(): ImportMapManager
937937
$this->configReader = $this->createMock(ImportMapConfigReader::class);
938938
$this->packageResolver = $this->createMock(PackageResolverInterface::class);
939939
$this->remotePackageDownloader = $this->createMock(RemotePackageDownloader::class);
940-
$this->remotePackageDownloader->expects($this->any())
941-
->method('getVendorDir')
942-
->willReturn(self::$writableRoot.'/assets/vendor')
943-
;
944940

945941
return $this->importMapManager = new ImportMapManager(
946942
$this->assetMapper,
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
<?php
2+
3+
namespace Symfony\Component\AssetMapper\Tests\ImportMap;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Symfony\Component\AssetMapper\ImportMap\ImportMapConfigReader;
7+
use Symfony\Component\AssetMapper\ImportMap\ImportMapEntries;
8+
use Symfony\Component\AssetMapper\ImportMap\ImportMapEntry;
9+
use Symfony\Component\AssetMapper\ImportMap\ImportMapType;
10+
use Symfony\Component\AssetMapper\ImportMap\RemotePackageDownloader;
11+
use Symfony\Component\AssetMapper\ImportMap\Resolver\PackageResolverInterface;
12+
use Symfony\Component\Filesystem\Filesystem;
13+
14+
class RemotePackageDownloaderTest extends TestCase
15+
{
16+
private Filesystem $filesystem;
17+
private static string $writableRoot = __DIR__.'/../fixtures/importmaps_for_writing';
18+
19+
protected function setUp(): void
20+
{
21+
$this->filesystem = new Filesystem();
22+
if (!file_exists(__DIR__.'/../fixtures/importmaps_for_writing')) {
23+
$this->filesystem->mkdir(self::$writableRoot);
24+
}
25+
}
26+
27+
protected function tearDown(): void
28+
{
29+
$this->filesystem->remove(self::$writableRoot);
30+
}
31+
32+
public function testDownloadPackagesDownloadsEverythingWithNoInstalled()
33+
{
34+
$configReader = $this->createMock(ImportMapConfigReader::class);
35+
$packageResolver = $this->createMock(PackageResolverInterface::class);
36+
37+
$entry1 = new ImportMapEntry('foo', version: '1.0.0');
38+
$entry2 = new ImportMapEntry('bar.js/file', version: '1.0.0');
39+
$entry3 = new ImportMapEntry('baz', version: '1.0.0', type: ImportMapType::CSS);
40+
$importMapEntries = new ImportMapEntries([$entry1, $entry2, $entry3]);
41+
42+
$configReader->expects($this->once())
43+
->method('getEntries')
44+
->willReturn($importMapEntries);
45+
46+
$progressCallback = fn() => null;
47+
$packageResolver->expects($this->once())
48+
->method('downloadPackages')
49+
->with(
50+
['foo' => $entry1, 'bar.js/file' => $entry2, 'baz' => $entry3],
51+
$progressCallback
52+
)
53+
->willReturn(['foo' => 'foo content', 'bar.js/file' => 'bar content', 'baz' => 'baz content']);
54+
55+
$downloader = new RemotePackageDownloader(
56+
$configReader,
57+
$packageResolver,
58+
self::$writableRoot.'/assets/vendor',
59+
);
60+
$downloader->downloadPackages($progressCallback);
61+
62+
$this->assertFileExists(self::$writableRoot.'/assets/vendor/foo.js');
63+
$this->assertFileExists(self::$writableRoot.'/assets/vendor/bar.js/file.js');
64+
$this->assertFileExists(self::$writableRoot.'/assets/vendor/baz.css');
65+
$this->assertEquals('foo content', file_get_contents(self::$writableRoot.'/assets/vendor/foo.js'));
66+
$this->assertEquals('bar content', file_get_contents(self::$writableRoot.'/assets/vendor/bar.js/file.js'));
67+
$this->assertEquals('baz content', file_get_contents(self::$writableRoot.'/assets/vendor/baz.css'));
68+
69+
$installed = require self::$writableRoot.'/assets/vendor/installed.php';
70+
$this->assertEquals(
71+
[
72+
'foo' => ['path' => 'foo.js', 'version' => '1.0.0'],
73+
'bar.js/file' => ['path' => 'bar.js/file.js', 'version' => '1.0.0'],
74+
'baz' => ['path' => 'baz.css', 'version' => '1.0.0'],
75+
],
76+
$installed
77+
);
78+
}
79+
80+
public function testPackagesWithCorrectInstalledVersionSkipped()
81+
{
82+
$this->filesystem->mkdir(self::$writableRoot.'/assets/vendor');
83+
$installed = [
84+
'foo' => ['path' => 'foo.js', 'version' => '1.0.0'],
85+
'bar.js/file' => ['path' => 'bar.js/file.js', 'version' => '1.0.0'],
86+
'baz' => ['path' => 'baz.css', 'version' => '1.0.0'],
87+
];
88+
file_put_contents(
89+
self::$writableRoot.'/assets/vendor/installed.php',
90+
'<?php return '.var_export($installed, true).';'
91+
);
92+
93+
$configReader = $this->createMock(ImportMapConfigReader::class);
94+
$packageResolver = $this->createMock(PackageResolverInterface::class);
95+
96+
// matches installed version and file exists
97+
$entry1 = new ImportMapEntry('foo', version: '1.0.0');
98+
file_put_contents(self::$writableRoot.'/assets/vendor/foo.js', 'original foo content');
99+
// matches installed version but file does not exist
100+
$entry2 = new ImportMapEntry('bar.js/file', version: '1.0.0');
101+
// does not match installed version
102+
$entry3 = new ImportMapEntry('baz', version: '1.1.0', type: ImportMapType::CSS);
103+
file_put_contents(self::$writableRoot.'/assets/vendor/baz.css', 'original baz content');
104+
$importMapEntries = new ImportMapEntries([$entry1, $entry2, $entry3]);
105+
106+
$configReader->expects($this->once())
107+
->method('getEntries')
108+
->willReturn($importMapEntries);
109+
110+
$packageResolver->expects($this->once())
111+
->method('downloadPackages')
112+
->willReturn(['bar.js/file' => 'new bar content', 'baz' => 'new baz content']);
113+
114+
$downloader = new RemotePackageDownloader(
115+
$configReader,
116+
$packageResolver,
117+
self::$writableRoot.'/assets/vendor',
118+
);
119+
$downloader->downloadPackages();
120+
121+
$this->assertFileExists(self::$writableRoot.'/assets/vendor/foo.js');
122+
$this->assertFileExists(self::$writableRoot.'/assets/vendor/bar.js/file.js');
123+
$this->assertFileExists(self::$writableRoot.'/assets/vendor/baz.css');
124+
$this->assertEquals('original foo content', file_get_contents(self::$writableRoot.'/assets/vendor/foo.js'));
125+
$this->assertEquals('new bar content', file_get_contents(self::$writableRoot.'/assets/vendor/bar.js/file.js'));
126+
$this->assertEquals('new baz content', file_get_contents(self::$writableRoot.'/assets/vendor/baz.css'));
127+
128+
$installed = require self::$writableRoot.'/assets/vendor/installed.php';
129+
$this->assertEquals(
130+
[
131+
'foo' => ['path' => 'foo.js', 'version' => '1.0.0'],
132+
'bar.js/file' => ['path' => 'bar.js/file.js', 'version' => '1.0.0'],
133+
'baz' => ['path' => 'baz.css', 'version' => '1.1.0'],
134+
],
135+
$installed
136+
);
137+
}
138+
139+
public function testGetDownloadedPath()
140+
{
141+
$this->filesystem->mkdir(self::$writableRoot.'/assets/vendor');
142+
$installed = [
143+
'foo' => ['path' => 'foo-path.js', 'version' => '1.0.0'],
144+
];
145+
file_put_contents(
146+
self::$writableRoot.'/assets/vendor/installed.php',
147+
'<?php return '.var_export($installed, true).';'
148+
);
149+
file_put_contents(self::$writableRoot.'/assets/vendor/foo-path.js', 'foo content');
150+
151+
$downloader = new RemotePackageDownloader(
152+
$this->createMock(ImportMapConfigReader::class),
153+
$this->createMock(PackageResolverInterface::class),
154+
self::$writableRoot.'/assets/vendor',
155+
);
156+
$this->assertSame(realpath(self::$writableRoot.'/assets/vendor/foo-path.js'), realpath($downloader->getDownloadedPath('foo')));
157+
}
158+
159+
public function testGetVendorDir()
160+
{
161+
$downloader = new RemotePackageDownloader(
162+
$this->createMock(ImportMapConfigReader::class),
163+
$this->createMock(PackageResolverInterface::class),
164+
self::$writableRoot.'/assets/vendor',
165+
);
166+
$this->assertSame(realpath(self::$writableRoot.'/assets/vendor'), realpath($downloader->getVendorDir()));
167+
}
168+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy