Skip to content

Commit c622faf

Browse files
committed
Add unit tests for PackageProviderManager
1 parent 2b53bd4 commit c622faf

1 file changed

Lines changed: 151 additions & 0 deletions

File tree

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Tests\UnitTests\Package;
4+
5+
use CodedMonkey\Dirigent\Package\PackageProviderManager;
6+
use CodedMonkey\Dirigent\Tests\Helper\MockEntityFactoryTrait;
7+
use Composer\MetadataMinifier\MetadataMinifier;
8+
use PHPUnit\Framework\Attributes\CoversClass;
9+
use PHPUnit\Framework\TestCase;
10+
use Symfony\Component\Filesystem\Filesystem;
11+
12+
#[CoversClass(PackageProviderManager::class)]
13+
class PackageProviderManagerTest extends TestCase
14+
{
15+
use MockEntityFactoryTrait;
16+
17+
private string $storagePath;
18+
private PackageProviderManager $manager;
19+
20+
#[\Override]
21+
protected function setUp(): void
22+
{
23+
$this->storagePath = sys_get_temp_dir() . '/dirigent-provider-manager-' . uniqid();
24+
$this->manager = new PackageProviderManager($this->storagePath);
25+
}
26+
27+
#[\Override]
28+
protected function tearDown(): void
29+
{
30+
(new Filesystem())->remove($this->storagePath);
31+
}
32+
33+
public function testPath(): void
34+
{
35+
self::assertSame(
36+
"{$this->storagePath}/provider/foo/bar.json",
37+
$this->manager->path('foo/bar'),
38+
);
39+
}
40+
41+
public function testExistsReturnsTrueAfterDump(): void
42+
{
43+
$package = $this->createMockPackage();
44+
$version = $this->createMockVersion($package);
45+
$version->setCurrentMetadata($this->createMockMetadata($version));
46+
47+
$this->manager->dump($package);
48+
49+
self::assertTrue($this->manager->exists($package->getName()));
50+
}
51+
52+
public function testExistsReturnsFalseWhenFileIsMissing(): void
53+
{
54+
self::assertFalse($this->manager->exists('foo/bar'));
55+
}
56+
57+
public function testDumpWritesReleaseAndDevelopmentProviderFiles(): void
58+
{
59+
$package = $this->createMockPackage();
60+
61+
$releaseVersion = $this->createMockVersion($package, '1.0.0');
62+
$releaseVersion->setCurrentMetadata($this->createMockMetadata($releaseVersion));
63+
64+
$devVersion = $this->createMockVersion($package, 'dev-main', development: true);
65+
$devVersion->setCurrentMetadata($this->createMockMetadata($devVersion));
66+
67+
$this->manager->dump($package);
68+
69+
$packageName = $package->getName();
70+
$releasePath = "{$this->storagePath}/provider/{$packageName}.json";
71+
$devPath = "{$this->storagePath}/provider/{$packageName}~dev.json";
72+
73+
self::assertFileExists($releasePath);
74+
self::assertFileExists($devPath);
75+
76+
$releaseData = json_decode(file_get_contents($releasePath), true);
77+
self::assertSame('composer/2.0', $releaseData['minified']);
78+
self::assertArrayHasKey($packageName, $releaseData['packages']);
79+
$releasePackages = MetadataMinifier::expand($releaseData['packages'][$packageName]);
80+
self::assertCount(1, $releasePackages);
81+
self::assertSame('1.0.0', $releasePackages[0]['version']);
82+
83+
$devData = json_decode(file_get_contents($devPath), true);
84+
self::assertSame('composer/2.0', $devData['minified']);
85+
self::assertArrayHasKey($packageName, $devData['packages']);
86+
$devPackages = MetadataMinifier::expand($devData['packages'][$packageName]);
87+
self::assertCount(1, $devPackages);
88+
self::assertSame('dev-main', $devPackages[0]['version']);
89+
}
90+
91+
public function testDumpSortsVersionsFromNewestToOldest(): void
92+
{
93+
$package = $this->createMockPackage();
94+
95+
foreach (['1.0.0', '2.0.0', '1.5.0'] as $versionName) {
96+
$version = $this->createMockVersion($package, $versionName);
97+
$version->setCurrentMetadata($this->createMockMetadata($version));
98+
}
99+
100+
$this->manager->dump($package);
101+
102+
$data = json_decode(file_get_contents($this->manager->path($package->getName())), true);
103+
$packages = MetadataMinifier::expand($data['packages'][$package->getName()]);
104+
105+
self::assertSame(['2.0.0', '1.5.0', '1.0.0'], array_column($packages, 'version'));
106+
}
107+
108+
public function testDumpWritesEmptyProviderFileWhenPackageHasNoVersions(): void
109+
{
110+
$package = $this->createMockPackage();
111+
112+
$this->manager->dump($package);
113+
114+
$data = json_decode(file_get_contents($this->manager->path($package->getName())), true);
115+
self::assertSame([], $data['packages'][$package->getName()]);
116+
}
117+
118+
public function testDumpUpdatesDumpedAtTimestamp(): void
119+
{
120+
$package = $this->createMockPackage();
121+
$version = $this->createMockVersion($package);
122+
$version->setCurrentMetadata($this->createMockMetadata($version));
123+
124+
self::assertNull($package->getDumpedAt());
125+
126+
$this->manager->dump($package);
127+
128+
self::assertInstanceOf(\DateTimeImmutable::class, $package->getDumpedAt());
129+
}
130+
131+
public function testRemoveDeletesBothProviderFiles(): void
132+
{
133+
$package = $this->createMockPackage();
134+
$version = $this->createMockVersion($package);
135+
$version->setCurrentMetadata($this->createMockMetadata($version));
136+
137+
$this->manager->dump($package);
138+
139+
$packageName = $package->getName();
140+
$releasePath = "{$this->storagePath}/provider/{$packageName}.json";
141+
$devPath = "{$this->storagePath}/provider/{$packageName}~dev.json";
142+
143+
self::assertFileExists($releasePath);
144+
self::assertFileExists($devPath);
145+
146+
$this->manager->remove($package);
147+
148+
self::assertFileDoesNotExist($releasePath);
149+
self::assertFileDoesNotExist($devPath);
150+
}
151+
}

0 commit comments

Comments
 (0)