Skip to content

Commit 57df92e

Browse files
committed
ISSUE-345: add tests
1 parent 8f5bdd3 commit 57df92e

File tree

2 files changed

+209
-0
lines changed

2 files changed

+209
-0
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Service\Builder;
6+
7+
use InvalidArgumentException;
8+
use PhpList\Core\Domain\Model\Identity\Administrator;
9+
use PhpList\Core\Domain\Model\Messaging\Message;
10+
use PhpList\Core\Domain\Repository\Messaging\TemplateRepository;
11+
use PhpList\RestBundle\Entity\Dto\MessageContext;
12+
use PhpList\RestBundle\Entity\Request\CreateMessageRequest;
13+
use PhpList\RestBundle\Entity\Request\Message\MessageContentRequest;
14+
use PhpList\RestBundle\Entity\Request\Message\MessageFormatRequest;
15+
use PhpList\RestBundle\Entity\Request\Message\MessageMetadataRequest;
16+
use PhpList\RestBundle\Entity\Request\Message\MessageOptionsRequest;
17+
use PhpList\RestBundle\Entity\Request\Message\MessageScheduleRequest;
18+
use PhpList\RestBundle\Entity\Request\RequestInterface;
19+
use PhpList\RestBundle\Service\Builder\MessageBuilder;
20+
use PhpList\RestBundle\Service\Builder\MessageContentBuilder;
21+
use PhpList\RestBundle\Service\Builder\MessageFormatBuilder;
22+
use PhpList\RestBundle\Service\Builder\MessageOptionsBuilder;
23+
use PhpList\RestBundle\Service\Builder\MessageScheduleBuilder;
24+
use PHPUnit\Framework\TestCase;
25+
26+
class MessageBuilderTest extends TestCase
27+
{
28+
private MessageFormatBuilder $formatBuilder;
29+
private MessageScheduleBuilder $scheduleBuilder;
30+
private MessageContentBuilder $contentBuilder;
31+
private MessageOptionsBuilder $optionsBuilder;
32+
private MessageBuilder $builder;
33+
34+
protected function setUp(): void
35+
{
36+
$templateRepository = $this->createMock(TemplateRepository::class);
37+
$this->formatBuilder = $this->createMock(MessageFormatBuilder::class);
38+
$this->scheduleBuilder = $this->createMock(MessageScheduleBuilder::class);
39+
$this->contentBuilder = $this->createMock(MessageContentBuilder::class);
40+
$this->optionsBuilder = $this->createMock(MessageOptionsBuilder::class);
41+
42+
$this->builder = new MessageBuilder(
43+
$templateRepository,
44+
$this->formatBuilder,
45+
$this->scheduleBuilder,
46+
$this->contentBuilder,
47+
$this->optionsBuilder
48+
);
49+
}
50+
51+
private function createRequest(): CreateMessageRequest
52+
{
53+
$request = new CreateMessageRequest();
54+
$request->format = new MessageFormatRequest();
55+
$request->schedule = new MessageScheduleRequest();
56+
$request->content = new MessageContentRequest();
57+
$request->metadata = new MessageMetadataRequest();
58+
$request->metadata->status = 'draft';
59+
$request->options = new MessageOptionsRequest();
60+
$request->templateId = 0;
61+
62+
return $request;
63+
}
64+
65+
private function mockBuildFromDtoCalls(CreateMessageRequest $request): void
66+
{
67+
$this->formatBuilder->expects($this->once())
68+
->method('buildFromDto')
69+
->with($request->format)
70+
->willReturn($this->createMock(Message\MessageFormat::class));
71+
72+
$this->scheduleBuilder->expects($this->once())
73+
->method('buildFromDto')
74+
->with($request->schedule)
75+
->willReturn($this->createMock(Message\MessageSchedule::class));
76+
77+
$this->contentBuilder->expects($this->once())
78+
->method('buildFromDto')
79+
->with($request->content)
80+
->willReturn($this->createMock(Message\MessageContent::class));
81+
82+
$this->optionsBuilder->expects($this->once())
83+
->method('buildFromDto')
84+
->with($request->options)
85+
->willReturn($this->createMock(Message\MessageOptions::class));
86+
}
87+
88+
public function testBuildsNewMessage(): void
89+
{
90+
$request = $this->createRequest();
91+
$admin = $this->createMock(Administrator::class);
92+
$context = new MessageContext($admin);
93+
94+
$this->mockBuildFromDtoCalls($request);
95+
96+
$this->builder->buildFromRequest($request, $context);
97+
}
98+
99+
public function testThrowsExceptionOnInvalidRequest(): void
100+
{
101+
$this->expectException(InvalidArgumentException::class);
102+
103+
$this->builder->buildFromRequest(
104+
$this->createMock(RequestInterface::class),
105+
new MessageContext($this->createMock(Administrator::class))
106+
);
107+
}
108+
109+
public function testThrowsExceptionOnInvalidContext(): void
110+
{
111+
$this->expectException(InvalidArgumentException::class);
112+
113+
$this->builder->buildFromRequest(new CreateMessageRequest(), new \stdClass());
114+
}
115+
116+
public function testUpdatesExistingMessage(): void
117+
{
118+
$request = $this->createRequest();
119+
$admin = $this->createMock(Administrator::class);
120+
$existingMessage = $this->createMock(Message::class);
121+
$context = new MessageContext($admin, $existingMessage);
122+
123+
$this->mockBuildFromDtoCalls($request);
124+
125+
$existingMessage
126+
->expects($this->once())
127+
->method('setFormat')
128+
->with($this->isInstanceOf(Message\MessageFormat::class));
129+
$existingMessage
130+
->expects($this->once())
131+
->method('setSchedule')
132+
->with($this->isInstanceOf(Message\MessageSchedule::class));
133+
$existingMessage
134+
->expects($this->once())
135+
->method('setContent')
136+
->with($this->isInstanceOf(Message\MessageContent::class));
137+
$existingMessage
138+
->expects($this->once())
139+
->method('setOptions')
140+
->with($this->isInstanceOf(Message\MessageOptions::class));
141+
$existingMessage->expects($this->once())->method('setTemplate')->with(null);
142+
143+
$result = $this->builder->buildFromRequest($request, $context);
144+
145+
$this->assertSame($existingMessage, $result);
146+
}
147+
}

tests/Unit/Service/Manager/MessageManagerTest.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,66 @@ public function testCreateMessageReturnsPersistedMessage(): void
8787
$this->assertSame('Subject', $message->getContent()->getSubject());
8888
$this->assertSame('draft', $message->getMetadata()->getStatus());
8989
}
90+
91+
public function testUpdateMessageReturnsUpdatedMessage(): void
92+
{
93+
$messageRepository = $this->createMock(MessageRepository::class);
94+
$messageBuilder = $this->createMock(MessageBuilder::class);
95+
96+
$manager = new MessageManager($messageRepository, $messageBuilder);
97+
98+
$updateRequest = new \PhpList\RestBundle\Entity\Request\UpdateMessageRequest();
99+
$updateRequest->messageId = 1;
100+
$updateRequest->format = new MessageFormatRequest();
101+
$updateRequest->format->htmlFormated = false;
102+
$updateRequest->format->sendFormat = 'text';
103+
$updateRequest->format->formatOptions = ['text'];
104+
105+
$updateRequest->schedule = new MessageScheduleRequest();
106+
$updateRequest->schedule->repeatInterval = 0;
107+
$updateRequest->schedule->repeatUntil = '2025-04-30T00:00:00+00:00';
108+
$updateRequest->schedule->requeueInterval = 0;
109+
$updateRequest->schedule->requeueUntil = '2025-04-20T00:00:00+00:00';
110+
$updateRequest->schedule->embargo = '2025-04-17T09:00:00+00:00';
111+
112+
$updateRequest->content = new MessageContentRequest();
113+
$updateRequest->content->subject = 'Updated Subject';
114+
$updateRequest->content->text = 'Updated Full text';
115+
$updateRequest->content->textMessage = 'Updated Short text';
116+
$updateRequest->content->footer = 'Updated Footer';
117+
118+
$updateRequest->options = new MessageOptionsRequest();
119+
$updateRequest->options->fromField = '[email protected]';
120+
$updateRequest->options->toField = '[email protected]';
121+
$updateRequest->options->replyTo = '[email protected]';
122+
$updateRequest->options->userSelection = 'active-users';
123+
124+
$updateRequest->templateId = 2;
125+
126+
$authUser = $this->createMock(Administrator::class);
127+
128+
$existingMessage = $this->createMock(Message::class);
129+
$expectedContent = $this->createMock(Message\MessageContent::class);
130+
$expectedMetadata = $this->createMock(Message\MessageMetadata::class);
131+
132+
$expectedContent->method('getSubject')->willReturn('Updated Subject');
133+
$expectedMetadata->method('getStatus')->willReturn('draft');
134+
135+
$existingMessage->method('getContent')->willReturn($expectedContent);
136+
$existingMessage->method('getMetadata')->willReturn($expectedMetadata);
137+
138+
$messageBuilder->expects($this->once())
139+
->method('buildFromRequest')
140+
->with($updateRequest, $this->anything())
141+
->willReturn($existingMessage);
142+
143+
$messageRepository->expects($this->once())
144+
->method('save')
145+
->with($existingMessage);
146+
147+
$message = $manager->updateMessage($updateRequest, $existingMessage, $authUser);
148+
149+
$this->assertSame('Updated Subject', $message->getContent()->getSubject());
150+
$this->assertSame('draft', $message->getMetadata()->getStatus());
151+
}
90152
}

0 commit comments

Comments
 (0)