Skip to content

Commit 47ec84c

Browse files
committed
Determine htmlFormatted from content
1 parent 3861db0 commit 47ec84c

6 files changed

Lines changed: 80 additions & 49 deletions

File tree

src/Domain/Messaging/Model/Dto/Message/MessageFormatDto.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77
class MessageFormatDto
88
{
9-
public function __construct(
10-
public readonly bool $htmlFormated,
11-
public readonly string $sendFormat,
12-
) {
9+
public function __construct(public readonly string $sendFormat)
10+
{
1311
}
1412
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public function build(MessageDtoInterface $createMessageDto, object $context = n
2727
throw new InvalidContextTypeException(get_debug_type($context));
2828
}
2929

30-
$format = $this->messageFormatBuilder->build($createMessageDto->getFormat());
30+
$format = $this->messageFormatBuilder->build($createMessageDto);
3131
$schedule = $this->messageScheduleBuilder->build($createMessageDto->getSchedule());
3232
$content = $this->messageContentBuilder->build($createMessageDto->getContent());
3333
$options = $this->messageOptionsBuilder->build($createMessageDto->getOptions());

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@
44

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

7-
use PhpList\Core\Domain\Messaging\Exception\InvalidDtoTypeException;
8-
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageFormatDto;
7+
use PhpList\Core\Domain\Messaging\Model\Dto\MessageDtoInterface;
98
use PhpList\Core\Domain\Messaging\Model\Message\MessageFormat;
109

1110
class MessageFormatBuilder
1211
{
13-
public function build(object $dto): MessageFormat
12+
public function build(MessageDtoInterface $dto): MessageFormat
1413
{
15-
if (!$dto instanceof MessageFormatDto) {
16-
throw new InvalidDtoTypeException(get_debug_type($dto));
17-
}
14+
$htmlFormatted = strip_tags($dto->getContent()->text) !== $dto->getContent()->text;
1815

1916
return new MessageFormat(
20-
htmlFormatted: $dto->htmlFormated,
21-
sendFormat: $dto->sendFormat,
17+
htmlFormatted: $htmlFormatted,
18+
sendFormat: $dto->getFormat()->sendFormat,
2219
);
2320
}
2421
}

tests/Unit/Domain/Messaging/Service/Builder/MessageBuilderTest.php

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
class MessageBuilderTest extends TestCase
2929
{
30+
private TemplateRepository&MockObject $templateRepository;
3031
private MessageFormatBuilder&MockObject $formatBuilder;
3132
private MessageScheduleBuilder&MockObject $scheduleBuilder;
3233
private MessageContentBuilder&MockObject $contentBuilder;
@@ -35,22 +36,22 @@ class MessageBuilderTest extends TestCase
3536

3637
protected function setUp(): void
3738
{
38-
$templateRepository = $this->createMock(TemplateRepository::class);
39+
$this->templateRepository = $this->createMock(TemplateRepository::class);
3940
$this->formatBuilder = $this->createMock(MessageFormatBuilder::class);
4041
$this->scheduleBuilder = $this->createMock(MessageScheduleBuilder::class);
4142
$this->contentBuilder = $this->createMock(MessageContentBuilder::class);
4243
$this->optionsBuilder = $this->createMock(MessageOptionsBuilder::class);
4344

4445
$this->builder = new MessageBuilder(
45-
templateRepository: $templateRepository,
46+
templateRepository: $this->templateRepository,
4647
messageFormatBuilder: $this->formatBuilder,
4748
messageScheduleBuilder: $this->scheduleBuilder,
4849
messageContentBuilder: $this->contentBuilder,
4950
messageOptionsBuilder: $this->optionsBuilder
5051
);
5152
}
5253

53-
private function createRequest(): CreateMessageDto
54+
private function createRequest(?int $templateId = 0): CreateMessageDto
5455
{
5556
return new CreateMessageDto(
5657
content: new MessageContentDto(
@@ -59,7 +60,6 @@ private function createRequest(): CreateMessageDto
5960
footer: ''
6061
),
6162
format: new MessageFormatDto(
62-
htmlFormated: false,
6363
sendFormat: 'text',
6464
),
6565
metadata: new MessageMetadataDto(
@@ -78,15 +78,15 @@ private function createRequest(): CreateMessageDto
7878
requeueInterval: null,
7979
requeueUntil: null
8080
),
81-
templateId: 0
81+
templateId: $templateId
8282
);
8383
}
8484

8585
private function mockBuildCalls(CreateMessageDto $createMessageDto): void
8686
{
8787
$this->formatBuilder->expects($this->once())
8888
->method('build')
89-
->with($createMessageDto->format)
89+
->with($createMessageDto)
9090
->willReturn($this->createMock(Message\MessageFormat::class));
9191

9292
$this->scheduleBuilder->expects($this->once())
@@ -113,7 +113,14 @@ public function testBuildsNewMessage(): void
113113

114114
$this->mockBuildCalls($request);
115115

116-
$this->builder->build(createMessageDto: $request, context: $context);
116+
$this->templateRepository->expects($this->once())
117+
->method('find')
118+
->with(0)
119+
->willReturn(null);
120+
121+
$result = $this->builder->build(createMessageDto: $request, context: $context);
122+
123+
$this->assertInstanceOf(Message::class, $result);
117124
}
118125

119126
public function testThrowsExceptionOnInvalidContext(): void
@@ -132,25 +139,37 @@ public function testUpdatesExistingMessage(): void
132139

133140
$this->mockBuildCalls($request);
134141

142+
$this->templateRepository->expects($this->once())
143+
->method('find')
144+
->with(0)
145+
->willReturn(null);
146+
135147
$existingMessage
136148
->expects($this->once())
137149
->method('setFormat')
138150
->with($this->isInstanceOf(Message\MessageFormat::class));
151+
139152
$existingMessage
140153
->expects($this->once())
141154
->method('setSchedule')
142155
->with($this->isInstanceOf(MessageSchedule::class));
156+
143157
$existingMessage
144158
->expects($this->once())
145159
->method('setContent')
146160
->with($this->isInstanceOf(MessageContent::class));
161+
147162
$existingMessage
148163
->expects($this->once())
149164
->method('setOptions')
150165
->with($this->isInstanceOf(Message\MessageOptions::class));
151-
$existingMessage->expects($this->once())->method('setTemplate')->with(null);
152166

153-
$result = $this->builder->build($request, $context);
167+
$existingMessage
168+
->expects($this->once())
169+
->method('setTemplate')
170+
->with(null);
171+
172+
$result = $this->builder->build(createMessageDto: $request, context: $context);
154173

155174
$this->assertSame($existingMessage, $result);
156175
}

tests/Unit/Domain/Messaging/Service/Builder/MessageFormatBuilderTest.php

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,51 @@
44

55
namespace PhpList\Core\Tests\Unit\Domain\Messaging\Service\Builder;
66

7-
use PhpList\Core\Domain\Messaging\Exception\InvalidDtoTypeException;
7+
use PhpList\Core\Domain\Messaging\Model\Dto\CreateMessageDto;
8+
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageContentDto;
89
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageFormatDto;
9-
use PhpList\Core\Domain\Messaging\Service\Builder\MessageFormatBuilder;
10+
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageMetadataDto;
11+
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageOptionsDto;
12+
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageScheduleDto;
1013
use PHPUnit\Framework\TestCase;
14+
use PhpList\Core\Domain\Messaging\Model\Message\MessageFormat;
15+
use PhpList\Core\Domain\Messaging\Service\Builder\MessageFormatBuilder;
1116

12-
class MessageFormatBuilderTest extends TestCase
17+
final class MessageFormatBuilderTest extends TestCase
1318
{
14-
private MessageFormatBuilder $builder;
15-
16-
protected function setUp(): void
19+
public function testBuildSetsHtmlFormattedToFalseWhenContentIsPlainText(): void
1720
{
18-
$this->builder = new MessageFormatBuilder();
21+
$dto = $this->createDto('Plain text content', 'text');
22+
23+
$builder = new MessageFormatBuilder();
24+
$result = $builder->build($dto);
25+
26+
self::assertInstanceOf(MessageFormat::class, $result);
27+
self::assertFalse($result->isHtmlFormatted());
28+
self::assertSame('text', $result->getSendFormat());
1929
}
2030

21-
public function testBuildsMessageFormatSuccessfully(): void
31+
public function testBuildSetsHtmlFormattedToTrueWhenContentContainsHtml(): void
2232
{
23-
$dto = new MessageFormatDto(htmlFormated: true, sendFormat: 'html');
24-
$messageFormat = $this->builder->build($dto);
33+
$dto = $this->createDto('<p>Hello <strong>world</strong></p>', 'html');
34+
35+
$builder = new MessageFormatBuilder();
36+
$result = $builder->build($dto);
2537

26-
$this->assertSame(true, $messageFormat->isHtmlFormatted());
27-
$this->assertSame('html', $messageFormat->getSendFormat());
38+
self::assertInstanceOf(MessageFormat::class, $result);
39+
self::assertTrue($result->isHtmlFormatted());
40+
self::assertSame('html', $result->getSendFormat());
2841
}
2942

30-
public function testThrowsExceptionOnInvalidDto(): void
43+
private function createDto(string $text, string $sendFormat): CreateMessageDto
3144
{
32-
$this->expectException(InvalidDtoTypeException::class);
33-
34-
$invalidDto = new \stdClass();
35-
$this->builder->build($invalidDto);
45+
return new CreateMessageDto(
46+
content: new MessageContentDto(subject: '', text: $text, footer: ''),
47+
format: new MessageFormatDto(sendFormat: $sendFormat),
48+
metadata: $this->createMock(MessageMetadataDto::class),
49+
options: $this->createMock(MessageOptionsDto::class),
50+
schedule: $this->createMock(MessageScheduleDto::class),
51+
templateId: null,
52+
);
3653
}
3754
}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function testCreateMessageReturnsPersistedMessage(): void
7070
$messageBuilder = $this->createMock(MessageBuilder::class);
7171
$manager = new MessageManager($messageRepository, $messageBuilder);
7272

73-
$format = new MessageFormatDto(true, 'html');
73+
$format = new MessageFormatDto('html');
7474
$schedule = new MessageScheduleDto(
7575
embargo: '2025-04-17T09:00:00+00:00',
7676
repeatInterval: 60 * 24,
@@ -79,7 +79,7 @@ public function testCreateMessageReturnsPersistedMessage(): void
7979
requeueUntil: '2025-04-20T00:00:00+00:00',
8080
);
8181
$metadata = new MessageMetadataDto(Message\MessageStatus::Draft);
82-
$content = new MessageContentDto('Subject', 'Full text', 'Footer');
82+
$content = new MessageContentDto(subject: 'Subject', text: 'Full text', footer: 'Footer');
8383
$options = new MessageOptionsDto('from@example.com', 'to@example.com', 'reply@example.com', 'all-users');
8484

8585
$request = new CreateMessageDto(
@@ -124,7 +124,7 @@ public function testUpdateMessageReturnsUpdatedMessage(): void
124124
$messageBuilder = $this->createMock(MessageBuilder::class);
125125
$manager = new MessageManager($messageRepository, $messageBuilder);
126126

127-
$format = new MessageFormatDto(false, 'text');
127+
$format = new MessageFormatDto('text');
128128
$schedule = new MessageScheduleDto(
129129
embargo: '2025-04-17T09:00:00+00:00',
130130
repeatInterval: 0,
@@ -134,15 +134,15 @@ public function testUpdateMessageReturnsUpdatedMessage(): void
134134
);
135135
$metadata = new MessageMetadataDto(Message\MessageStatus::Draft);
136136
$content = new MessageContentDto(
137-
'Updated Subject',
138-
'Updated Full text',
139-
'Updated Footer'
137+
subject: 'Updated Subject',
138+
text: 'Updated Full text',
139+
footer: 'Updated Footer'
140140
);
141141
$options = new MessageOptionsDto(
142-
'newfrom@example.com',
143-
'newto@example.com',
144-
'newreply@example.com',
145-
'active-users'
142+
fromField: 'newfrom@example.com',
143+
toField: 'newto@example.com',
144+
replyTo: 'newreply@example.com',
145+
userSelection: 'active-users'
146146
);
147147

148148
$updateRequest = new UpdateMessageDto(

0 commit comments

Comments
 (0)