Skip to content

Commit 3e43a76

Browse files
authored
Added assertions for Symfony Mime component (#139)
1 parent cfb8c6c commit 3e43a76

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed

src/Codeception/Module/Symfony.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Codeception\Module\Symfony\EventsAssertionsTrait;
1717
use Codeception\Module\Symfony\FormAssertionsTrait;
1818
use Codeception\Module\Symfony\MailerAssertionsTrait;
19+
use Codeception\Module\Symfony\MimeAssertionsTrait;
1920
use Codeception\Module\Symfony\ParameterAssertionsTrait;
2021
use Codeception\Module\Symfony\RouterAssertionsTrait;
2122
use Codeception\Module\Symfony\SecurityAssertionsTrait;
@@ -134,6 +135,7 @@ class Symfony extends Framework implements DoctrineProvider, PartedModule
134135
use EventsAssertionsTrait;
135136
use FormAssertionsTrait;
136137
use MailerAssertionsTrait;
138+
use MimeAssertionsTrait;
137139
use ParameterAssertionsTrait;
138140
use RouterAssertionsTrait;
139141
use SecurityAssertionsTrait;
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Codeception\Module\Symfony;
6+
7+
use PHPUnit\Framework\Constraint\LogicalNot;
8+
use Symfony\Component\Mime\Email;
9+
use Symfony\Component\Mime\Test\Constraint as MimeConstraint;
10+
11+
trait MimeAssertionsTrait
12+
{
13+
/**
14+
* Verify that an email contains addresses with a [header](https://datatracker.ietf.org/doc/html/rfc4021)
15+
* `$headerName` and its expected value `$expectedValue`.
16+
* If the Email object is not specified, the last email sent is used instead.
17+
*
18+
* ```php
19+
* <?php
20+
* $I->assertEmailAddressContains('To', 'jane_doe@example.com');
21+
* ```
22+
*/
23+
public function assertEmailAddressContains(string $headerName, string $expectedValue, Email $email = null): void
24+
{
25+
$email = $this->verifyEmailObject($email, __FUNCTION__);
26+
$this->assertThat($email, new MimeConstraint\EmailAddressContains($headerName, $expectedValue));
27+
}
28+
29+
/**
30+
* Verify that an email has sent the specified number `$count` of attachments.
31+
* If the Email object is not specified, the last email sent is used instead.
32+
*
33+
* ```php
34+
* <?php
35+
* $I->assertEmailAttachmentCount(1);
36+
* ```
37+
*/
38+
public function assertEmailAttachmentCount(int $count, Email $email = null): void
39+
{
40+
$email = $this->verifyEmailObject($email, __FUNCTION__);
41+
$this->assertThat($email, new MimeConstraint\EmailAttachmentCount($count));
42+
}
43+
44+
/**
45+
* Verify that an email has a [header](https://datatracker.ietf.org/doc/html/rfc4021) `$headerName`.
46+
* If the Email object is not specified, the last email sent is used instead.
47+
*
48+
* ```php
49+
* <?php
50+
* $I->assertEmailHasHeader('Bcc');
51+
* ```
52+
*/
53+
public function assertEmailHasHeader(string $headerName, Email $email = null): void
54+
{
55+
$email = $this->verifyEmailObject($email, __FUNCTION__);
56+
$this->assertThat($email, new MimeConstraint\EmailHasHeader($headerName));
57+
}
58+
59+
/**
60+
* Verify that the [header](https://datatracker.ietf.org/doc/html/rfc4021)
61+
* `$headerName` of an email is not the expected one `$expectedValue`.
62+
* If the Email object is not specified, the last email sent is used instead.
63+
*
64+
* ```php
65+
* <?php
66+
* $I->assertEmailHeaderNotSame('To', 'john_doe@gmail.com');
67+
* ```
68+
*/
69+
public function assertEmailHeaderNotSame(string $headerName, string $expectedValue, Email $email = null): void
70+
{
71+
$email = $this->verifyEmailObject($email, __FUNCTION__);
72+
$this->assertThat($email, new LogicalNot(new MimeConstraint\EmailHeaderSame($headerName, $expectedValue)));
73+
}
74+
75+
/**
76+
* Verify that the [header](https://datatracker.ietf.org/doc/html/rfc4021)
77+
* `$headerName` of an email is the same as expected `$expectedValue`.
78+
* If the Email object is not specified, the last email sent is used instead.
79+
*
80+
* ```php
81+
* <?php
82+
* $I->assertEmailHeaderSame('To', 'jane_doe@gmail.com');
83+
* ```
84+
*/
85+
public function assertEmailHeaderSame(string $headerName, string $expectedValue, Email $email = null): void
86+
{
87+
$email = $this->verifyEmailObject($email, __FUNCTION__);
88+
$this->assertThat($email, new MimeConstraint\EmailHeaderSame($headerName, $expectedValue));
89+
}
90+
91+
/**
92+
* Verify that the HTML body of an email contains `$text`.
93+
* If the Email object is not specified, the last email sent is used instead.
94+
*
95+
* ```php
96+
* <?php
97+
* $I->assertEmailHtmlBodyContains('Successful registration');
98+
* ```
99+
*/
100+
public function assertEmailHtmlBodyContains(string $text, Email $email = null): void
101+
{
102+
$email = $this->verifyEmailObject($email, __FUNCTION__);
103+
$this->assertThat($email, new MimeConstraint\EmailHtmlBodyContains($text));
104+
}
105+
106+
/**
107+
* Verify that the HTML body of an email does not contain a text `$text`.
108+
* If the Email object is not specified, the last email sent is used instead.
109+
*
110+
* ```php
111+
* <?php
112+
* $I->assertEmailHtmlBodyNotContains('userpassword');
113+
* ```
114+
*/
115+
public function assertEmailHtmlBodyNotContains(string $text, Email $email = null): void
116+
{
117+
$email = $this->verifyEmailObject($email, __FUNCTION__);
118+
$this->assertThat($email, new LogicalNot(new MimeConstraint\EmailHtmlBodyContains($text)));
119+
}
120+
121+
/**
122+
* Verify that an email does not have a [header](https://datatracker.ietf.org/doc/html/rfc4021) `$headerName`.
123+
* If the Email object is not specified, the last email sent is used instead.
124+
*
125+
* ```php
126+
* <?php
127+
* $I->assertEmailNotHasHeader('Bcc');
128+
* ```
129+
*/
130+
public function assertEmailNotHasHeader(string $headerName, Email $email = null): void
131+
{
132+
$email = $this->verifyEmailObject($email, __FUNCTION__);
133+
$this->assertThat($email, new LogicalNot(new MimeConstraint\EmailHasHeader($headerName)));
134+
}
135+
136+
/**
137+
* Verify the text body of an email contains a `$text`.
138+
* If the Email object is not specified, the last email sent is used instead.
139+
*
140+
* ```php
141+
* <?php
142+
* $I->assertEmailTextBodyContains('Example text body');
143+
* ```
144+
*/
145+
public function assertEmailTextBodyContains(string $text, Email $email = null): void
146+
{
147+
$email = $this->verifyEmailObject($email, __FUNCTION__);
148+
$this->assertThat($email, new MimeConstraint\EmailTextBodyContains($text));
149+
}
150+
151+
/**
152+
* Verify that the text body of an email does not contain a `$text`.
153+
* If the Email object is not specified, the last email sent is used instead.
154+
*
155+
* ```php
156+
* <?php
157+
* $I->assertEmailTextBodyNotContains('My secret text body');
158+
* ```
159+
*/
160+
public function assertEmailTextBodyNotContains(string $text, Email $email = null): void
161+
{
162+
$email = $this->verifyEmailObject($email, __FUNCTION__);
163+
$this->assertThat($email, new LogicalNot(new MimeConstraint\EmailTextBodyContains($text)));
164+
}
165+
166+
/**
167+
* Returns the last email sent if $email is null. If no email has been sent it fails.
168+
*/
169+
private function verifyEmailObject(?Email $email, string $function): Email
170+
{
171+
$email = $email ?: $this->grabLastSentEmail();
172+
$errorMsgFormat = "There is no email to verify. An Email object was not specified when invoking '%s' and the application has not sent one.";
173+
return $email ?: $this->fail(
174+
sprintf($errorMsgFormat, $function)
175+
);
176+
}
177+
}

0 commit comments

Comments
 (0)