Skip to content

Commit 1173da8

Browse files
committed
ISSUE-345: subscription controller test
1 parent a81717b commit 1173da8

File tree

6 files changed

+168
-54
lines changed

6 files changed

+168
-54
lines changed

src/Controller/ListController.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,6 @@ public function deleteList(
257257
new OA\Property(property: 'description', type: 'string', example: 'News (and some fun stuff)'),
258258
new OA\Property(property: 'list_position', type: 'number', example: 12),
259259
new OA\Property(property: 'public', type: 'boolean', example: true),
260-
new OA\Property(property: 'owner', type: 'number', example: 12),
261260
]
262261
)
263262
),
@@ -305,12 +304,12 @@ public function deleteList(
305304
)]
306305
public function createList(Request $request, SubscriberListNormalizer $normalizer): JsonResponse
307306
{
308-
$this->requireAuthentication($request);
307+
$authUser = $this->requireAuthentication($request);
309308

310309
/** @var CreateSubscriberListRequest $subscriberListRequest */
311310
$subscriberListRequest = $this->validator->validate($request, CreateSubscriberListRequest::class);
312-
$data = $this->subscriberListManager->createSubscriberList($subscriberListRequest);
311+
$data = $this->subscriberListManager->createSubscriberList($subscriberListRequest, $authUser);
313312

314-
return new JsonResponse($normalizer->normalize($data), Response::HTTP_CREATED, [], true);
313+
return new JsonResponse($normalizer->normalize($data), Response::HTTP_CREATED);
315314
}
316315
}

src/Entity/Request/CreateSubscriberListRequest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ class CreateSubscriberListRequest implements RequestInterface
1818
#[Assert\NotBlank]
1919
public int $listPosition;
2020

21-
#[Assert\NotBlank]
22-
public int $owner;
23-
2421
#[Assert\NotBlank]
2522
#[Assert\NotNull]
2623
public string $description;

src/Service/Manager/SubscriberListManager.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace PhpList\RestBundle\Service\Manager;
66

7+
use PhpList\Core\Domain\Model\Identity\Administrator;
78
use PhpList\Core\Domain\Model\Subscription\SubscriberList;
89
use PhpList\Core\Domain\Repository\Subscription\SubscriberListRepository;
910
use PhpList\RestBundle\Entity\Request\CreateSubscriberListRequest;
@@ -12,16 +13,18 @@ class SubscriberListManager
1213
{
1314
private SubscriberListRepository $subscriberListRepository;
1415

15-
public function __construct(
16-
SubscriberListRepository $subscriberListRepository,
17-
) {
16+
public function __construct(SubscriberListRepository $subscriberListRepository)
17+
{
1818
$this->subscriberListRepository = $subscriberListRepository;
1919
}
2020

21-
public function createSubscriberList(CreateSubscriberListRequest $subscriberListRequest): SubscriberList
22-
{
21+
public function createSubscriberList(
22+
CreateSubscriberListRequest $subscriberListRequest,
23+
Administrator $authUser
24+
): SubscriberList {
2325
$subscriberList = (new SubscriberList())
2426
->setName($subscriberListRequest->name)
27+
->setOwner($authUser)
2528
->setDescription($subscriberListRequest->description)
2629
->setListPosition($subscriberListRequest->listPosition)
2730
->setPublic($subscriberListRequest->public);

src/Validator/EmailExistsValidator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace PhpList\RestBundle\Validator;
66

77
use PhpList\Core\Domain\Repository\Subscription\SubscriberRepository;
8-
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
8+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
99
use Symfony\Component\Validator\Constraint;
1010
use Symfony\Component\Validator\ConstraintValidator;
1111
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
@@ -37,7 +37,7 @@ public function validate($value, Constraint $constraint): void
3737
$existingUser = $this->subscriberRepository->findOneBy(['email' => $value]);
3838

3939
if (!$existingUser) {
40-
throw new ConflictHttpException('Subscriber with email does not exists.');
40+
throw new NotFoundHttpException('Subscriber with email does not exists.');
4141
}
4242
}
4343
}

tests/Integration/Controller/ListControllerTest.php

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -290,60 +290,41 @@ public function testGetListMembersWithCurrentSessionKeyForExistingListWithSubscr
290290
);
291291
}
292292

293-
public function testGetListSubscribersCountForExistingListWithoutSessionKeyReturnsForbiddenStatus()
293+
public function testCreateListWithValidPayloadReturns201(): void
294294
{
295-
$this->loadFixtures([SubscriberListFixture::class]);
296-
297-
self::getClient()->request('get', '/api/v2/lists/1/subscribers/count');
298-
299-
$this->assertHttpForbidden();
300-
}
295+
$this->loadFixtures([AdministratorFixture::class, AdministratorTokenFixture::class]);
301296

302-
public function testGetListSubscribersCountForExistingListWithExpiredSessionKeyReturnsForbiddenStatus()
303-
{
304-
$this->loadFixtures([
305-
SubscriberListFixture::class,
306-
AdministratorFixture::class,
307-
AdministratorTokenFixture::class,
297+
$payload = json_encode([
298+
'name' => 'New List',
299+
'description' => 'This is a new subscriber list.',
300+
'listPosition' => 3,
301+
'public' => true,
308302
]);
309303

310-
self::getClient()->request(
311-
'get',
312-
'/api/v2/lists/1/subscribers/count',
313-
[],
314-
[],
315-
['PHP_AUTH_USER' => 'unused', 'PHP_AUTH_PW' => 'cfdf64eecbbf336628b0f3071adba764']
316-
);
317-
318-
$this->assertHttpForbidden();
319-
}
320-
321-
public function testGetListSubscribersCountWithCurrentSessionKeyForExistingListReturnsOkayStatus()
322-
{
323-
$this->loadFixtures([SubscriberListFixture::class]);
304+
$this->authenticatedJsonRequest('POST', '/api/v2/lists', [], [], [], $payload);
324305

325-
$this->authenticatedJsonRequest('get', '/api/v2/lists/1/subscribers/count');
306+
$this->assertHttpCreated();
307+
$response = $this->getDecodedJsonResponseContent();
326308

327-
$this->assertHttpOkay();
309+
self::assertSame('New List', $response['name']);
328310
}
329311

330-
public function testGetSubscribersCountForEmptyListWithValidSession()
312+
public function testCreateListWithMissingNameReturnsValidationError(): void
331313
{
332-
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
314+
$this->loadFixtures([AdministratorFixture::class, AdministratorTokenFixture::class]);
333315

334-
$this->authenticatedJsonRequest('get', '/api/v2/lists/3/subscribers/count');
335-
$responseData = $this->getDecodedJsonResponseContent();
316+
$payload = [
317+
'description' => 'Missing name field'
318+
];
336319

337-
self::assertSame(0, $responseData['subscribers_count']);
320+
$this->authenticatedJsonRequest('POST', '/api/v2/lists', [], [], [], json_encode($payload));
321+
$this->assertHttpUnprocessableEntity();
338322
}
339323

340-
public function testGetSubscribersCountForListWithValidSession()
324+
public function testCreateListWithoutSessionKeyReturnsForbidden(): void
341325
{
342-
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
343-
344-
$this->authenticatedJsonRequest('get', '/api/v2/lists/2/subscribers/count');
345-
$responseData = $this->getDecodedJsonResponseContent();
326+
self::getClient()->request('POST', '/api/v2/lists', [], [], [], json_encode([ 'name' => 'UnauthorizedList']));
346327

347-
self::assertSame(2, $responseData['subscribers_count']);
328+
$this->assertHttpForbidden();
348329
}
349330
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Integration\Controller;
6+
7+
use PhpList\RestBundle\Controller\SubscriptionController;
8+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Identity\AdministratorFixture;
9+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Identity\AdministratorTokenFixture;
10+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Messaging\SubscriberListFixture;
11+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Subscription\SubscriberFixture;
12+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Subscription\SubscriptionFixture;
13+
14+
class SubscriptionControllerTest extends AbstractTestController
15+
{
16+
public function testControllerIsAvailableViaContainer(): void
17+
{
18+
self::assertInstanceOf(
19+
SubscriptionController::class,
20+
self::getContainer()->get(SubscriptionController::class)
21+
);
22+
}
23+
24+
public function testGetSubscribersWithoutSessionReturnsForbidden(): void
25+
{
26+
$this->loadFixtures([SubscriberListFixture::class]);
27+
self::getClient()->request('GET', '/api/v2/lists/1/subscribers');
28+
$this->assertHttpForbidden();
29+
}
30+
31+
public function testGetSubscribersWithSessionReturnsList(): void
32+
{
33+
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
34+
$this->authenticatedJsonRequest('GET', '/api/v2/lists/2/subscribers');
35+
$this->assertHttpOkay();
36+
}
37+
38+
public function testGetSubscribersCountWithSessionReturnsCorrectCount(): void
39+
{
40+
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
41+
$this->authenticatedJsonRequest('GET', '/api/v2/lists/2/subscribers/count');
42+
$data = $this->getDecodedJsonResponseContent();
43+
self::assertSame(2, $data['subscribers_count']);
44+
}
45+
46+
public function testCreateSubscriptionWithValidEmailsReturns201(): void
47+
{
48+
$this->loadFixtures([
49+
SubscriberListFixture::class,
50+
AdministratorFixture::class,
51+
AdministratorTokenFixture::class,
52+
SubscriberFixture::class,
53+
]);
54+
55+
$payload = json_encode(['emails' => ['[email protected]']]);
56+
57+
$this->authenticatedJsonRequest('POST', '/api/v2/lists/1/subscribers', [], [], [], $payload);
58+
$this->assertHttpCreated();
59+
}
60+
61+
public function testDeleteSubscriptionReturnsNoContent(): void
62+
{
63+
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
64+
65+
$this->authenticatedJsonRequest('DELETE', '/api/v2/lists/2/subscribers?emails[][email protected]');
66+
$this->assertHttpNoContent();
67+
}
68+
69+
public function testDeleteSubscriptionForUnknownEmailReturnsValidationError(): void
70+
{
71+
$this->loadFixtures([SubscriberListFixture::class]);
72+
73+
$this->authenticatedJsonRequest('DELETE', '/api/v2/lists/1/subscribers?emails[][email protected]');
74+
$this->assertHttpNotFound();
75+
}
76+
77+
78+
public function testGetListSubscribersCountForExistingListWithoutSessionKeyReturnsForbiddenStatus()
79+
{
80+
$this->loadFixtures([SubscriberListFixture::class]);
81+
82+
self::getClient()->request('get', '/api/v2/lists/1/subscribers/count');
83+
84+
$this->assertHttpForbidden();
85+
}
86+
87+
public function testGetListSubscribersCountForExistingListWithExpiredSessionKeyReturnsForbiddenStatus()
88+
{
89+
$this->loadFixtures([
90+
SubscriberListFixture::class,
91+
AdministratorFixture::class,
92+
AdministratorTokenFixture::class,
93+
]);
94+
95+
self::getClient()->request(
96+
'get',
97+
'/api/v2/lists/1/subscribers/count',
98+
[],
99+
[],
100+
['PHP_AUTH_USER' => 'unused', 'PHP_AUTH_PW' => 'cfdf64eecbbf336628b0f3071adba764']
101+
);
102+
103+
$this->assertHttpForbidden();
104+
}
105+
106+
public function testGetListSubscribersCountWithCurrentSessionKeyForExistingListReturnsOkayStatus()
107+
{
108+
$this->loadFixtures([SubscriberListFixture::class]);
109+
110+
$this->authenticatedJsonRequest('get', '/api/v2/lists/1/subscribers/count');
111+
112+
$this->assertHttpOkay();
113+
}
114+
115+
public function testGetSubscribersCountForEmptyListWithValidSession()
116+
{
117+
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
118+
119+
$this->authenticatedJsonRequest('get', '/api/v2/lists/3/subscribers/count');
120+
$responseData = $this->getDecodedJsonResponseContent();
121+
122+
self::assertSame(0, $responseData['subscribers_count']);
123+
}
124+
125+
public function testGetSubscribersCountForListWithValidSession()
126+
{
127+
$this->loadFixtures([SubscriberListFixture::class, SubscriberFixture::class, SubscriptionFixture::class]);
128+
129+
$this->authenticatedJsonRequest('get', '/api/v2/lists/2/subscribers/count');
130+
$responseData = $this->getDecodedJsonResponseContent();
131+
132+
self::assertSame(2, $responseData['subscribers_count']);
133+
}
134+
}

0 commit comments

Comments
 (0)