Skip to content

Commit c6e58be

Browse files
committed
Make TestMailer proxying
1 parent d6c36a0 commit c6e58be

File tree

2 files changed

+78
-23
lines changed

2 files changed

+78
-23
lines changed

src/Codeception/Lib/Connector/Yii2.php

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use yii\base\Security;
1616
use yii\base\UserException;
1717
use yii\mail\MessageInterface;
18+
use yii\symfonymailer\Mailer;
1819
use yii\web\Application;
1920
use yii\web\ErrorHandler;
2021
use yii\web\IdentityInterface;
@@ -422,33 +423,20 @@ protected function encodeCookies(
422423
*/
423424
protected function mockMailer(array $config): array
424425
{
425-
// options that make sense for mailer mock
426-
$allowedOptions = [
427-
'htmlLayout',
428-
'textLayout',
429-
'messageConfig',
430-
'messageClass',
431-
'useFileTransport',
432-
'fileTransportPath',
433-
'fileTransportCallback',
434-
'view',
435-
'viewPath',
436-
];
437-
438426
$mailerConfig = [
439427
'class' => TestMailer::class,
440428
'callback' => function (MessageInterface $message) {
441429
$this->emails[] = $message;
442-
}
430+
},
431+
'mailer' => [
432+
'class' => Mailer::class,
433+
]
443434
];
444435

445-
if (isset($config['components']['mailer']) && is_array($config['components']['mailer'])) {
446-
foreach ($config['components']['mailer'] as $name => $value) {
447-
if (in_array($name, $allowedOptions, true)) {
448-
$mailerConfig[$name] = $value;
449-
}
450-
}
436+
if (isset($config['components']['mailer'])) {
437+
$mailerConfig['mailer'] = $config['components']['mailer'];
451438
}
439+
452440
$config['components']['mailer'] = $mailerConfig;
453441

454442
return $config;

src/Codeception/Lib/Connector/Yii2/TestMailer.php

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,90 @@
11
<?php
22
namespace Codeception\Lib\Connector\Yii2;
33

4+
use yii\base\UnknownMethodException;
5+
use yii\base\UnknownPropertyException;
6+
use yii\di\Instance;
47
use yii\mail\BaseMailer;
8+
use yii\mail\MailerInterface;
59

610
class TestMailer extends BaseMailer
711
{
8-
public $messageClass = \yii\symfonymailer\Message::class;
9-
1012
/**
1113
* @var \Closure
1214
*/
1315
public $callback;
1416

17+
/**
18+
* @var string|array|MailerInterface Mailer config or component to send mail out in the end
19+
*/
20+
public $mailer = 'mailer';
21+
22+
/**
23+
* @inheritdoc
24+
* @throws InvalidConfigException
25+
*/
26+
public function init()
27+
{
28+
parent::init();
29+
$this->mailer = Instance::ensure($this->mailer, MailerInterface::class);
30+
}
31+
32+
/**
33+
* @param string $name
34+
* @param array $params
35+
* @return mixed
36+
*/
37+
public function __call($name, $params)
38+
{
39+
try {
40+
return parent::__call($name, $params);
41+
} catch (UnknownMethodException $e) {
42+
return call_user_func_array([$this->mailer, $name], $params);
43+
}
44+
}
45+
46+
/**
47+
* @param string $name
48+
* @return mixed
49+
*/
50+
public function __get($name)
51+
{
52+
try {
53+
return parent::__get($name);
54+
} catch (UnknownPropertyException $e) {
55+
return $this->mailer->{$name};
56+
}
57+
}
58+
59+
/**
60+
* @param string $name
61+
* @param mixed $value
62+
*/
63+
public function __set($name, $value)
64+
{
65+
try {
66+
parent::__set($name, $value);
67+
} catch (UnknownPropertyException $e) {
68+
$this->mailer->{$name} = $value;
69+
}
70+
}
71+
72+
/**
73+
* @inheritdoc
74+
*/
75+
public function compose($view = null, array $params = [])
76+
{
77+
$message = $this->mailer->compose($view, $params);
78+
$message->mailer = $this;
79+
return $message;
80+
}
81+
1582
protected function sendMessage($message)
1683
{
1784
call_user_func($this->callback, $message);
1885
return true;
1986
}
20-
87+
2188
protected function saveMessage($message)
2289
{
2390
call_user_func($this->callback, $message);

0 commit comments

Comments
 (0)