Skip to content

Commit 43f6fa1

Browse files
committed
Update/add tests
1 parent eb5c190 commit 43f6fa1

10 files changed

+143
-108
lines changed

phpunit.xml.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.4/phpunit.xsd"
55
colors="true"
66
bootstrap="tests/bootstrap.php"
7+
displayDetailsOnTestsThatTriggerWarnings="true"
78
>
89
<php>
910
<ini name="display_errors" value="1"/>

tests/Controller/ApiControllerTest.php

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -39,33 +39,21 @@ public function testGitHubFailsWithInvalidCredentials(): void
3939
#[DataProvider('githubApiProvider')]
4040
public function testGithubApi($url): void
4141
{
42-
$package = $this->createPackage('test/'.bin2hex(random_bytes(10)), $url);
43-
44-
$user = new User;
45-
$user->addPackage($package);
46-
$package->addMaintainer($user);
47-
$user->setEnabled(true);
48-
$user->setUsername('test');
49-
$user->setEmail('[email protected]');
50-
$user->setPassword('testtest');
51-
$user->setApiToken('token');
52-
53-
$em = self::getEM();
54-
$em->persist($package);
55-
$em->persist($user);
56-
$em->flush();
42+
$user = self::createUser();
43+
$package = self::createPackage('test/'.bin2hex(random_bytes(10)), $url, maintainers: [$user]);
44+
$this->store($user, $package);
5745

5846
$scheduler = $this->createMock('App\Service\Scheduler');
5947

6048
$scheduler->expects($this->once())
6149
->method('scheduleUpdate')
6250
->with($package);
6351

64-
static::$kernel->getContainer()->set('doctrine.orm.entity_manager', $em);
52+
static::$kernel->getContainer()->set('doctrine.orm.entity_manager', self::getEM());
6553
static::$kernel->getContainer()->set('App\Service\Scheduler', $scheduler);
6654

6755
$payload = json_encode(['repository' => ['url' => 'git://github.com/composer/composer']]);
68-
$this->client->request('POST', '/api/github?username=test&apiToken=token', ['payload' => $payload]);
56+
$this->client->request('POST', '/api/github?username=test&apiToken=api-token', ['payload' => $payload]);
6957
$this->assertEquals(202, $this->client->getResponse()->getStatusCode(), $this->client->getResponse()->getContent());
7058
}
7159

@@ -81,49 +69,28 @@ public static function githubApiProvider(): array
8169

8270
public function testUnsafeApiRejectsSafeApiToken(): void
8371
{
84-
$user = new User;
85-
$user->setEnabled(true);
86-
$user->setUsername('test');
87-
$user->setEmail('[email protected]');
88-
$user->setPassword('testtest');
89-
$user->setApiToken('token');
90-
$user->setSafeApiToken('safetoken');
91-
92-
$em = self::getEM();
93-
$em->persist($user);
94-
$em->flush();
72+
$user = self::createUser();
73+
$this->store($user);
9574

9675
$payload = json_encode(['repository' => 'https://github.com/composer/composer']);
97-
$this->client->request('POST', '/api/create-package?username=test&apiToken=safetoken', ['payload' => $payload]);
76+
$this->client->request('POST', '/api/create-package?username=test&apiToken=safe-api-token', ['payload' => $payload]);
9877
$this->assertEquals(406, $this->client->getResponse()->getStatusCode(), $this->client->getResponse()->getContent());
9978
$this->assertEquals(json_encode(['status' => 'error', 'message' => 'Missing or invalid username/apiToken in request']), $this->client->getResponse()->getContent());
10079
}
10180

10281
public function testSafeApiAcceptsBothApiTokens(): void
10382
{
10483
$url = 'https://github.com/composer/composer';
105-
$package = $this->createPackage('test/'.bin2hex(random_bytes(10)), $url);
106-
$user = new User;
107-
$user->addPackage($package);
108-
$package->addMaintainer($user);
109-
$user->setEnabled(true);
110-
$user->setUsername('test');
111-
$user->setEmail('[email protected]');
112-
$user->setPassword('testtest');
113-
$user->setApiToken('token');
114-
$user->setSafeApiToken('safetoken');
115-
116-
$em = self::getEM();
117-
$em->persist($package);
118-
$em->persist($user);
119-
$em->flush();
84+
$user = self::createUser();
85+
$package = self::createPackage('test/'.bin2hex(random_bytes(10)), $url, maintainers: [$user]);
86+
$this->store($user, $package);
12087

12188
$payload = json_encode(['repository' => $url]);
122-
$this->client->request('POST', '/api/update-package?username=test&apiToken=safetoken', ['payload' => $payload]);
89+
$this->client->request('POST', '/api/update-package?username=test&apiToken=safe-api-token', ['payload' => $payload]);
12390
$this->assertEquals(202, $this->client->getResponse()->getStatusCode(), $this->client->getResponse()->getContent());
12491

12592
$payload = json_encode(['repository' => 'https://packagist.org/packages/'.$package->getName()]);
126-
$this->client->request('POST', '/api/update-package?username=test&apiToken=token', ['payload' => $payload]);
93+
$this->client->request('POST', '/api/update-package?username=test&apiToken=api-token', ['payload' => $payload]);
12794
$this->assertEquals(202, $this->client->getResponse()->getStatusCode(), $this->client->getResponse()->getContent());
12895
}
12996

@@ -205,9 +172,7 @@ public function testSecurityAdvisories(): void
205172
GitHubSecurityAdvisoriesSource::SOURCE_NAME,
206173
Severity::MEDIUM,
207174
), GitHubSecurityAdvisoriesSource::SOURCE_NAME);
208-
$em = self::getEM();
209-
$em->persist($advisory);
210-
$em->flush();
175+
$this->store($advisory);
211176

212177
$this->client->request('GET', '/api/security-advisories/?packages[]=acme/package');
213178
$this->assertEquals(200, $this->client->getResponse()->getStatusCode(), $this->client->getResponse()->getContent());

tests/Controller/ChangePasswordControllerTest.php

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,13 @@ class ChangePasswordControllerTest extends ControllerTestCase
2323
#[TestWith(['[email protected]', 'prohibited-password-error'])]
2424
public function testChangePassword(string $newPassword, string $expectedResult): void
2525
{
26-
$user = new User;
27-
$user->setEnabled(true);
28-
$user->setUsername('test');
29-
$user->setEmail('[email protected]');
30-
$user->setPassword('testtest');
31-
$user->setApiToken('token');
32-
$user->setGithubId('123456');
26+
$user = self::createUser();
3327

3428
$currentPassword = 'current-one-123';
3529
$currentPasswordHash = self::getContainer()->get(UserPasswordHasherInterface::class)->hashPassword($user, $currentPassword);
3630
$user->setPassword($currentPasswordHash);
3731

38-
$em = self::getEM();
39-
$em->persist($user);
40-
$em->flush();
32+
$this->store($user);
4133

4234
$this->client->loginUser($user);
4335

@@ -52,6 +44,7 @@ public function testChangePassword(string $newPassword, string $expectedResult):
5244
if ($expectedResult == 'ok') {
5345
$this->assertResponseStatusCodeSame(302);
5446

47+
$em = self::getEM();
5548
$em->clear();
5649
$user = $em->getRepository(User::class)->find($user->getId());
5750
$this->assertNotNull($user);

tests/Controller/ControllerTestCase.php

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
namespace App\Tests\Controller;
1414

1515
use App\Entity\Package;
16+
use App\Entity\User;
1617
use Doctrine\DBAL\Connection;
1718
use Doctrine\ORM\EntityManagerInterface;
1819
use Doctrine\Persistence\ManagerRegistry;
@@ -42,7 +43,7 @@ public function tearDown(): void
4243
parent::tearDown();
4344
}
4445

45-
public function getEM(): EntityManagerInterface
46+
public static function getEM(): EntityManagerInterface
4647
{
4748
return static::getContainer()->get(ManagerRegistry::class)->getManager();
4849
}
@@ -57,17 +58,61 @@ protected function assertFormError(string $message, string $formName, Crawler $c
5758
);
5859
}
5960

61+
/**
62+
* @param object|array<object> $objects
63+
*/
64+
protected function store(array|object ...$objects): void
65+
{
66+
$em = $this->getEM();
67+
foreach ($objects as $obj) {
68+
if (is_array($obj)) {
69+
foreach ($obj as $obj2) {
70+
$em->persist($obj2);
71+
}
72+
} else {
73+
$em->persist($obj);
74+
}
75+
}
76+
77+
$em->flush();
78+
}
79+
6080
/**
6181
* Creates a Package entity without running the slow network-based repository initialization step
82+
*
83+
* @param array<User> $maintainers
6284
*/
63-
protected function createPackage(string $name, string $repository, ?string $remoteId = null)
85+
protected static function createPackage(string $name, string $repository, ?string $remoteId = null, array $maintainers = []): Package
6486
{
6587
$package = new Package();
6688

6789
$package->setName($name);
6890
$package->setRemoteId($remoteId);
6991
(new ReflectionProperty($package, 'repository'))->setValue($package, $repository);
92+
if (\count($maintainers) > 0) {
93+
foreach ($maintainers as $user) {
94+
$package->addMaintainer($user);
95+
$user->addPackage($package);
96+
}
97+
}
7098

7199
return $package;
72100
}
101+
102+
/**
103+
* @param array<string> $roles
104+
*/
105+
protected static function createUser(string $username = 'test', string $email = '[email protected]', string $password = 'testtest', string $apiToken = 'api-token', string $safeApiToken = 'safe-api-token', string $githubId = '12345', bool $enabled = true, array $roles = []): User
106+
{
107+
$user = new User();
108+
$user->setEnabled(true);
109+
$user->setUsername($username);
110+
$user->setEmail($email);
111+
$user->setPassword($password);
112+
$user->setApiToken($apiToken);
113+
$user->setSafeApiToken($safeApiToken);
114+
$user->setGithubId($githubId);
115+
116+
return $user;
117+
}
73118
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php declare(strict_types=1);
2+
3+
/*
4+
* This file is part of Packagist.
5+
*
6+
* (c) Jordi Boggiano <[email protected]>
7+
* Nils Adermann <[email protected]>
8+
*
9+
* For the full copyright and license information, please view the LICENSE
10+
* file that was distributed with this source code.
11+
*/
12+
13+
namespace App\Tests\Controller;
14+
15+
use App\Entity\Package;
16+
use App\Search\Query;
17+
use App\Tests\Search\AlgoliaMock;
18+
19+
class PackageControllerTest extends ControllerTestCase
20+
{
21+
public function testView(): void
22+
{
23+
$package = self::createPackage('test/pkg', 'https://example.com/test/pkg');
24+
$this->store($package);
25+
26+
$crawler = $this->client->request('GET', '/packages/test/pkg');
27+
self::assertResponseIsSuccessful();
28+
self::assertSame('composer require test/pkg', $crawler->filter('.requireme input')->attr('value'));
29+
}
30+
31+
public function testEdit(): void
32+
{
33+
$user = self::createUser();
34+
$package = self::createPackage('test/pkg', 'https://example.com/test/pkg', maintainers: [$user]);
35+
36+
$this->store($user, $package);
37+
38+
$this->client->loginUser($user);
39+
40+
$crawler = $this->client->request('GET', '/packages/test/pkg');
41+
self::assertResponseIsSuccessful();
42+
self::assertSame('example.com/test/pkg', $crawler->filter('.canonical')->text());
43+
44+
$form = $crawler->selectButton('Edit')->form();
45+
$crawler = $this->client->submit($form);
46+
47+
self::assertResponseIsSuccessful();
48+
49+
$form = $crawler->selectButton('Update')->form(['form[repository]' => 'https://github.com/composer/composer']);
50+
$this->client->submit($form);
51+
self::assertResponseRedirects();
52+
$crawler = $this->client->followRedirect();
53+
54+
self::assertResponseIsSuccessful();
55+
self::assertSame('github.com/composer/composer', $crawler->filter('.canonical')->text());
56+
}
57+
}

tests/Controller/ProfileControllerTest.php

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,8 @@ class ProfileControllerTest extends ControllerTestCase
1818
{
1919
public function testEditProfile(): void
2020
{
21-
$user = new User;
22-
$user->setEnabled(true);
23-
$user->setUsername('test');
24-
$user->setEmail('[email protected]');
25-
$user->setPassword('testtest');
26-
$user->setApiToken('token');
27-
$user->setGithubId('123456');
28-
29-
$user->initializeConfirmationToken();
30-
$user->setPasswordRequestedAt(new \DateTime());
31-
32-
$em = self::getEM();
33-
$em->persist($user);
34-
$em->flush();
21+
$user = self::createUser();
22+
$this->store($user);
3523

3624
$this->client->loginUser($user);
3725

@@ -44,6 +32,7 @@ public function testEditProfile(): void
4432

4533
$this->assertResponseStatusCodeSame(302);
4634

35+
$em = self::getEM();
4736
$em->clear();
4837
$user = $em->getRepository(User::class)->find($user->getId());
4938
$this->assertNotNull($user);
@@ -54,18 +43,12 @@ public function testEditProfile(): void
5443

5544
public function testTokenRotate(): void
5645
{
57-
$user = new User;
58-
$user->setEnabled(true);
59-
$user->setUsername('test');
60-
$user->setEmail('[email protected]');
61-
$user->setPassword('testtest');
46+
$user = self::createUser();
47+
$this->store($user);
48+
6249
$token = $user->getApiToken();
6350
$safeToken = $user->getSafeApiToken();
6451

65-
$em = self::getEM();
66-
$em->persist($user);
67-
$em->flush();
68-
6952
$this->client->loginUser($user);
7053

7154
$crawler = $this->client->request('GET', '/profile/');
@@ -77,6 +60,7 @@ public function testTokenRotate(): void
7760

7861
$this->assertResponseStatusCodeSame(302);
7962

63+
$em = self::getEM();
8064
$em->clear();
8165
$user = $em->getRepository(User::class)->find($user->getId());
8266
$this->assertNotNull($user);

tests/Controller/ResetPasswordControllerTest.php

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,15 @@ public function testResetPasswordToProhibited(): void
6161

6262
private function setupUserWithPasswordResetRequest(bool $withTwoFactor): User
6363
{
64-
$user = new User;
65-
$user->setEnabled(true);
66-
$user->setUsername('test');
67-
$user->setEmail('[email protected]');
68-
$user->setPassword('testtest');
69-
$user->setApiToken('token');
64+
$user = self::createUser();
7065
$user->initializeConfirmationToken();
7166
$user->setPasswordRequestedAt(new \DateTime());
7267

7368
if ($withTwoFactor) {
7469
$user->setTotpSecret('secret');
7570
}
7671

77-
$em = self::getEM();
78-
$em->persist($user);
79-
$em->flush();
72+
$this->store($user);
8073

8174
return $user;
8275
}

tests/Controller/UserControllerTest.php

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,8 @@ class UserControllerTest extends ControllerTestCase
1919
{
2020
public function testEnableTwoFactoCode(): void
2121
{
22-
$user = new User;
23-
$user->setEnabled(true);
24-
$user->setUsername('test');
25-
$user->setEmail('[email protected]');
26-
$user->setPassword('testtest');
27-
$user->setApiToken('token');
28-
29-
$em = self::getEM();
30-
$em->persist($user);
31-
$em->flush();
22+
$user = self::createUser();
23+
$this->store($user);
3224

3325
$this->client->loginUser($user);
3426

@@ -49,6 +41,7 @@ public function testEnableTwoFactoCode(): void
4941
$this->client->submit($form);
5042
$this->assertResponseStatusCodeSame(302);
5143

44+
$em = self::getEM();
5245
$em->clear();
5346
$this->assertTrue($em->getRepository(User::class)->find($user->getId())->isTotpAuthenticationEnabled());
5447
}

0 commit comments

Comments
 (0)