Skip to content

Commit f8eeaf4

Browse files
authored
Ensure template keeps working when text or html body are null (#1)
* Ensure template keeps working when text or html body are null * Add better assertions for message validation with empty bodies * Updated test expected variable handling * Fix code style violations Co-authored-by: kjellknapen <[email protected]>
1 parent aff7b4d commit f8eeaf4

File tree

2 files changed

+74
-2
lines changed

2 files changed

+74
-2
lines changed

src/ValidatedTemplateMessage.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use function gettype;
1515
use function head;
1616
use function is_array;
17+
use function optional;
1718

1819
final class ValidatedTemplateMessage
1920
{
@@ -52,8 +53,8 @@ private function __construct(
5253
DynamicResponseModel $suggestedModel
5354
) {
5455
$this->subject = (string) $renderedTemplate['Subject']['RenderedContent'];
55-
$this->htmlBody = (string) $renderedTemplate['HtmlBody']['RenderedContent'];
56-
$this->textBody = (string) $renderedTemplate['TextBody']['RenderedContent'];
56+
$this->htmlBody = (string) optional($renderedTemplate['HtmlBody'])['RenderedContent'];
57+
$this->textBody = (string) optional($renderedTemplate['TextBody'])['RenderedContent'];
5758
$this->renderedTemplate = $renderedTemplate;
5859

5960
$this->parseForValidationErrors($model, $suggestedModel);

src/ValidatedTemplateMessageTest.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,77 @@ public function itCanBeConstructedValidTemplateModels(DynamicTemplateModel $temp
8888
$this->assertFalse($validatedMessage->isInvalid());
8989
}
9090

91+
public function emptyBodyModels(): Generator
92+
{
93+
yield 'Response model with empty text' => [
94+
new DynamicResponseModel([
95+
'AllContentIsValid' => true,
96+
'Subject' => [
97+
'RenderedContent' => $subject = 'Some rendered subject',
98+
],
99+
'HtmlBody' => [
100+
'RenderedContent' => $htmlBody = 'Some rendered HTML',
101+
],
102+
'TextBody' => null,
103+
]),
104+
compact('subject', 'htmlBody') + ['textBody' => ''],
105+
];
106+
107+
yield 'Response model with empty html' => [
108+
new DynamicResponseModel([
109+
'AllContentIsValid' => true,
110+
'Subject' => [
111+
'RenderedContent' => $subject = 'Some rendered subject',
112+
],
113+
'HtmlBody' => null,
114+
'TextBody' => [
115+
'RenderedContent' => $textBody = 'Some rendered text',
116+
],
117+
]),
118+
compact('subject', 'textBody') + ['htmlBody' => ''],
119+
];
120+
121+
yield 'Response model with empty html and text' => [
122+
new DynamicResponseModel([
123+
'AllContentIsValid' => true,
124+
'Subject' => [
125+
'RenderedContent' => $subject = 'Some rendered subject',
126+
],
127+
'HtmlBody' => null,
128+
'TextBody' => null,
129+
]),
130+
compact('subject') + ['htmlBody' => '', 'textBody' => ''],
131+
];
132+
}
133+
134+
/**
135+
* @test
136+
* @dataProvider emptyBodyModels
137+
*/
138+
public function itCanHandleEmptyBodyValues(DynamicResponseModel $renderedTemplate, array $expectations): void
139+
{
140+
$this->setupFaker();
141+
$templateModel = DynamicTemplateModel::fromVariables([
142+
'project' => $this->faker->name,
143+
'user' => [
144+
'email' => $this->faker->email,
145+
'name' => $this->faker->firstName,
146+
'preferences' => [],
147+
],
148+
'list' => [],
149+
]);
150+
$suggestedModel = new DynamicResponseModel(self::SUGGESTED_MODEL);
151+
152+
$validatedMessage = ValidatedTemplateMessage::validate($renderedTemplate, $templateModel, $suggestedModel);
153+
154+
$this->assertSame($expectations['subject'], $validatedMessage->subject);
155+
$this->assertSame($expectations['htmlBody'], $validatedMessage->htmlBody);
156+
$this->assertSame($expectations['textBody'], $validatedMessage->textBody);
157+
$this->assertEmpty($validatedMessage->missingVariables);
158+
$this->assertEmpty($validatedMessage->invalidVariables);
159+
$this->assertFalse($validatedMessage->isInvalid());
160+
}
161+
91162
public function invalidTemplateModels(): Generator
92163
{
93164
$this->setupFaker();

0 commit comments

Comments
 (0)