Skip to content

Commit 74f6220

Browse files
Add tests for PackageController::transferPackageAction()
1 parent 75a2cd1 commit 74f6220

File tree

2 files changed

+81
-3
lines changed

2 files changed

+81
-3
lines changed

src/Controller/PackageController.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,10 +1002,9 @@ public function transferPackageAction(Request $req, #[MapEntity] Package $packag
10021002

10031003
if ($form->isSubmitted() && $form->isValid()) {
10041004
try {
1005-
$em = $this->getEM();
10061005
$newMaintainers = $form->getData()->getMaintainers()->toArray();
10071006
$result = $this->packageManager->transferPackage($package, $oldMaintainers, $newMaintainers);
1008-
$em->flush();
1007+
$this->getEM()->flush();
10091008

10101009
if ($result) {
10111010
$usernames = array_map(fn (User $user) => $user->getUsername(), $newMaintainers);
@@ -1671,7 +1670,7 @@ private function createRemoveMaintainerForm(Package $package): FormInterface
16711670
private function createTransferPackageForm(Package $package): FormInterface
16721671
{
16731672
$transferRequest = new TransferPackageRequest();
1674-
$transferRequest->setMaintainers($package->getMaintainers());
1673+
$transferRequest->setMaintainers(clone $package->getMaintainers());
16751674

16761675
return $this->createForm(TransferPackageRequestType::class, $transferRequest);
16771676
}

tests/Controller/PackageControllerTest.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use App\Entity\Package;
1717
use App\Entity\User;
1818
use App\Tests\IntegrationTestCase;
19+
use PHPUnit\Framework\Attributes\TestWith;
1920

2021
class PackageControllerTest extends IntegrationTestCase
2122
{
@@ -144,4 +145,82 @@ public function testRemoveMaintainer(): void
144145

145146
$this->assertNotNull($auditRecord);
146147
}
148+
149+
public function testTransferPackage(): void
150+
{
151+
$john = self::createUser('john', '[email protected]');
152+
$alice = self::createUser('alice', '[email protected]');
153+
$bob = self::createUser('bob', '[email protected]');
154+
$package = self::createPackage('test/pkg', 'https://example.com/test/pkg', maintainers: [$john, $alice]);
155+
156+
$this->store($john, $alice, $bob, $package);
157+
158+
$this->client->loginUser($john);
159+
160+
$this->assertTrue($package->isMaintainer($john));
161+
$this->assertTrue($package->isMaintainer($alice));
162+
$this->assertFalse($package->isMaintainer($bob));
163+
164+
$crawler = $this->client->request('GET', '/packages/test/pkg');
165+
166+
$form = $crawler->filter('[name="transfer_package_form"]')->form();
167+
$form->setValues([
168+
'transfer_package_form[maintainers][0]' => 'alice',
169+
'transfer_package_form[maintainers][1]' => '[email protected]',
170+
]);
171+
172+
$this->client->submit($form);
173+
174+
$this->assertResponseRedirects('/packages/test/pkg');
175+
$this->client->followRedirect();
176+
$this->assertResponseIsSuccessful();
177+
178+
$em = self::getEM();
179+
$em->clear();
180+
181+
$package = $em->getRepository(Package::class)->find($package->getId());
182+
$this->assertNotNull($package);
183+
184+
$maintainerIds = array_map(fn (User $user) => $user->getId(), $package->getMaintainers()->toArray());
185+
$this->assertContains($alice->getId(), $maintainerIds);
186+
$this->assertContains($bob->getId(), $maintainerIds);
187+
$this->assertNotContains($john->getId(), $maintainerIds);
188+
189+
$auditRecord = $em->getRepository(\App\Entity\AuditRecord::class)->findOneBy([
190+
'type' => AuditRecordType::PackageTransferred->value,
191+
'packageId' => $package->getId(),
192+
]);
193+
194+
$this->assertNotNull($auditRecord, 'Audit record not found');
195+
}
196+
197+
#[TestWith(['does_not_exist', 'value is not a valid username or email'])]
198+
#[TestWith([null, 'at least one maintainer must be specified'])]
199+
public function testTransferPackageReturnsValidationError(?string $value, string $message): void
200+
{
201+
$alice = self::createUser('alice', '[email protected]');
202+
$package = self::createPackage('test/pkg', 'https://example.com/test/pkg', maintainers: [$alice]);
203+
204+
$this->store($alice, $package);
205+
206+
$this->client->loginUser($alice);
207+
208+
$crawler = $this->client->request('GET', '/packages/test/pkg');
209+
210+
$form = $crawler->filter('[name="transfer_package_form"]')->form();
211+
$form->setValues([
212+
'transfer_package_form[maintainers][0]' => $value,
213+
]);
214+
215+
$this->client->submit($form);
216+
217+
$this->assertResponseRedirects('/packages/test/pkg');
218+
$crawler = $this->client->followRedirect();
219+
$this->assertResponseIsSuccessful();
220+
221+
$elements = $crawler->filter('.flash-container .alert-error');
222+
$this->assertCount(1, $elements);
223+
$text = $elements->text();
224+
$this->assertStringContainsStringIgnoringCase($message, $text);
225+
}
147226
}

0 commit comments

Comments
 (0)