Skip to content

Commit a6d739b

Browse files
committed
Add tests to verify updating and deleting package links
1 parent f1d92d6 commit a6d739b

1 file changed

Lines changed: 117 additions & 0 deletions

File tree

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CodedMonkey\Dirigent\Tests\FunctionalTests\Doctrine\Repository;
6+
7+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataDevRequireLink;
8+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataProvideLink;
9+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataRequireLink;
10+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataSuggestLink;
11+
use CodedMonkey\Dirigent\Doctrine\Entity\PackageProvideLink;
12+
use CodedMonkey\Dirigent\Doctrine\Entity\PackageRequireLink;
13+
use CodedMonkey\Dirigent\Doctrine\Entity\PackageSuggestLink;
14+
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
15+
use CodedMonkey\Dirigent\Tests\Helper\EntityManagerTestTrait;
16+
use CodedMonkey\Dirigent\Tests\Helper\KernelTestCaseTrait;
17+
use CodedMonkey\Dirigent\Tests\Helper\MockEntityFactoryTrait;
18+
use Doctrine\ORM\EntityManagerInterface;
19+
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
20+
21+
class PackageRepositoryTest extends KernelTestCase
22+
{
23+
use EntityManagerTestTrait;
24+
use KernelTestCaseTrait;
25+
use MockEntityFactoryTrait;
26+
27+
public function testUpdatePackageLinks(): void
28+
{
29+
[$package, $version, $metadata] = $this->createMockPackageWithMetadata();
30+
31+
new MetadataDevRequireLink($metadata, 'vendor/dev-dependency', '^2.0', 0);
32+
new MetadataProvideLink($metadata, 'vendor/provided', 'self.version', 0);
33+
new MetadataProvideLink($metadata, 'vendor/contract-implementation', '1.0', 1);
34+
new MetadataSuggestLink($metadata, 'vendor/suggestion', 'For more features', 0);
35+
36+
$this->persistEntities($package, $version, $metadata);
37+
38+
$this->getService(PackageRepository::class)->updatePackageLinks($package, $version);
39+
40+
$entityManager = $this->getService(EntityManagerInterface::class);
41+
42+
/** @var PackageRequireLink[] $requireLinks */
43+
$requireLinks = $entityManager->getRepository(PackageRequireLink::class)->findBy(['package' => $package], ['linkedPackageName' => 'ASC']);
44+
$this->assertCount(2, $requireLinks);
45+
$this->assertSame('vendor/dependency', $requireLinks[0]->getLinkedPackageName());
46+
$this->assertFalse($requireLinks[0]->isDevDependency());
47+
$this->assertSame('vendor/dev-dependency', $requireLinks[1]->getLinkedPackageName());
48+
$this->assertTrue($requireLinks[1]->isDevDependency());
49+
50+
/** @var PackageProvideLink[] $provideLinks */
51+
$provideLinks = $entityManager->getRepository(PackageProvideLink::class)->findBy(['package' => $package], ['linkedPackageName' => 'ASC']);
52+
$this->assertCount(2, $provideLinks);
53+
$this->assertSame('vendor/contract', $provideLinks[0]->getLinkedPackageName());
54+
$this->assertTrue($provideLinks[0]->isImplementation());
55+
$this->assertSame('vendor/provided', $provideLinks[1]->getLinkedPackageName());
56+
$this->assertFalse($provideLinks[1]->isImplementation());
57+
58+
/** @var PackageSuggestLink[] $suggestLinks */
59+
$suggestLinks = $entityManager->getRepository(PackageSuggestLink::class)->findBy(['package' => $package]);
60+
$this->assertCount(1, $suggestLinks);
61+
$this->assertSame('vendor/suggestion', $suggestLinks[0]->getLinkedPackageName());
62+
}
63+
64+
public function testUpdatePackageLinksReplacesExistingLinks(): void
65+
{
66+
[$package, $version, $metadata] = $this->createMockPackageWithMetadata();
67+
68+
new MetadataSuggestLink($metadata, 'vendor/suggestion', 'For more features', 0);
69+
70+
$this->persistEntities($package, $version, $metadata);
71+
72+
$packageRepository = $this->getService(PackageRepository::class);
73+
$packageRepository->updatePackageLinks($package, $version);
74+
75+
$newMetadata = $this->createMockMetadata($version);
76+
$newMetadata->setRevision($metadata->getRevision() + 1);
77+
new MetadataRequireLink($newMetadata, 'vendor/new-dependency', '^2.0', 1);
78+
$version->setCurrentMetadata($newMetadata);
79+
80+
$this->persistEntities($version, $newMetadata);
81+
82+
$packageRepository->updatePackageLinks($package, $version);
83+
$this->clearEntities();
84+
85+
$entityManager = $this->getService(EntityManagerInterface::class);
86+
87+
/** @var PackageRequireLink[] $requireLinks */
88+
$requireLinks = $entityManager->getRepository(PackageRequireLink::class)->findBy(['package' => $package], ['linkedPackageName' => 'ASC']);
89+
$this->assertCount(2, $requireLinks);
90+
$this->assertSame('vendor/dependency', $requireLinks[0]->getLinkedPackageName());
91+
$this->assertSame('vendor/new-dependency', $requireLinks[1]->getLinkedPackageName());
92+
93+
// The suggest link of the previous metadata revision is no longer linked to the package
94+
$suggestLinks = $entityManager->getRepository(PackageSuggestLink::class)->findBy(['package' => $package]);
95+
$this->assertCount(0, $suggestLinks);
96+
}
97+
98+
public function testDeletePackageLinks(): void
99+
{
100+
[$package, $version, $metadata] = $this->createMockPackageWithMetadata();
101+
102+
new MetadataProvideLink($metadata, 'vendor/provided', 'self.version', 0);
103+
new MetadataSuggestLink($metadata, 'vendor/suggestion', 'For more features', 0);
104+
105+
$this->persistEntities($package, $version, $metadata);
106+
107+
$packageRepository = $this->getService(PackageRepository::class);
108+
$packageRepository->updatePackageLinks($package, $version);
109+
$packageRepository->deletePackageLinks($package);
110+
111+
$entityManager = $this->getService(EntityManagerInterface::class);
112+
113+
$this->assertCount(0, $entityManager->getRepository(PackageRequireLink::class)->findBy(['package' => $package]));
114+
$this->assertCount(0, $entityManager->getRepository(PackageProvideLink::class)->findBy(['package' => $package]));
115+
$this->assertCount(0, $entityManager->getRepository(PackageSuggestLink::class)->findBy(['package' => $package]));
116+
}
117+
}

0 commit comments

Comments
 (0)