Skip to content

Commit e7404f4

Browse files
committed
Add tests
1 parent cde97d5 commit e7404f4

12 files changed

Lines changed: 382 additions & 72 deletions

src/Subscription/Controller/SubscribePageController.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function __construct(
4141
path: '/api/v2/subscribe-pages',
4242
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
4343
summary: 'Get subscribe pages list',
44-
tags: ['subscriptions'],
44+
tags: ['subscribe-pages'],
4545
parameters: [
4646
new OA\Parameter(
4747
name: 'php-auth-pw',
@@ -137,7 +137,7 @@ className: SubscribePage::class,
137137
]
138138
)
139139
),
140-
tags: ['subscriptions'],
140+
tags: ['subscribe-pages'],
141141
parameters: [
142142
new OA\Parameter(
143143
name: 'php-auth-pw',
@@ -175,10 +175,14 @@ public function createPage(Request $request): JsonResponse
175175
/** @var SubscribePageRequest $createRequest */
176176
$createRequest = $this->validator->validate($request, SubscribePageRequest::class);
177177

178-
$page = $this->subscribePageManager->createPage($createRequest->title, $createRequest->active, $admin);
178+
$page = $this->subscribePageManager->createPage(
179+
title: $createRequest->title,
180+
active: $createRequest->active,
181+
owner: $admin
182+
);
179183
if ($createRequest->hasData()) {
180184
$this->entityManager->flush();
181-
$this->subscribePageManager->syncPageData($createRequest->getDataMap(), $page);
185+
$this->subscribePageManager->syncPageData(data: $createRequest->getDataMap(), page: $page);
182186
}
183187
$this->entityManager->flush();
184188

@@ -190,7 +194,7 @@ public function createPage(Request $request): JsonResponse
190194
path: '/api/v2/subscribe-pages/{id}',
191195
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
192196
summary: 'Get subscribe page',
193-
tags: ['subscriptions'],
197+
tags: ['subscribe-pages'],
194198
parameters: [
195199
new OA\Parameter(
196200
name: 'php-auth-pw',
@@ -266,7 +270,7 @@ public function getPage(Request $request): JsonResponse
266270
]
267271
)
268272
),
269-
tags: ['subscriptions'],
273+
tags: ['subscribe-pages'],
270274
parameters: [
271275
new OA\Parameter(
272276
name: 'php-auth-pw',
@@ -336,7 +340,7 @@ public function updatePage(
336340
path: '/api/v2/subscribe-pages/{id}',
337341
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
338342
summary: 'Delete subscribe page',
339-
tags: ['subscriptions'],
343+
tags: ['subscribe-pages'],
340344
parameters: [
341345
new OA\Parameter(
342346
name: 'php-auth-pw',

src/Subscription/Controller/SubscribePagePublicController.php

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

77
use Doctrine\ORM\EntityManagerInterface;
88
use OpenApi\Attributes as OA;
9-
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
9+
use PhpList\Core\Domain\Subscription\Repository\SubscriberListRepository;
1010
use PhpList\Core\Domain\Subscription\Service\Manager\SubscribePageManager;
1111
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberAttributeManager;
1212
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriptionManager;
@@ -16,7 +16,6 @@
1616
use PhpList\RestBundle\Subscription\Request\PublicSubscriptionRequest;
1717
use PhpList\RestBundle\Subscription\Serializer\SubscribePagePublicNormalizer;
1818
use PhpList\RestBundle\Subscription\Serializer\SubscriptionNormalizer;
19-
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
2019
use Symfony\Component\HttpFoundation\JsonResponse;
2120
use Symfony\Component\HttpFoundation\Request;
2221
use Symfony\Component\HttpFoundation\Response;
@@ -33,6 +32,7 @@ public function __construct(
3332
private readonly SubscriptionManager $subscriptionManager,
3433
private readonly SubscriptionNormalizer $subscriptionNormalizer,
3534
private readonly SubscriberAttributeManager $subscriberAttributeManager,
35+
private readonly SubscriberListRepository $subscriberListRepository,
3636
) {
3737
parent::__construct($authentication, $validator);
3838
}
@@ -42,7 +42,7 @@ public function __construct(
4242
path: '/api/v2/public/subscribe-pages/{pageId}',
4343
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
4444
summary: 'Get public subscribe page (placeholders replaced with actual values)',
45-
tags: ['public'],
45+
tags: ['subscribe-pages'],
4646
parameters: [
4747
new OA\Parameter(
4848
name: 'pageId',
@@ -87,7 +87,7 @@ public function getPublicPage(Request $request, SubscribePagePublicNormalizer $n
8787
required: true,
8888
content: new OA\JsonContent(ref: '#/components/schemas/PublicSubscriptionRequest')
8989
),
90-
tags: ['public'],
90+
tags: ['subscribe-pages'],
9191
parameters: [
9292
new OA\Parameter(
9393
name: 'pageId',
@@ -139,7 +139,10 @@ public function subscribe(Request $request, int $pageId): JsonResponse
139139
}
140140
);
141141

142-
$list = $this->entityManager->getRepository(SubscriberList::class)->find($subscriptionRequest->listId);
142+
$list = $this->subscriberListRepository->find($subscriptionRequest->listId);
143+
if ($list === null) {
144+
throw $this->createNotFoundException('Subscriber list does not exists.');
145+
}
143146
$subscriptions = $this->subscriptionManager->createSubscriptions(
144147
subscriberList: $list,
145148
emails: [$subscriptionRequest->email],

src/Subscription/Request/PublicSubscriptionRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class PublicSubscriptionRequest implements RequestInterface
5252
public ?string $email = null;
5353

5454
#[ListExistsPublic]
55+
#[Assert\NotNull]
5556
#[Assert\Type(type: 'integer')]
5657
public ?int $listId = null;
5758

src/Subscription/Serializer/SubscribePagePublicNormalizer.php

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,65 @@
1414
#[OA\Schema(
1515
schema: 'SubscribePagePublic',
1616
properties: [
17-
new OA\Property(property: 'id', type: 'integer', example: 1),
18-
new OA\Property(property: 'title', type: 'string', example: 'Subscribe to our newsletter'),
17+
new OA\Property(
18+
property: 'id',
19+
type: 'integer',
20+
example: 1
21+
),
22+
new OA\Property(
23+
property: 'title',
24+
type: 'string',
25+
example: 'Subscribe to our newsletter'
26+
),
1927
new OA\Property(
2028
property: 'data',
21-
type: 'array',
22-
items: new OA\Items(
23-
type: 'object',
24-
additionalProperties: new OA\AdditionalProperties(
25-
type: 'string'
26-
)
29+
properties: [
30+
new OA\Property(
31+
property: 'attributes',
32+
type: 'array',
33+
items: new OA\Items(
34+
properties: [
35+
new OA\Property(property: 'id', type: 'integer'),
36+
new OA\Property(property: 'name', type: 'string'),
37+
new OA\Property(property: 'type', type: 'string'),
38+
new OA\Property(property: 'required', type: 'boolean'),
39+
new OA\Property(property: 'default_value', type: 'string', nullable: true),
40+
new OA\Property(property: 'list_order', type: 'integer'),
41+
new OA\Property(
42+
property: 'options',
43+
type: 'array',
44+
items: new OA\Items(type: 'object')
45+
),
46+
],
47+
type: 'object'
48+
)
49+
),
50+
new OA\Property(
51+
property: 'lists',
52+
type: 'array',
53+
items: new OA\Items(
54+
properties: [
55+
new OA\Property(property: 'id', type: 'integer'),
56+
new OA\Property(property: 'name', type: 'string'),
57+
new OA\Property(property: 'description', type: 'string', nullable: true),
58+
new OA\Property(property: 'list_position', type: 'integer'),
59+
],
60+
type: 'object'
61+
)
62+
),
63+
],
64+
type: 'object',
65+
additionalProperties: new OA\AdditionalProperties(
66+
oneOf: [
67+
new OA\Schema(type: 'string'),
68+
new OA\Schema(type: 'integer'),
69+
new OA\Schema(type: 'boolean'),
70+
new OA\Schema(type: 'array', items: new OA\Items(type: 'object')),
71+
new OA\Schema(type: 'object'),
72+
]
2773
)
2874
),
29-
],
75+
]
3076
)]
3177
class SubscribePagePublicNormalizer implements NormalizerInterface
3278
{
@@ -53,7 +99,8 @@ public function normalize($object, string $format = null, array $context = []):
5399
function (array $carry, SubscribePageData $data) {
54100
$value = $data->getData();
55101
if ($data->getName() === 'attributes') {
56-
$ids = array_filter(explode('+', $data->getData()));
102+
$attributeIds = str_replace('+', ',', $data->getData());
103+
$ids = array_filter(explode(',', $attributeIds));
57104
$value = $this->getAttributeDefinitions($ids);
58105
}
59106
if ($data->getName() === 'lists') {

tests/Integration/Subscription/Controller/SubscribePageControllerTest.php

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,11 @@
44

55
namespace PhpList\RestBundle\Tests\Integration\Subscription\Controller;
66

7-
use PhpList\Core\Domain\Subscription\Model\Subscriber;
8-
use PhpList\Core\Domain\Subscription\Model\SubscriberAttributeDefinition;
9-
use PhpList\Core\Domain\Subscription\Model\SubscriberAttributeValue;
107
use PhpList\RestBundle\Subscription\Controller\SubscribePageController;
118
use PhpList\RestBundle\Tests\Integration\Common\AbstractTestController;
129
use PhpList\RestBundle\Tests\Integration\Identity\Fixtures\AdministratorFixture;
1310
use PhpList\RestBundle\Tests\Integration\Identity\Fixtures\AdministratorTokenFixture;
1411
use PhpList\RestBundle\Tests\Integration\Subscription\Fixtures\SubscribePageFixture;
15-
use PhpList\RestBundle\Tests\Integration\Subscription\Fixtures\SubscriberAttributeDefinitionFixture;
16-
use PhpList\RestBundle\Tests\Integration\Subscription\Fixtures\SubscriberListFixture;
1712

1813
class SubscribePageControllerTest extends AbstractTestController
1914
{
@@ -80,7 +75,7 @@ public function testCreateSubscribePageWithoutSessionReturnsForbidden(): void
8075
],
8176
], JSON_THROW_ON_ERROR);
8277

83-
$this->jsonRequest('POST', '/api/v2/subscribe-pages', content: $payload);
78+
$this->jsonRequest('POST', '/api/v2/subscribe-pages/', content: $payload);
8479

8580
$this->assertHttpForbidden();
8681
}
@@ -96,7 +91,7 @@ public function testCreateSubscribePageWithSessionCreatesPage(): void
9691
],
9792
], JSON_THROW_ON_ERROR);
9893

99-
$this->authenticatedJsonRequest('POST', '/api/v2/subscribe-pages', content: $payload);
94+
$this->authenticatedJsonRequest('POST', '/api/v2/subscribe-pages/', content: $payload);
10095

10196
$this->assertHttpCreated();
10297
$data = $this->getDecodedJsonResponseContent();
@@ -143,7 +138,7 @@ public function testCreateSubscribePageWithDataMissingValueReturnsUnprocessableE
143138
],
144139
], JSON_THROW_ON_ERROR);
145140

146-
$this->authenticatedJsonRequest('POST', '/api/v2/subscribe-pages', content: $payload);
141+
$this->authenticatedJsonRequest('POST', '/api/v2/subscribe-pages/', content: $payload);
147142
$this->assertHttpUnprocessableEntity();
148143
}
149144

@@ -221,44 +216,4 @@ public function testDeleteSubscribePageWithSessionNotFound(): void
221216
$this->authenticatedJsonRequest('DELETE', '/api/v2/subscribe-pages/9999');
222217
$this->assertHttpNotFound();
223218
}
224-
225-
public function testPublicSubscribeCreatesSubscriptionAndAttributes(): void
226-
{
227-
$this->loadFixtures([
228-
AdministratorFixture::class,
229-
SubscribePageFixture::class,
230-
SubscriberListFixture::class,
231-
SubscriberAttributeDefinitionFixture::class,
232-
]);
233-
234-
$payload = json_encode([
235-
'email' => 'public@example.com',
236-
'confirmEmail' => 'public@example.com',
237-
'attributes' => [
238-
'Country' => 'Armenia',
239-
],
240-
]);
241-
242-
$this->jsonRequest('POST', '/api/v2/subscribe-pages/1/lists/1/subscribers', [], [], [], $payload);
243-
$this->assertHttpCreated();
244-
245-
$response = $this->getDecodedJsonResponseContent();
246-
self::assertSame('public@example.com', $response[0]['subscriber']['email'] ?? null);
247-
248-
$subscriber = $this->entityManager?->getRepository(Subscriber::class)
249-
->findOneBy(['email' => 'public@example.com']);
250-
self::assertInstanceOf(Subscriber::class, $subscriber);
251-
252-
$definition = $this->entityManager?->getRepository(SubscriberAttributeDefinition::class)
253-
->findOneBy(['name' => 'Country']);
254-
self::assertInstanceOf(SubscriberAttributeDefinition::class, $definition);
255-
256-
$value = $this->entityManager?->getRepository(SubscriberAttributeValue::class)
257-
->findOneBy([
258-
'subscriber' => $subscriber,
259-
'attributeDefinition' => $definition,
260-
]);
261-
self::assertInstanceOf(SubscriberAttributeValue::class, $value);
262-
self::assertSame('Armenia', $value->getValue());
263-
}
264219
}

0 commit comments

Comments
 (0)