Skip to content

Commit 68465fc

Browse files
committed
ISSUE-345: add tests
1 parent 6212beb commit 68465fc

13 files changed

+709
-6
lines changed

src/Controller/TemplateController.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ public function createTemplates(Request $request): JsonResponse
237237
/** @var CreateTemplateRequest $createTemplateRequest */
238238
$createTemplateRequest = $this->validator->validate($request, CreateTemplateRequest::class);
239239

240-
return new JsonResponse($this->templateManager->create($createTemplateRequest), Response::HTTP_CREATED);
240+
return new JsonResponse(
241+
$this->normalizer->normalize($this->templateManager->create($createTemplateRequest)),
242+
Response::HTTP_CREATED
243+
);
241244
}
242245
}

src/Entity/Request/CreateTemplateRequest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Symfony\Component\HttpFoundation\File\UploadedFile;
99
use Symfony\Component\Validator\Constraints as Assert;
1010

11-
class CreateTemplateRequest
11+
class CreateTemplateRequest implements RequestInterface
1212
{
1313
#[Assert\NotBlank]
1414
#[Assert\NotNull]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Controller;
6+
7+
use PhpList\Core\Domain\Model\Identity\Administrator;
8+
use PhpList\Core\Domain\Model\Messaging\Template;
9+
use PhpList\Core\Domain\Repository\Messaging\TemplateRepository;
10+
use PhpList\Core\Security\Authentication;
11+
use PhpList\RestBundle\Controller\TemplateController;
12+
use PhpList\RestBundle\Entity\Request\CreateTemplateRequest;
13+
use PhpList\RestBundle\Serializer\TemplateNormalizer;
14+
use PhpList\RestBundle\Service\Manager\TemplateManager;
15+
use PhpList\RestBundle\Validator\RequestValidator;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
use PHPUnit\Framework\TestCase;
18+
use Symfony\Component\HttpFoundation\Request;
19+
20+
class TemplateControllerTest extends TestCase
21+
{
22+
private TemplateRepository&MockObject $templateRepository;
23+
private TemplateNormalizer&MockObject $normalizer;
24+
private RequestValidator&MockObject $validator;
25+
private TemplateManager&MockObject $templateManager;
26+
private TemplateController $controller;
27+
28+
protected function setUp(): void
29+
{
30+
$authentication = $this->createMock(Authentication::class);
31+
$authentication->method('authenticateByApiKey')->willReturn(new Administrator());
32+
$this->templateRepository = $this->createMock(TemplateRepository::class);
33+
$this->normalizer = $this->createMock(TemplateNormalizer::class);
34+
$this->validator = $this->createMock(RequestValidator::class);
35+
$this->templateManager = $this->createMock(TemplateManager::class);
36+
37+
$this->controller = new TemplateController(
38+
$authentication,
39+
$this->templateRepository,
40+
$this->normalizer,
41+
$this->validator,
42+
$this->templateManager
43+
);
44+
}
45+
46+
public function testGetTemplatesReturnsTemplates(): void
47+
{
48+
$request = $this->createMock(Request::class);
49+
50+
$template = $this->createMock(Template::class);
51+
52+
$this->templateRepository->expects($this->once())
53+
->method('findAll')
54+
->willReturn([$template]);
55+
56+
$this->normalizer->expects($this->once())
57+
->method('normalize')
58+
->with($template)
59+
->willReturn(['id' => 1, 'title' => 'Test Template']);
60+
61+
$response = $this->controller->getTemplates($request);
62+
63+
$this->assertSame(200, $response->getStatusCode());
64+
65+
$data = json_decode($response->getContent(), true);
66+
$this->assertEquals([['id' => 1, 'title' => 'Test Template']], $data);
67+
}
68+
69+
public function testGetTemplateReturnsSingleTemplate(): void
70+
{
71+
$request = $this->createMock(Request::class);
72+
73+
$template = $this->createMock(Template::class);
74+
75+
$this->normalizer->expects($this->once())
76+
->method('normalize')
77+
->with($template)
78+
->willReturn(['id' => 1, 'title' => 'Single Template']);
79+
80+
$response = $this->controller->getTemplate($request, $template);
81+
82+
$this->assertSame(200, $response->getStatusCode());
83+
84+
$data = json_decode($response->getContent(), true);
85+
$this->assertEquals(['id' => 1, 'title' => 'Single Template'], $data);
86+
}
87+
88+
public function testCreateTemplateReturnsCreatedTemplate(): void
89+
{
90+
$request = $this->createMock(Request::class);
91+
92+
$createTemplateRequest = $this->createMock(CreateTemplateRequest::class);
93+
94+
$this->validator->expects($this->once())
95+
->method('validate')
96+
->with($request, CreateTemplateRequest::class)
97+
->willReturn($createTemplateRequest);
98+
99+
$template = $this->createMock(Template::class);
100+
101+
$this->templateManager->expects($this->once())
102+
->method('create')
103+
->with($createTemplateRequest)
104+
->willReturn($template);
105+
106+
$this->normalizer->expects($this->once())
107+
->method('normalize')
108+
->with($template)
109+
->willReturn(['id' => 1, 'title' => 'Created Template']);
110+
111+
$response = $this->controller->createTemplates($request);
112+
113+
$this->assertSame(201, $response->getStatusCode());
114+
115+
$data = json_decode($response->getContent(), true);
116+
$this->assertEquals(['id' => 1, 'title' => 'Created Template'], $data);
117+
}
118+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Serializer;
6+
7+
use PhpList\Core\Domain\Model\Messaging\Template;
8+
use PhpList\Core\Domain\Model\Messaging\TemplateImage;
9+
use PhpList\RestBundle\Serializer\TemplateImageNormalizer;
10+
use PHPUnit\Framework\TestCase;
11+
12+
class TemplateImageNormalizerTest extends TestCase
13+
{
14+
private TemplateImageNormalizer $normalizer;
15+
16+
protected function setUp(): void
17+
{
18+
$this->normalizer = new TemplateImageNormalizer();
19+
}
20+
21+
public function testSupportsNormalizationOnlyForTemplateImage(): void
22+
{
23+
$this->assertTrue($this->normalizer->supportsNormalization($this->createMock(TemplateImage::class)));
24+
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
25+
}
26+
27+
public function testNormalizeTemplateImage(): void
28+
{
29+
$template = $this->createMock(Template::class);
30+
$template->method('getId')->willReturn(42);
31+
32+
$templateImage = $this->createMock(TemplateImage::class);
33+
$templateImage->method('getId')->willReturn(10);
34+
$templateImage->method('getTemplate')->willReturn($template);
35+
$templateImage->method('getMimeType')->willReturn('image/png');
36+
$templateImage->method('getFilename')->willReturn('test.png');
37+
$templateImage->method('getData')->willReturn('binary-data');
38+
$templateImage->method('getWidth')->willReturn(100);
39+
$templateImage->method('getHeight')->willReturn(200);
40+
41+
$normalized = $this->normalizer->normalize($templateImage);
42+
43+
$this->assertIsArray($normalized);
44+
$this->assertEquals([
45+
'id' => 10,
46+
'template_id' => 42,
47+
'mimetype' => 'image/png',
48+
'filename' => 'test.png',
49+
'data' => base64_encode('binary-data'),
50+
'width' => 100,
51+
'height' => 200,
52+
], $normalized);
53+
}
54+
55+
public function testNormalizeReturnsEmptyArrayForInvalidObject(): void
56+
{
57+
$normalized = $this->normalizer->normalize(new \stdClass());
58+
59+
$this->assertIsArray($normalized);
60+
$this->assertEmpty($normalized);
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Serializer;
6+
7+
use PhpList\Core\Domain\Model\Messaging\Template;
8+
use PhpList\Core\Domain\Model\Messaging\TemplateImage;
9+
use PhpList\RestBundle\Serializer\TemplateImageNormalizer;
10+
use PhpList\RestBundle\Serializer\TemplateNormalizer;
11+
use PHPUnit\Framework\MockObject\MockObject;
12+
use PHPUnit\Framework\TestCase;
13+
use Doctrine\Common\Collections\ArrayCollection;
14+
15+
class TemplateNormalizerTest extends TestCase
16+
{
17+
private TemplateImageNormalizer&MockObject $templateImageNormalizer;
18+
private TemplateNormalizer $normalizer;
19+
20+
protected function setUp(): void
21+
{
22+
$this->templateImageNormalizer = $this->createMock(TemplateImageNormalizer::class);
23+
$this->normalizer = new TemplateNormalizer($this->templateImageNormalizer);
24+
}
25+
26+
public function testSupportsNormalizationOnlyForTemplate(): void
27+
{
28+
$this->assertTrue($this->normalizer->supportsNormalization($this->createMock(Template::class)));
29+
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
30+
}
31+
32+
public function testNormalizeTemplateWithImages(): void
33+
{
34+
$template = $this->createMock(Template::class);
35+
$template->method('getId')->willReturn(1);
36+
$template->method('getTitle')->willReturn('Test Template');
37+
$template->method('getContent')->willReturn('<html>Content</html>');
38+
$template->method('getText')->willReturn('Plain text');
39+
$template->method('getListOrder')->willReturn(5);
40+
41+
$image = $this->createMock(TemplateImage::class);
42+
43+
$template->method('getImages')->willReturn(new ArrayCollection([$image]));
44+
45+
$this->templateImageNormalizer->expects($this->once())
46+
->method('normalize')
47+
->with($image)
48+
->willReturn([
49+
'id' => 100,
50+
'filename' => 'test.png'
51+
]);
52+
53+
$normalized = $this->normalizer->normalize($template);
54+
55+
$this->assertIsArray($normalized);
56+
$this->assertEquals([
57+
'id' => 1,
58+
'title' => 'Test Template',
59+
'content' => '<html>Content</html>',
60+
'text' => 'Plain text',
61+
'order' => 5,
62+
'images' => [
63+
[
64+
'id' => 100,
65+
'filename' => 'test.png'
66+
]
67+
]
68+
], $normalized);
69+
}
70+
71+
public function testNormalizeTemplateWithoutImages(): void
72+
{
73+
$template = $this->createMock(Template::class);
74+
$template->method('getId')->willReturn(2);
75+
$template->method('getTitle')->willReturn('Empty Template');
76+
$template->method('getContent')->willReturn('<html>No Images</html>');
77+
$template->method('getText')->willReturn('No images text');
78+
$template->method('getListOrder')->willReturn(0);
79+
80+
$template->method('getImages')->willReturn(new ArrayCollection([]));
81+
82+
$normalized = $this->normalizer->normalize($template);
83+
84+
$this->assertIsArray($normalized);
85+
$this->assertEquals([
86+
'id' => 2,
87+
'title' => 'Empty Template',
88+
'content' => '<html>No Images</html>',
89+
'text' => 'No images text',
90+
'order' => 0,
91+
'images' => null
92+
], $normalized);
93+
}
94+
95+
public function testNormalizeReturnsEmptyArrayForInvalidObject(): void
96+
{
97+
$normalized = $this->normalizer->normalize(new \stdClass());
98+
99+
$this->assertIsArray($normalized);
100+
$this->assertEmpty($normalized);
101+
}
102+
}

tests/Unit/Service/Builder/MessageBuilderTest.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@
2121
use PhpList\RestBundle\Service\Builder\MessageFormatBuilder;
2222
use PhpList\RestBundle\Service\Builder\MessageOptionsBuilder;
2323
use PhpList\RestBundle\Service\Builder\MessageScheduleBuilder;
24+
use PHPUnit\Framework\MockObject\MockObject;
2425
use PHPUnit\Framework\TestCase;
2526

2627
class MessageBuilderTest extends TestCase
2728
{
28-
private MessageFormatBuilder $formatBuilder;
29-
private MessageScheduleBuilder $scheduleBuilder;
30-
private MessageContentBuilder $contentBuilder;
31-
private MessageOptionsBuilder $optionsBuilder;
29+
private MessageFormatBuilder&MockObject $formatBuilder;
30+
private MessageScheduleBuilder&MockObject $scheduleBuilder;
31+
private MessageContentBuilder&MockObject $contentBuilder;
32+
private MessageOptionsBuilder&MockObject $optionsBuilder;
3233
private MessageBuilder $builder;
3334

3435
protected function setUp(): void
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Service\Builder;
6+
7+
use InvalidArgumentException;
8+
use PhpList\RestBundle\Entity\Request\Message\MessageContentRequest;
9+
use PhpList\RestBundle\Service\Builder\MessageContentBuilder;
10+
use PHPUnit\Framework\TestCase;
11+
12+
class MessageContentBuilderTest extends TestCase
13+
{
14+
private MessageContentBuilder $builder;
15+
16+
protected function setUp(): void
17+
{
18+
$this->builder = new MessageContentBuilder();
19+
}
20+
21+
public function testBuildsMessageContentSuccessfully(): void
22+
{
23+
$dto = new MessageContentRequest();
24+
$dto->subject = 'Test Subject';
25+
$dto->text = 'Full text content';
26+
$dto->textMessage = 'Short text version';
27+
$dto->footer = 'Footer text';
28+
29+
$messageContent = $this->builder->buildFromDto($dto);
30+
31+
$this->assertSame('Test Subject', $messageContent->getSubject());
32+
$this->assertSame('Full text content', $messageContent->getText());
33+
$this->assertSame('Short text version', $messageContent->getTextMessage());
34+
$this->assertSame('Footer text', $messageContent->getFooter());
35+
}
36+
37+
public function testThrowsExceptionOnInvalidDto(): void
38+
{
39+
$this->expectException(InvalidArgumentException::class);
40+
41+
$invalidDto = new \stdClass();
42+
$this->builder->buildFromDto($invalidDto);
43+
}
44+
}

0 commit comments

Comments
 (0)