Skip to content

Commit ffd4009

Browse files
committed
Merge branch '0.7'
2 parents 9eff77a + 488e8a0 commit ffd4009

2 files changed

Lines changed: 125 additions & 8 deletions

File tree

src/Doctrine/Repository/PackageRepository.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,44 +122,44 @@ public function updatePackageLinks(Package $package, Version $version): void
122122
$connection = $this->getEntityManager()->getConnection();
123123
$connection->transactional(function (Connection $connection) use ($package, $version) {
124124
$this->deletePackageLinks($package);
125-
$queryParameters = ['id' => $package->getId(), 'version' => $version->getId()];
125+
$queryParameters = ['id' => $package->getId(), 'metadata' => $version->getCurrentMetadata()->getId()];
126126

127127
$connection->executeStatement(
128128
<<<'SQL'
129129
INSERT INTO package_provide_link (linked_package_name, implementation, package_id)
130130
SELECT linked_package_name, FALSE, :id
131-
FROM version_provide_link
132-
WHERE version_id = :version AND linked_package_name NOT LIKE '%-implementation'
131+
FROM metadata_provide_link
132+
WHERE metadata_id = :metadata AND linked_package_name NOT LIKE '%-implementation'
133133
SQL,
134134
$queryParameters,
135135
);
136136
$connection->executeStatement(
137137
<<<'SQL'
138138
INSERT INTO package_provide_link (linked_package_name, implementation, package_id)
139139
SELECT SUBSTRING(linked_package_name, 1, LENGTH(linked_package_name) - 15), TRUE, :id
140-
FROM version_provide_link
141-
WHERE version_id = :version AND linked_package_name LIKE '%-implementation'
140+
FROM metadata_provide_link
141+
WHERE metadata_id = :metadata AND linked_package_name LIKE '%-implementation'
142142
SQL,
143143
$queryParameters,
144144
);
145145
$connection->executeStatement(
146146
<<<'SQL'
147147
INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id)
148-
SELECT linked_package_name, FALSE, :id FROM version_require_link WHERE version_id = :version
148+
SELECT linked_package_name, FALSE, :id FROM metadata_require_link WHERE metadata_id = :metadata
149149
SQL,
150150
$queryParameters,
151151
);
152152
$connection->executeStatement(
153153
<<<'SQL'
154154
INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id)
155-
SELECT linked_package_name, TRUE, :id FROM version_dev_require_link WHERE version_id = :version
155+
SELECT linked_package_name, TRUE, :id FROM metadata_dev_require_link WHERE metadata_id = :metadata
156156
SQL,
157157
$queryParameters,
158158
);
159159
$connection->executeStatement(
160160
<<<'SQL'
161161
INSERT INTO package_suggest_link (linked_package_name, package_id)
162-
SELECT linked_package_name, :id FROM version_suggest_link WHERE version_id = :version
162+
SELECT linked_package_name, :id FROM metadata_suggest_link WHERE metadata_id = :metadata
163163
SQL,
164164
$queryParameters,
165165
);
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)