Skip to content

Commit 9a91c98

Browse files
authored
Merge pull request #136 from robertpustulka/email-transport
Email transport configuration enhancements
2 parents c073121 + 83f83fe commit 9a91c98

File tree

4 files changed

+127
-5
lines changed

4 files changed

+127
-5
lines changed

src/Job/SendMailJob.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
use Cake\Log\Log;
2020
use Cake\Mailer\AbstractTransport;
21+
use Cake\Mailer\TransportFactory;
2122
use Cake\Queue\Queue\Processor;
2223

2324
/**
@@ -65,12 +66,15 @@ public function execute(Message $message): ?string
6566
*/
6667
protected function getTransport(string $transportClassName, array $config): AbstractTransport
6768
{
69+
if ($transportClassName === '') {
70+
throw new \InvalidArgumentException('Transport class name is empty.');
71+
}
72+
6873
if (
69-
empty($transportClassName) ||
7074
!class_exists($transportClassName) ||
7175
!method_exists($transportClassName, 'send')
7276
) {
73-
throw new \InvalidArgumentException(sprintf('Transport class name is not valid: %s', $transportClassName));
77+
return TransportFactory::get($transportClassName);
7478
}
7579

7680
$transport = new $transportClassName($config);

src/Mailer/Transport/QueueTransport.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ protected function prepareData(Message $message): array
8585
{
8686
return [
8787
'transport' => $this->getConfig('transport'),
88-
'config' => $this->getConfig(),
88+
'config' => is_array($this->getConfig('config')) ? $this->getConfig('config') : $this->getConfig(),
8989
'emailMessage' => json_encode($message),
9090
];
9191
}

tests/TestCase/Job/SendMailJobTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
use Cake\Mailer\Mailer;
2020
use Cake\Mailer\Transport\DebugTransport;
21+
use Cake\Mailer\TransportFactory;
2122
use Cake\Queue\Job\Message;
2223
use Cake\Queue\Job\SendMailJob;
2324
use Cake\Queue\Queue\Processor;
@@ -78,6 +79,32 @@ public function testExecute()
7879
$this->assertSame(Processor::ACK, $actual);
7980
}
8081

82+
/**
83+
* Test execute method with transport name
84+
*
85+
* @return void
86+
*/
87+
public function testExecuteTransportName()
88+
{
89+
$job = new SendMailJob();
90+
$message = $this->createMessage('foo', [], $this->message);
91+
$emailMessage = new \Cake\Mailer\Message();
92+
$data = json_decode($message->getArgument('emailMessage'), true);
93+
$emailMessage->createFromArray($data);
94+
95+
$transport = $this->getMockBuilder(DebugTransport::class)->getMock();
96+
$transport->expects($this->once())
97+
->method('send')
98+
->with($emailMessage)
99+
->willReturn(['message' => 'test', 'headers' => []]);
100+
TransportFactory::getRegistry()->set('foo', $transport);
101+
102+
$actual = $job->execute($message);
103+
$this->assertSame(Processor::ACK, $actual);
104+
105+
TransportFactory::drop('foo');
106+
}
107+
81108
/**
82109
* Test execute with attachments method
83110
*

tests/TestCase/Mailer/Transport/QueueTransportTest.php

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,26 @@
1616
*/
1717
namespace Cake\Queue\Test\TestCase\Job;
1818

19+
use Cake\Mailer\Message;
20+
use Cake\Mailer\Transport\SmtpTransport;
1921
use Cake\Queue\Mailer\Transport\QueueTransport;
2022
use Cake\Queue\QueueManager;
2123
use Cake\TestSuite\TestCase;
2224

2325
class QueueTransportTest extends TestCase
2426
{
27+
private $fsQueuePath = TMP . DS . 'queue';
28+
29+
private function getFsQueueUrl(): string
30+
{
31+
return 'file:///' . $this->fsQueuePath;
32+
}
33+
34+
private function getFsQueueFile(): string
35+
{
36+
return $this->getFsQueueUrl() . DS . 'enqueue.app.default';
37+
}
38+
2539
/**
2640
* Test send
2741
*
@@ -31,9 +45,9 @@ public function testSend()
3145
{
3246
QueueManager::setConfig('default', [
3347
'queue' => 'default',
34-
'url' => 'null:',
48+
'url' => $this->getFsQueueUrl(),
3549
]);
36-
$message = (new \Cake\Mailer\Message())
50+
$message = (new Message())
3751
->setFrom('[email protected]')
3852
->setTo('[email protected]')
3953
->setSubject('Sample Subject');
@@ -58,6 +72,83 @@ public function testSend()
5872

5973
$expected = ['headers' => $headers, 'message' => 'Message has been enqueued'];
6074
$this->assertEquals($expected, $result);
75+
76+
$fsQueueFile = $this->getFsQueueFile();
77+
$this->assertFileExists($fsQueueFile);
78+
79+
$content = file_get_contents($fsQueueFile);
80+
$this->assertStringContainsString('MailTransport', $content);
81+
82+
QueueManager::drop('default');
83+
}
84+
85+
/**
86+
* Test send custom transport
87+
*
88+
* @return void
89+
*/
90+
public function testSendCustomTransport()
91+
{
92+
QueueManager::setConfig('default', [
93+
'queue' => 'default',
94+
'url' => $this->getFsQueueUrl(),
95+
]);
96+
$message = (new Message());
97+
98+
$transport = new QueueTransport([
99+
'transport' => SmtpTransport::class,
100+
'config' => [
101+
'host' => 'mail.example.com',
102+
],
103+
]);
104+
$transport->send($message);
105+
106+
$fsQueueFile = $this->getFsQueueFile();
107+
$this->assertFileExists($fsQueueFile);
108+
109+
$content = file_get_contents($fsQueueFile);
110+
$this->assertStringContainsString('SmtpTransport', $content);
111+
$this->assertStringContainsString('"config\":{\"host\":\"mail.example.com\"}', $content);
112+
61113
QueueManager::drop('default');
62114
}
115+
116+
/**
117+
* Test send backwards compatibility transport config
118+
*
119+
* @return void
120+
*/
121+
public function testSendBcTransport()
122+
{
123+
QueueManager::setConfig('default', [
124+
'queue' => 'default',
125+
'url' => $this->getFsQueueUrl(),
126+
]);
127+
$message = (new Message());
128+
129+
$transport = new QueueTransport([
130+
'transport' => SmtpTransport::class,
131+
'host' => 'mail.example.com',
132+
]);
133+
$transport->send($message);
134+
135+
$fsQueueFile = $this->getFsQueueFile();
136+
$this->assertFileExists($fsQueueFile);
137+
138+
$content = file_get_contents($fsQueueFile);
139+
$this->assertStringContainsString('SmtpTransport', $content);
140+
$this->assertStringContainsString('"host\":\"mail.example.com\"', $content);
141+
142+
QueueManager::drop('default');
143+
}
144+
145+
public function tearDown(): void
146+
{
147+
parent::tearDown();
148+
149+
$fsQueueFile = $this->getFsQueueFile();
150+
if (file_exists($fsQueueFile)) {
151+
unlink($fsQueueFile);
152+
}
153+
}
63154
}

0 commit comments

Comments
 (0)