Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 9601c11

Browse files
committedApr 26, 2025·
ISSUE-345: fix 404 + template controller test
1 parent ef86452 commit 9601c11

File tree

14 files changed

+302
-110
lines changed

14 files changed

+302
-110
lines changed
 

‎config/services/providers.yml

Lines changed: 0 additions & 9 deletions
This file was deleted.

‎src/Controller/CampaignController.php

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Symfony\Component\HttpFoundation\JsonResponse;
2020
use Symfony\Component\HttpFoundation\Request;
2121
use Symfony\Component\HttpFoundation\Response;
22+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2223
use Symfony\Component\Routing\Attribute\Route;
2324
use Symfony\Component\Serializer\SerializerInterface;
2425

@@ -32,20 +33,17 @@ class CampaignController extends AbstractController
3233
{
3334
use AuthenticationTrait;
3435

35-
private MessageProvider $messageProvider;
3636
private RequestValidator $validator;
3737
private MessageNormalizer $normalizer;
3838
private MessageManager $messageManager;
3939

4040
public function __construct(
4141
Authentication $authentication,
42-
MessageProvider $messageProvider,
4342
RequestValidator $validator,
4443
MessageNormalizer $normalizer,
4544
MessageManager $messageManager
4645
) {
4746
$this->authentication = $authentication;
48-
$this->messageProvider = $messageProvider;
4947
$this->validator = $validator;
5048
$this->normalizer = $normalizer;
5149
$this->messageManager = $messageManager;
@@ -87,7 +85,7 @@ public function __construct(
8785
public function getMessages(Request $request): JsonResponse
8886
{
8987
$authUer = $this->requireAuthentication($request);
90-
$data = $this->messageProvider->getMessagesByOwner($authUer);
88+
$data = $this->messageManager->getMessagesByOwner($authUer);
9189

9290
$normalized = array_map(function ($item) {
9391
return $this->normalizer->normalize($item);
@@ -135,10 +133,14 @@ public function getMessages(Request $request): JsonResponse
135133
)]
136134
public function getMessage(
137135
Request $request,
138-
#[MapEntity(mapping: ['messageId' => 'id'])] Message $message
136+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null
139137
): JsonResponse {
140138
$this->requireAuthentication($request);
141139

140+
if (!$message) {
141+
throw new NotFoundHttpException('Campaign not found.');
142+
}
143+
142144
return new JsonResponse($this->normalizer->normalize($message), Response::HTTP_OK);
143145
}
144146

@@ -263,11 +265,15 @@ public function createMessage(Request $request, MessageNormalizer $normalizer):
263265
)]
264266
public function updateMessage(
265267
Request $request,
266-
#[MapEntity(mapping: ['messageId' => 'id'])] Message $message,
267268
SerializerInterface $serializer,
269+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null,
268270
): JsonResponse {
269271
$authUser = $this->requireAuthentication($request);
270272

273+
if (!$message) {
274+
throw new NotFoundHttpException('Campaign not found.');
275+
}
276+
271277
/** @return UpdateMessageRequest $updateMessageRequest */
272278
$updateMessageRequest = $serializer->deserialize($request->getContent(), UpdateMessageRequest::class, 'json');
273279
$updateMessageRequest->messageId = $message->getId();
@@ -325,10 +331,14 @@ public function updateMessage(
325331
)]
326332
public function deleteMessage(
327333
Request $request,
328-
#[MapEntity(mapping: ['messageId' => 'id'])] Message $message
334+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null
329335
): JsonResponse {
330336
$this->requireAuthentication($request);
331337

338+
if (!$message) {
339+
throw new NotFoundHttpException('Campaign not found.');
340+
}
341+
332342
$this->messageManager->delete($message);
333343

334344
return new JsonResponse(null, Response::HTTP_NO_CONTENT);

‎src/Controller/ListController.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\HttpFoundation\JsonResponse;
1818
use Symfony\Component\HttpFoundation\Request;
1919
use Symfony\Component\HttpFoundation\Response;
20+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2021
use Symfony\Component\Routing\Attribute\Route;
2122

2223
/**
@@ -176,10 +177,14 @@ public function getLists(Request $request): JsonResponse
176177
)]
177178
public function getList(
178179
Request $request,
179-
#[MapEntity(mapping: ['listId' => 'id'])] SubscriberList $list
180+
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null
180181
): JsonResponse {
181182
$this->requireAuthentication($request);
182183

184+
if (!$list) {
185+
throw new NotFoundHttpException('Subscriber list not found.');
186+
}
187+
183188
return new JsonResponse($this->normalizer->normalize($list), Response::HTTP_OK);
184189
}
185190

@@ -224,10 +229,14 @@ public function getList(
224229
)]
225230
public function deleteList(
226231
Request $request,
227-
#[MapEntity(mapping: ['listId' => 'id'])] SubscriberList $list
232+
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null
228233
): JsonResponse {
229234
$this->requireAuthentication($request);
230235

236+
if (!$list) {
237+
throw new NotFoundHttpException('Subscriber list not found.');
238+
}
239+
231240
$this->subscriberListManager->delete($list);
232241

233242
return new JsonResponse(null, Response::HTTP_NO_CONTENT);

‎src/Controller/SessionController.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\HttpFoundation\Request;
1919
use Symfony\Component\HttpFoundation\Response;
2020
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
21+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2122
use Symfony\Component\Routing\Attribute\Route;
2223

2324
/**
@@ -104,6 +105,7 @@ public function createSession(
104105
* This action may only be called for sessions that are owned by the authenticated administrator.
105106
*
106107
* @throws AccessDeniedHttpException
108+
* @throws NotFoundHttpException
107109
*/
108110
#[Route('/{sessionId}', name: 'delete_session', methods: ['DELETE'])]
109111
#[OA\Delete(
@@ -133,23 +135,19 @@ public function createSession(
133135
new OA\Response(
134136
response: 404,
135137
description: 'Failure',
136-
content: new OA\JsonContent(
137-
properties: [
138-
new OA\Property(
139-
property: 'message',
140-
type: 'string',
141-
example: 'There is no session with that ID.'
142-
)
143-
]
144-
)
138+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
145139
)
146140
]
147141
)]
148142
public function deleteSession(
149143
Request $request,
150-
#[MapEntity(mapping: ['sessionId' => 'id'])] AdministratorToken $token
144+
#[MapEntity(mapping: ['sessionId' => 'id'])] ?AdministratorToken $token = null
151145
): JsonResponse {
152146
$administrator = $this->requireAuthentication($request);
147+
148+
if (!$token) {
149+
throw new NotFoundHttpException('Token not found.');
150+
}
153151
if ($token->getAdministrator() !== $administrator) {
154152
throw new AccessDeniedHttpException('You do not have access to this session.', null, 1519831644);
155153
}

‎src/Controller/SubscriberController.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\HttpFoundation\JsonResponse;
1919
use Symfony\Component\HttpFoundation\Request;
2020
use Symfony\Component\HttpFoundation\Response;
21+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2122
use Symfony\Component\Routing\Attribute\Route;
2223
use Symfony\Component\Serializer\SerializerInterface;
2324

@@ -164,19 +165,24 @@ public function createSubscriber(
164165
),
165166
new OA\Response(
166167
response: 404,
167-
description: 'Not Found',
168+
description: 'Failure',
169+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
168170
)
169171
]
170172
)]
171173
public function updateSubscriber(
172174
Request $request,
173-
#[MapEntity(mapping: ['subscriberId' => 'id'])] Subscriber $subscriber,
174175
SerializerInterface $serializer,
175176
RequestValidator $validator,
176177
SubscriberNormalizer $subscriberNormalizer,
178+
#[MapEntity(mapping: ['subscriberId' => 'id'])] ?Subscriber $subscriber = null,
177179
): JsonResponse {
178180
$this->requireAuthentication($request);
179181

182+
if (!$subscriber) {
183+
throw new NotFoundHttpException('Subscriber not found.');
184+
}
185+
180186
/** @var UpdateSubscriberRequest $dto */
181187
$dto = $serializer->deserialize($request->getContent(), UpdateSubscriberRequest::class, 'json');
182188
$dto->subscriberId = $subscriber->getId();
@@ -221,7 +227,8 @@ public function updateSubscriber(
221227
),
222228
new OA\Response(
223229
response: 404,
224-
description: 'Not Found',
230+
description: 'Failure',
231+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
225232
)
226233
]
227234
)]
@@ -268,16 +275,20 @@ public function getSubscriber(Request $request, int $subscriberId, SubscriberNor
268275
),
269276
new OA\Response(
270277
response: 404,
271-
description: 'Not Found',
278+
description: 'Failure',
279+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
272280
)
273281
]
274282
)]
275283
public function deleteSubscriber(
276284
Request $request,
277-
#[MapEntity(mapping: ['subscriberId' => 'id'])] Subscriber $subscriber,
285+
#[MapEntity(mapping: ['subscriberId' => 'id'])] ?Subscriber $subscriber = null,
278286
): JsonResponse {
279287
$this->requireAuthentication($request);
280288

289+
if (!$subscriber) {
290+
throw new NotFoundHttpException('Subscriber not found.');
291+
}
281292
$this->subscriberManager->deleteSubscriber($subscriber);
282293

283294
return new JsonResponse(null, Response::HTTP_NO_CONTENT);

‎src/Controller/SubscriptionController.php

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\HttpFoundation\JsonResponse;
1919
use Symfony\Component\HttpFoundation\Request;
2020
use Symfony\Component\HttpFoundation\Response;
21+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2122
use Symfony\Component\Routing\Attribute\Route;
2223

2324
/**
@@ -78,16 +79,25 @@ public function __construct(
7879
response: 403,
7980
description: 'Failure',
8081
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
82+
),
83+
new OA\Response(
84+
response: 404,
85+
description: 'Failure',
86+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
8187
)
8288
]
8389
)]
8490
public function getListMembers(
8591
Request $request,
86-
#[MapEntity(mapping: ['listId' => 'id'])] SubscriberList $list,
87-
SubscriberNormalizer $normalizer
92+
SubscriberNormalizer $normalizer,
93+
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null,
8894
): JsonResponse {
8995
$this->requireAuthentication($request);
9096

97+
if (!$list) {
98+
throw new NotFoundHttpException('Subscriber list not found.');
99+
}
100+
91101
$subscribers = $this->subscriptionManager->getSubscriberListMembers($list);
92102
$normalized = array_map(function ($item) use ($normalizer) {
93103
return $normalizer->normalize($item);
@@ -142,10 +152,14 @@ public function getListMembers(
142152
)]
143153
public function getSubscribersCount(
144154
Request $request,
145-
#[MapEntity(mapping: ['listId' => 'id'])] SubscriberList $list
155+
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null,
146156
): JsonResponse {
147157
$this->requireAuthentication($request);
148158

159+
if (!$list) {
160+
throw new NotFoundHttpException('Subscriber list not found.');
161+
}
162+
149163
return new JsonResponse(['subscribers_count' => count($list->getSubscribers())], Response::HTTP_OK);
150164
}
151165

@@ -195,15 +209,20 @@ public function getSubscribersCount(
195209
items: new OA\Items(ref: '#/components/schemas/Subscription')
196210
)
197211
),
212+
new OA\Response(
213+
response: 400,
214+
description: 'Failure',
215+
content: new OA\JsonContent(ref: '#/components/schemas/BadRequestResponse')
216+
),
198217
new OA\Response(
199218
response: 403,
200219
description: 'Failure',
201220
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
202221
),
203222
new OA\Response(
204-
response: 400,
223+
response: 404,
205224
description: 'Failure',
206-
content: new OA\JsonContent(ref: '#/components/schemas/BadRequestResponse')
225+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
207226
),
208227
new OA\Response(
209228
response: 409,
@@ -219,11 +238,15 @@ public function getSubscribersCount(
219238
)]
220239
public function createSubscription(
221240
Request $request,
222-
#[MapEntity(mapping: ['listId' => 'id'])] SubscriberList $list,
223-
SubscriptionNormalizer $serializer
241+
SubscriptionNormalizer $serializer,
242+
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null,
224243
): JsonResponse {
225244
$this->requireAuthentication($request);
226245

246+
if (!$list) {
247+
throw new NotFoundHttpException('Subscriber list not found.');
248+
}
249+
227250
/** @var SubscriptionRequest $subscriptionRequest */
228251
$subscriptionRequest = $this->validator->validate($request, SubscriptionRequest::class);
229252
$subscriptions = $this->subscriptionManager->createSubscriptions($list, $subscriptionRequest->emails);
@@ -276,15 +299,19 @@ public function createSubscription(
276299
),
277300
new OA\Response(
278301
response: 404,
279-
description: 'Subscriber or subscription not found.'
302+
description: 'Failure',
303+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
280304
)
281305
]
282306
)]
283307
public function deleteSubscriptions(
284308
Request $request,
285-
#[MapEntity(mapping: ['listId' => 'id'])] SubscriberList $list,
309+
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null,
286310
): JsonResponse {
287311
$this->requireAuthentication($request);
312+
if (!$list) {
313+
throw new NotFoundHttpException('Subscriber list not found.');
314+
}
288315
$subscriptionRequest = new SubscriptionRequest();
289316
$subscriptionRequest->emails = $request->query->all('emails');
290317

‎src/Controller/TemplateController.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\HttpFoundation\JsonResponse;
1919
use Symfony\Component\HttpFoundation\Request;
2020
use Symfony\Component\HttpFoundation\Response;
21+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2122
use Symfony\Component\Routing\Attribute\Route;
2223

2324
/**
@@ -128,15 +129,24 @@ public function getTemplates(Request $request): JsonResponse
128129
response: 403,
129130
description: 'Failure',
130131
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
132+
),
133+
new OA\Response(
134+
response: 404,
135+
description: 'Failure',
136+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
131137
)
132138
]
133139
)]
134140
public function getTemplate(
135141
Request $request,
136-
#[MapEntity(mapping: ['templateId' => 'id'])] Template $template
142+
#[MapEntity(mapping: ['templateId' => 'id'])] ?Template $template = null,
137143
): JsonResponse {
138144
$this->requireAuthentication($request);
139145

146+
if (!$template) {
147+
throw $this->createNotFoundException('Template not found.');
148+
}
149+
140150
return new JsonResponse($this->normalizer->normalize($template), Response::HTTP_OK);
141151
}
142152

@@ -245,7 +255,7 @@ public function createTemplates(Request $request): JsonResponse
245255

246256
#[Route('/{templateId}', name: 'delete_template', methods: ['DELETE'])]
247257
#[OA\Delete(
248-
path: 'templates/{templateId}',
258+
path: '/templates/{templateId}',
249259
description: 'Deletes template by id.',
250260
summary: 'Deletes a template.',
251261
tags: ['templates'],
@@ -284,10 +294,14 @@ public function createTemplates(Request $request): JsonResponse
284294
)]
285295
public function delete(
286296
Request $request,
287-
#[MapEntity(mapping: ['templateId' => 'id'])] Template $template
297+
#[MapEntity(mapping: ['templateId' => 'id'])] ?Template $template = null,
288298
): JsonResponse {
289299
$this->requireAuthentication($request);
290300

301+
if (!$template) {
302+
throw new NotFoundHttpException('Template not found.');
303+
}
304+
291305
$this->templateManager->delete($template);
292306

293307
return new JsonResponse(null, Response::HTTP_NO_CONTENT);

‎src/Service/Manager/MessageManager.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,10 @@ public function delete(Message $message): void
4848
{
4949
$this->messageRepository->remove($message);
5050
}
51+
52+
/** @return Message[] */
53+
public function getMessagesByOwner(Administrator $owner): array
54+
{
55+
return $this->messageRepository->getByOwnerId($owner->getId());
56+
}
5157
}

‎src/Service/Provider/MessageProvider.php

Lines changed: 0 additions & 26 deletions
This file was deleted.

‎tests/Integration/Controller/CampaignControllerTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,12 @@ public function testGetCampaignWithInvalidIdReturnsNotFound(): void
7878
$this->authenticatedJsonRequest('GET', '/api/v2/campaigns/999');
7979
$this->assertHttpNotFound();
8080
}
81+
82+
public function testDeleteCampaignReturnsNoContent(): void
83+
{
84+
$this->loadFixtures([AdministratorFixture::class, MessageFixture::class]);
85+
86+
$this->authenticatedJsonRequest('DELETE', '/api/v2/campaigns/1');
87+
$this->assertHttpNoContent();
88+
}
8189
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,title,template,template_text,listorder
2+
1,Newsletter Template,<html><body><h1>Welcome</h1></body></html>,,1
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Messaging;
4+
5+
use Doctrine\Bundle\FixturesBundle\Fixture;
6+
use Doctrine\Persistence\ObjectManager;
7+
use PhpList\Core\Domain\Model\Messaging\Template;
8+
use PhpList\Core\TestingSupport\Traits\ModelTestTrait;
9+
use RuntimeException;
10+
11+
class TemplateFixture extends Fixture
12+
{
13+
use ModelTestTrait;
14+
15+
public function load(ObjectManager $manager): void
16+
{
17+
$csvFile = __DIR__ . '/Template.csv';
18+
19+
if (!file_exists($csvFile)) {
20+
throw new RuntimeException(sprintf('Fixture file "%s" not found.', $csvFile));
21+
}
22+
23+
$handle = fopen($csvFile, 'r');
24+
if ($handle === false) {
25+
throw new RuntimeException(sprintf('Could not open fixture file "%s".', $csvFile));
26+
}
27+
28+
$headers = fgetcsv($handle);
29+
30+
do {
31+
$data = fgetcsv($handle);
32+
if ($data === false) {
33+
break;
34+
}
35+
$row = array_combine($headers, $data);
36+
37+
$template = new Template($row['title']);
38+
$template->setContent($row['template']);
39+
$template->setText($row['template_text']);
40+
$template->setListOrder((int)$row['listorder']);
41+
42+
$this->setSubjectId($template, (int)$row['id']);
43+
$manager->persist($template);
44+
} while (true);
45+
46+
fclose($handle);
47+
}
48+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Integration\Controller;
6+
7+
use PhpList\Core\Domain\Repository\Messaging\TemplateRepository;
8+
use PhpList\RestBundle\Controller\TemplateController;
9+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Identity\AdministratorFixture;
10+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Identity\AdministratorTokenFixture;
11+
use PhpList\RestBundle\Tests\Integration\Controller\Fixtures\Messaging\TemplateFixture;
12+
13+
class TemplateControllerTest extends AbstractTestController
14+
{
15+
public function testControllerIsAvailableViaContainer(): void
16+
{
17+
self::assertInstanceOf(TemplateController::class, self::getContainer()->get(TemplateController::class));
18+
}
19+
20+
public function testGetTemplatesWithoutSessionKeyReturnsForbidden(): void
21+
{
22+
self::getClient()->request('GET', '/api/v2/templates');
23+
$this->assertHttpForbidden();
24+
}
25+
26+
public function testGetTemplatesWithExpiredSessionKeyReturnsForbidden(): void
27+
{
28+
$this->loadFixtures([AdministratorFixture::class, AdministratorTokenFixture::class]);
29+
30+
self::getClient()->request(
31+
'GET',
32+
'/api/v2/templates',
33+
[],
34+
[],
35+
['PHP_AUTH_USER' => 'unused', 'PHP_AUTH_PW' => 'expiredtoken']
36+
);
37+
38+
$this->assertHttpForbidden();
39+
}
40+
41+
public function testGetTemplatesWithValidSessionKeyReturnsOkay(): void
42+
{
43+
$this->authenticatedJsonRequest('GET', '/api/v2/templates');
44+
$this->assertHttpOkay();
45+
}
46+
47+
public function testGetTemplatesReturnsTemplateData(): void
48+
{
49+
$this->loadFixtures([TemplateFixture::class]);
50+
51+
$this->authenticatedJsonRequest('GET', '/api/v2/templates');
52+
$response = $this->getDecodedJsonResponseContent();
53+
54+
self::assertIsArray($response);
55+
self::assertArrayHasKey('id', $response[0]);
56+
self::assertArrayHasKey('title', $response[0]);
57+
}
58+
59+
public function testGetTemplateWithoutSessionKeyReturnsForbidden(): void
60+
{
61+
$this->loadFixtures([TemplateFixture::class]);
62+
63+
self::getClient()->request('GET', '/api/v2/templates/1');
64+
$this->assertHttpForbidden();
65+
}
66+
67+
public function testGetTemplateWithValidSessionKeyReturnsOkay(): void
68+
{
69+
$this->loadFixtures([TemplateFixture::class]);
70+
71+
$this->authenticatedJsonRequest('GET', '/api/v2/templates/1');
72+
$this->assertHttpOkay();
73+
}
74+
75+
public function testGetTemplateWithInvalidIdReturnsNotFound(): void
76+
{
77+
$this->authenticatedJsonRequest('GET', '/api/v2/templates/999');
78+
$this->assertHttpNotFound();
79+
}
80+
81+
public function testCreateTemplateWithValidDataReturnsCreated(): void
82+
{
83+
$this->loadFixtures([AdministratorFixture::class, AdministratorTokenFixture::class]);
84+
85+
$payload = json_encode([
86+
'title' => 'New Template',
87+
'content' => '<html><body>[CONTENT]</body></html>',
88+
'text' => '[CONTENT]',
89+
'check_links' => true,
90+
'check_images' => false,
91+
'check_external_images' => false,
92+
]);
93+
94+
$this->authenticatedJsonRequest('POST', '/api/v2/templates', [], [], [], $payload);
95+
$this->assertHttpCreated();
96+
}
97+
98+
public function testCreateTemplateMissingTitleReturnsValidationError(): void
99+
{
100+
$this->loadFixtures([AdministratorFixture::class, AdministratorTokenFixture::class]);
101+
102+
$payload = json_encode([
103+
'content' => '<html><body>[CONTENT]</body></html>',
104+
]);
105+
106+
$this->authenticatedJsonRequest('POST', '/api/v2/templates', [], [], [], $payload);
107+
$this->assertHttpUnprocessableEntity();
108+
}
109+
110+
public function testDeleteTemplateWithValidSessionKeyReturnsNoContent(): void
111+
{
112+
$this->loadFixtures([TemplateFixture::class]);
113+
114+
$this->authenticatedJsonRequest('DELETE', '/api/v2/templates/1');
115+
$this->assertHttpNoContent();
116+
}
117+
118+
public function testDeleteTemplateWithInvalidIdReturnsNotFound(): void
119+
{
120+
$this->authenticatedJsonRequest('DELETE', '/api/v2/templates/999');
121+
$this->assertHttpNotFound();
122+
}
123+
124+
public function testDeleteTemplateActuallyDeletes(): void
125+
{
126+
$this->loadFixtures([TemplateFixture::class]);
127+
128+
$this->authenticatedJsonRequest('DELETE', '/api/v2/templates/1');
129+
130+
$templateRepository = self::getContainer()->get(TemplateRepository::class);
131+
self::assertNull($templateRepository->find(1));
132+
}
133+
}

‎tests/Unit/Service/Provider/MessageProviderTest.php

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.