Skip to content

Commit 1db5a45

Browse files
committed
Validate campaign before setting status to submitted
1 parent 47ec84c commit 1db5a45

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

src/Domain/Messaging/Service/Builder/MessageBuilder.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public function build(MessageDtoInterface $createMessageDto, object $context = n
4242
$context->getExisting()->setContent($content);
4343
$context->getExisting()->setOptions($options);
4444
$context->getExisting()->setTemplate($template);
45+
4546
return $context->getExisting();
4647
}
4748

src/Domain/Messaging/Service/Manager/MessageManager.php

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

55
namespace PhpList\Core\Domain\Messaging\Service\Manager;
66

7+
use InvalidArgumentException;
78
use PhpList\Core\Domain\Identity\Model\Administrator;
89
use PhpList\Core\Domain\Messaging\Model\Dto\MessageContext;
910
use PhpList\Core\Domain\Messaging\Model\Dto\MessageDtoInterface;
@@ -61,6 +62,12 @@ public function updateMessage(
6162

6263
public function updateStatus(Message $message, Message\MessageStatus $status): Message
6364
{
65+
if ($status === Message\MessageStatus::Submitted && !$this->canBeSubmitted($message)) {
66+
throw new InvalidArgumentException(
67+
'Cannot set status to submitted: add at least one list and fill subject, from field, and message body.'
68+
);
69+
}
70+
6471
$message->getMetadata()->setStatus($status);
6572

6673
return $message;
@@ -76,4 +83,17 @@ public function getMessagesByOwner(Administrator $owner): array
7683
{
7784
return $this->messageRepository->getByOwnerId($owner->getId());
7885
}
86+
87+
private function canBeSubmitted(Message $message): bool
88+
{
89+
return $message->getListMessages()->count() > 0
90+
&& $this->isFilled($message->getContent()->getSubject())
91+
&& $this->isFilled($message->getOptions()->getFromField())
92+
&& $this->isFilled($message->getContent()->getText());
93+
}
94+
95+
private function isFilled(?string $value): bool
96+
{
97+
return !empty(trim((string) $value));
98+
}
7999
}

tests/Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
namespace PhpList\Core\Tests\Unit\Domain\Messaging\Service\Manager;
66

77
use DateTime;
8+
use InvalidArgumentException;
89
use PhpList\Core\Domain\Identity\Model\Administrator;
10+
use PhpList\Core\Domain\Messaging\Model\ListMessage;
911
use PhpList\Core\Domain\Messaging\Model\Dto\CreateMessageDto;
1012
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageContentDto;
1113
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageFormatDto;
@@ -22,6 +24,7 @@
2224
use PhpList\Core\Domain\Messaging\Repository\MessageRepository;
2325
use PhpList\Core\Domain\Messaging\Service\Builder\MessageBuilder;
2426
use PhpList\Core\Domain\Messaging\Service\Manager\MessageManager;
27+
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
2528
use PHPUnit\Framework\TestCase;
2629

2730
class MessageManagerTest extends TestCase
@@ -176,4 +179,63 @@ public function testUpdateMessageReturnsUpdatedMessage(): void
176179
$this->assertSame('Updated Subject', $message->getContent()->getSubject());
177180
$this->assertSame(Message\MessageStatus::Draft, $message->getMetadata()->getStatus());
178181
}
182+
183+
public function testUpdateStatusThrowsWhenSubmittedWithoutListMessage(): void
184+
{
185+
$messageRepository = $this->createMock(MessageRepository::class);
186+
$messageBuilder = $this->createMock(MessageBuilder::class);
187+
$manager = new MessageManager($messageRepository, $messageBuilder);
188+
189+
$message = new Message(
190+
format: new MessageFormat(true, 'html'),
191+
schedule: new MessageSchedule(
192+
repeatInterval: 0,
193+
repeatUntil: null,
194+
requeueInterval: 0,
195+
requeueUntil: null,
196+
embargo: new DateTime('2025-04-17T09:00:00+00:00')
197+
),
198+
metadata: new MessageMetadata(Message\MessageStatus::Draft),
199+
content: new MessageContent('Subject', 'Body text', 'Short text', 'Footer'),
200+
options: new MessageOptions('from@example.com', 'to@example.com', 'reply@example.com', 'all-users'),
201+
owner: null
202+
);
203+
204+
$this->expectException(InvalidArgumentException::class);
205+
$this->expectExceptionMessage('Cannot set status to submitted');
206+
207+
$manager->updateStatus($message, Message\MessageStatus::Submitted);
208+
}
209+
210+
public function testUpdateStatusSetsSubmittedWhenRequiredFieldsAndListArePresent(): void
211+
{
212+
$messageRepository = $this->createMock(MessageRepository::class);
213+
$messageBuilder = $this->createMock(MessageBuilder::class);
214+
$manager = new MessageManager($messageRepository, $messageBuilder);
215+
216+
$message = new Message(
217+
format: new MessageFormat(true, 'html'),
218+
schedule: new MessageSchedule(
219+
repeatInterval: 0,
220+
repeatUntil: null,
221+
requeueInterval: 0,
222+
requeueUntil: null,
223+
embargo: new DateTime('2025-04-17T09:00:00+00:00')
224+
),
225+
metadata: new MessageMetadata(Message\MessageStatus::Draft),
226+
content: new MessageContent('Subject', 'Body text', 'Short text', 'Footer'),
227+
options: new MessageOptions('from@example.com', 'to@example.com', 'reply@example.com', 'all-users'),
228+
owner: null
229+
);
230+
231+
$listMessage = new ListMessage();
232+
$listMessage->setMessage($message);
233+
$listMessage->setList($this->createMock(SubscriberList::class));
234+
$message->getListMessages()->add($listMessage);
235+
236+
$updated = $manager->updateStatus($message, Message\MessageStatus::Submitted);
237+
238+
$this->assertSame($message, $updated);
239+
$this->assertSame(Message\MessageStatus::Submitted, $message->getMetadata()->getStatus());
240+
}
179241
}

0 commit comments

Comments
 (0)