Skip to content

Commit 746ac9b

Browse files
committed
refactor the MailMailerTest
1 parent 8713edc commit 746ac9b

1 file changed

Lines changed: 151 additions & 104 deletions

File tree

tests/Mail/MailMailerTest.php

Lines changed: 151 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -37,57 +37,93 @@ public function testMailerSendSendsMessageWithProperViewContent()
3737
/** @var SentMessage $sentMessage */
3838
$sentMessage = $sentMessages[0];
3939
self::assertStringContainsString('rendered.view', $sentMessage->toString());
40+
self::assertStringContainsString('Content-Type: text/html;', $sentMessage->toString());
4041
self::assertEquals('taylor@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress());
4142
self::assertEquals('hello@laravel.com', $sentMessage->getEnvelope()->getSender()->getAddress());
4243
}
4344

4445

4546
public function testMailerSendSendsMessageWithProperPlainViewContent()
4647
{
47-
unset($_SERVER['__mailer.test']);
48-
$mailer = $this->getMock(Mailer::class, ['createMessage'], $this->getMocks());
49-
$message = m::mock('StdClass');
50-
$mailer->expects($this->once())->method('createMessage')->willReturn($message);
51-
$view = m::mock('StdClass');
52-
$mailer->getViewFactory()->shouldReceive('make')->once()->with('foo', ['data', 'message' => $message])->andReturn($view);
53-
$mailer->getViewFactory()->shouldReceive('make')->once()->with('bar', ['data', 'message' => $message])->andReturn($view);
54-
$view->shouldReceive('render')->twice()->andReturn('rendered.view');
55-
$message->shouldReceive('setBody')->once()->with('rendered.view', 'text/html');
56-
$message->shouldReceive('addPart')->once()->with('rendered.view', 'text/plain');
57-
$message->shouldReceive('setFrom')->never();
58-
$mailer->setSwiftMailer(m::mock('StdClass'));
59-
$message->shouldReceive('getSwiftMessage')->once()->andReturn($message);
60-
$mailer->getSwiftMailer()->shouldReceive('send')->once()->with($message, []);
61-
$mailer->send(['foo', 'bar'], ['data'], function($m) { $_SERVER['__mailer.test'] = $m; });
62-
unset($_SERVER['__mailer.test']);
48+
$view = m::mock(Factory::class);
49+
$view->shouldReceive('make')->twice()->andReturn($view);
50+
$view->shouldReceive('render')->once()->andReturn('rendered.view');
51+
$view->shouldReceive('render')->once()->andReturn('rendered.plain');
52+
53+
$mailer = new Mailer($view, $transport = new ArrayTransport());
54+
$mailer->send(['foo', 'bar'], ['data'], function (Message $message) {
55+
$message->to('taylor@laravel.com')->from('hello@laravel.com');
56+
});
57+
58+
$sentMessages = $transport->messages();
59+
self::assertCount(1, $sentMessages);
60+
61+
/** @var SentMessage $sentMessage */
62+
$sentMessage = $sentMessages[0];
63+
$expected = <<<Text
64+
Content-Type: text/html; charset=utf-8\r
65+
Content-Transfer-Encoding: quoted-printable\r
66+
\r
67+
rendered.view
68+
Text;
69+
70+
self::assertStringContainsString($expected, $sentMessage->toString());
71+
72+
$expected = <<<Text
73+
Content-Type: text/plain; charset=utf-8\r
74+
Content-Transfer-Encoding: quoted-printable\r
75+
\r
76+
rendered.plain
77+
Text;
78+
79+
self::assertStringContainsString($expected, $sentMessage->toString());
80+
self::assertStringContainsString('Content-Type: text/html;', $sentMessage->toString());
81+
self::assertEquals('taylor@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress());
82+
self::assertEquals('hello@laravel.com', $sentMessage->getEnvelope()->getSender()->getAddress());
6383
}
6484

6585

6686
public function testMailerSendSendsMessageWithProperPlainViewContentWhenExplicit()
6787
{
68-
unset($_SERVER['__mailer.test']);
69-
$mailer = $this->getMock(Mailer::class, ['createMessage'], $this->getMocks());
70-
$message = m::mock('StdClass');
71-
$mailer->expects($this->once())->method('createMessage')->willReturn($message);
72-
$view = m::mock('StdClass');
73-
$mailer->getViewFactory()->shouldReceive('make')->once()->with('foo', ['data', 'message' => $message])->andReturn($view);
74-
$mailer->getViewFactory()->shouldReceive('make')->once()->with('bar', ['data', 'message' => $message])->andReturn($view);
75-
$view->shouldReceive('render')->twice()->andReturn('rendered.view');
76-
$message->shouldReceive('setBody')->once()->with('rendered.view', 'text/html');
77-
$message->shouldReceive('addPart')->once()->with('rendered.view', 'text/plain');
78-
$message->shouldReceive('setFrom')->never();
79-
$mailer->setSwiftMailer(m::mock('StdClass'));
80-
$message->shouldReceive('getSwiftMessage')->once()->andReturn($message);
81-
$mailer->getSwiftMailer()->shouldReceive('send')->once()->with($message, []);
82-
$mailer->send(['html' => 'foo', 'text' => 'bar'], ['data'], function($m) { $_SERVER['__mailer.test'] = $m; });
83-
unset($_SERVER['__mailer.test']);
88+
$view = m::mock(Factory::class);
89+
$view->shouldReceive('make')->twice()->andReturn($view);
90+
$view->shouldReceive('render')->once()->andReturn('rendered.view');
91+
$view->shouldReceive('render')->once()->andReturn('rendered.plain');
92+
93+
$mailer = new Mailer($view, $transport = new ArrayTransport());
94+
$mailer->send(['html' => 'foo', 'text' => 'bar'], ['data'], function (Message $message) {
95+
$message->to('taylor@laravel.com')->from('hello@laravel.com');
96+
});
97+
98+
$sentMessages = $transport->messages();
99+
self::assertCount(1, $sentMessages);
100+
101+
/** @var SentMessage $sentMessage */
102+
$sentMessage = $sentMessages[0];
103+
$expected = <<<Text
104+
Content-Type: text/html; charset=utf-8\r
105+
Content-Transfer-Encoding: quoted-printable\r
106+
\r
107+
rendered.view
108+
Text;
109+
110+
self::assertStringContainsString($expected, $sentMessage->toString());
111+
112+
$expected = <<<Text
113+
Content-Type: text/plain; charset=utf-8\r
114+
Content-Transfer-Encoding: quoted-printable\r
115+
\r
116+
rendered.plain
117+
Text;
118+
119+
self::assertStringContainsString($expected, $sentMessage->toString());
84120
}
85121

86122

87123
public function testMailerCanQueueMessagesToItself()
88124
{
89-
list($view, $swift) = $this->getMocks();
90-
$mailer = new Illuminate\Mail\Mailer($view, $swift);
125+
$view = m::mock(Factory::class);
126+
$mailer = new Mailer($view, new ArrayTransport());
91127
$mailer->setQueue($queue = m::mock(QueueManager::class));
92128
$queue->shouldReceive('push')->once()->with('mailer@handleQueuedMessage', ['view' => 'foo', 'data' => [1], 'callback' => 'callable'], null);
93129

@@ -97,8 +133,8 @@ public function testMailerCanQueueMessagesToItself()
97133

98134
public function testMailerCanQueueMessagesToItselfOnAnotherQueue()
99135
{
100-
list($view, $swift) = $this->getMocks();
101-
$mailer = new Illuminate\Mail\Mailer($view, $swift);
136+
$view = m::mock(Factory::class);
137+
$mailer = new Mailer($view, new ArrayTransport());
102138
$mailer->setQueue($queue = m::mock(QueueManager::class));
103139
$queue->shouldReceive('push')->once()->with('mailer@handleQueuedMessage', ['view' => 'foo', 'data' => [1], 'callback' => 'callable'], 'queue');
104140

@@ -108,8 +144,8 @@ public function testMailerCanQueueMessagesToItselfOnAnotherQueue()
108144

109145
public function testMailerCanQueueMessagesToItselfWithSerializedClosures()
110146
{
111-
list($view, $swift) = $this->getMocks();
112-
$mailer = new Illuminate\Mail\Mailer($view, $swift);
147+
$view = m::mock(Factory::class);
148+
$mailer = new Mailer($view, new ArrayTransport());
113149
$mailer->setQueue($queue = m::mock(QueueManager::class));
114150
$serialized = serialize(new Illuminate\Support\SerializableClosure($closure = function() {}));
115151
$queue->shouldReceive('push')->once()->with('mailer@handleQueuedMessage', ['view' => 'foo', 'data' => [1], 'callback' => $serialized], null);
@@ -120,8 +156,8 @@ public function testMailerCanQueueMessagesToItselfWithSerializedClosures()
120156

121157
public function testMailerCanQueueMessagesToItselfLater()
122158
{
123-
list($view, $swift) = $this->getMocks();
124-
$mailer = new Illuminate\Mail\Mailer($view, $swift);
159+
$view = m::mock(Factory::class);
160+
$mailer = new Mailer($view, new ArrayTransport());
125161
$mailer->setQueue($queue = m::mock(QueueManager::class));
126162
$queue->shouldReceive('later')->once()->with(10, 'mailer@handleQueuedMessage', ['view' => 'foo', 'data' => [1], 'callback' => 'callable'], null);
127163

@@ -131,8 +167,8 @@ public function testMailerCanQueueMessagesToItselfLater()
131167

132168
public function testMailerCanQueueMessagesToItselfLaterOnAnotherQueue()
133169
{
134-
list($view, $swift) = $this->getMocks();
135-
$mailer = new Illuminate\Mail\Mailer($view, $swift);
170+
$view = m::mock(Factory::class);
171+
$mailer = new Mailer($view, new ArrayTransport());
136172
$mailer->setQueue($queue = m::mock(QueueManager::class));
137173
$queue->shouldReceive('later')->once()->with(10, 'mailer@handleQueuedMessage', ['view' => 'foo', 'data' => [1], 'callback' => 'callable'], 'queue');
138174

@@ -142,83 +178,94 @@ public function testMailerCanQueueMessagesToItselfLaterOnAnotherQueue()
142178

143179
public function testMessagesCanBeLoggedInsteadOfSent()
144180
{
145-
$mailer = $this->getMock(Mailer::class, ['createMessage'], $this->getMocks());
146-
$message = m::mock('StdClass');
147-
$mailer->expects($this->once())->method('createMessage')->willReturn($message);
148-
$view = m::mock('StdClass');
149-
$mailer->getViewFactory()->shouldReceive('make')->once()->with('foo', ['data', 'message' => $message])->andReturn($view);
150-
$view->shouldReceive('render')->once()->andReturn('rendered.view');
151-
$message->shouldReceive('setBody')->once()->with('rendered.view', 'text/html');
152-
$message->shouldReceive('setFrom')->never();
153-
$mailer->setSwiftMailer(m::mock('StdClass'));
154-
$message->shouldReceive('getTo')->once()->andReturn(['taylor@userscape.com' => 'Taylor']);
155-
$message->shouldReceive('getSwiftMessage')->once()->andReturn($message);
156-
$mailer->getSwiftMailer()->shouldReceive('send')->never();
157-
$logger = m::mock(Writer::class);
158-
$logger->shouldReceive('info')->once()->with('Pretending to mail message to: taylor@userscape.com');
159-
$mailer->setLogger($logger);
160-
$mailer->pretend();
161-
162-
$mailer->send('foo', ['data'], function($m) {});
181+
$view = m::mock(Factory::class);
182+
$view->shouldReceive('make')->once()->andReturn($view);
183+
$view->shouldReceive('render')->once()->andReturn('rendered.view');
184+
185+
$mailer = new Mailer($view, $transport = new ArrayTransport());
186+
$logger = m::mock(Writer::class);
187+
$logger->shouldReceive('info')->once()->with('Pretending to mail message to: taylor@userscape.com');
188+
$mailer->setLogger($logger);
189+
$mailer->pretend();
190+
191+
$mailer->send('foo', ['data'], function (Message $message) {
192+
$message->from('hello@laravel.com');
193+
$message->to('taylor@userscape.com');
194+
});
195+
196+
self::assertEmpty($transport->messages());
197+
198+
// $mailer = $this->getMock(Mailer::class, ['createMessage'], $this->getMocks());
199+
// $message = m::mock('StdClass');
200+
// $mailer->expects($this->once())->method('createMessage')->willReturn($message);
201+
// $view = m::mock('StdClass');
202+
// $mailer->getViewFactory()->shouldReceive('make')->once()->with('foo', ['data', 'message' => $message])->andReturn($view);
203+
// $view->shouldReceive('render')->once()->andReturn('rendered.view');
204+
// $message->shouldReceive('setBody')->once()->with('rendered.view', 'text/html');
205+
// $message->shouldReceive('setFrom')->never();
206+
// $mailer->setSwiftMailer(m::mock('StdClass'));
207+
// $message->shouldReceive('getTo')->once()->andReturn(['taylor@userscape.com' => 'Taylor']);
208+
// $message->shouldReceive('getSwiftMessage')->once()->andReturn($message);
209+
// $mailer->getSwiftMailer()->shouldReceive('send')->never();
210+
// $logger = m::mock(Writer::class);
211+
// $logger->shouldReceive('info')->once()->with('Pretending to mail message to: taylor@userscape.com');
212+
// $mailer->setLogger($logger);
213+
// $mailer->pretend();
214+
//
215+
// $mailer->send('foo', ['data'], function($m) {});
163216
}
164217

165218

166219
public function testMailerCanResolveMailerClasses()
167220
{
168-
$mailer = $this->getMock(Mailer::class, ['createMessage'], $this->getMocks());
169-
$message = m::mock('StdClass');
170-
$mailer->expects($this->once())->method('createMessage')->willReturn($message);
171-
$view = m::mock('StdClass');
172-
$container = new Illuminate\Container\Container;
173-
$mailer->setContainer($container);
174-
$mockMailer = m::mock('StdClass');
175-
$container['FooMailer'] = $container->share(function() use ($mockMailer)
176-
{
177-
return $mockMailer;
178-
});
179-
$mockMailer->shouldReceive('mail')->once()->with($message);
180-
$mailer->getViewFactory()->shouldReceive('make')->once()->with('foo', ['data', 'message' => $message])->andReturn($view);
181-
$view->shouldReceive('render')->once()->andReturn('rendered.view');
182-
$message->shouldReceive('setBody')->once()->with('rendered.view', 'text/html');
183-
$message->shouldReceive('setFrom')->never();
184-
$mailer->setSwiftMailer(m::mock('StdClass'));
185-
$message->shouldReceive('getSwiftMessage')->once()->andReturn($message);
186-
$mailer->getSwiftMailer()->shouldReceive('send')->once()->with($message, []);
221+
$view = m::mock(Factory::class);
222+
$view->shouldReceive('make')->once()->andReturn($view);
223+
$view->shouldReceive('render')->once()->andReturn('rendered.view');
224+
225+
$mailer = new Mailer($view, $transport = new ArrayTransport());
226+
$container = new Illuminate\Container\Container();
227+
$mailer->setContainer($container);
228+
$fooMailer = new class {
229+
public int $calledTimes = 0;
230+
public function mail(Message $message): void
231+
{
232+
$message->from('hello@laravel.com');
233+
$message->to('taylor@laravel.com');
234+
$this->calledTimes++;
235+
}
236+
};
237+
$container['FooMailer'] = $container->share(fn() => $fooMailer);
238+
187239
$mailer->send('foo', ['data'], 'FooMailer');
240+
241+
$sentMessage = $transport->messages()[0];
242+
self::assertEquals(1, $fooMailer->calledTimes);
243+
self::assertEquals('taylor@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress());
244+
self::assertEquals('hello@laravel.com', $sentMessage->getEnvelope()->getSender()->getAddress());
245+
188246
}
189247

190248

191249
public function testGlobalFromIsRespectedOnAllMessages()
192250
{
193-
unset($_SERVER['__mailer.test']);
194-
$mailer = $this->getMailer();
195-
$view = m::mock('StdClass');
196-
$mailer->getViewFactory()->shouldReceive('make')->once()->andReturn($view);
197-
$view->shouldReceive('render')->once()->andReturn('rendered.view');
198-
$mailer->setSwiftMailer(m::mock('StdClass'));
199-
$mailer->alwaysFrom('taylorotwell@gmail.com', 'Taylor Otwell');
200-
$me = $this;
201-
$mailer->getSwiftMailer()->shouldReceive('send')->once()->with(m::type('Swift_Message'), [])->andReturnUsing(function($message) use ($me)
202-
{
203-
$me->assertEquals(['taylorotwell@gmail.com' => 'Taylor Otwell'], $message->getFrom());
204-
});
205-
$mailer->send('foo', ['data'], function($m) {});
206-
}
251+
$view = m::mock(Factory::class);
252+
$view->shouldReceive('make')->once()->andReturn($view);
253+
$view->shouldReceive('render')->once()->andReturn('rendered.view');
254+
$mailer = new Mailer($view, $transport = new ArrayTransport);
255+
$mailer->alwaysFrom('hello@laravel.com');
207256

257+
$mailer->send('foo', ['data'], function (Message $message) {
258+
$message->to('taylor@laravel.com');
259+
});
208260

209-
public function testFailedRecipientsAreAppendedAndCanBeRetrieved()
210-
{
211-
unset($_SERVER['__mailer.test']);
212-
$mailer = $this->getMailer();
213-
$view = m::mock('StdClass');
214-
$mailer->getViewFactory()->shouldReceive('make')->once()->andReturn($view);
215-
$view->shouldReceive('render')->once()->andReturn('rendered.view');
216-
$swift = new FailingSwiftMailerStub;
217-
$mailer->setSwiftMailer($swift);
218261

219-
$mailer->send('foo', ['data'], function($m) {});
262+
$sentMessages = $transport->messages();
263+
self::assertCount(1, $sentMessages);
220264

221-
$this->assertEquals(['taylorotwell@gmail.com'], $mailer->failures());
265+
/** @var SentMessage $sentMessage */
266+
$sentMessage = $sentMessages[0];
267+
self::assertSame('taylor@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress());
268+
self::assertSame('hello@laravel.com', $sentMessage->getEnvelope()->getSender()->getAddress());
222269
}
223270

224271

0 commit comments

Comments
 (0)