diff --git a/src/SilverStripe/BehatExtension/Utility/TestMailer.php b/src/SilverStripe/BehatExtension/Utility/TestMailer.php index 1e5dfaa..4495e1c 100644 --- a/src/SilverStripe/BehatExtension/Utility/TestMailer.php +++ b/src/SilverStripe/BehatExtension/Utility/TestMailer.php @@ -4,20 +4,25 @@ namespace SilverStripe\BehatExtension\Utility; /** * Same principle as core TestMailer class, - * but saves emails in the database instead in order + * but saves emails in {@link TestSessionEnvironment} * to share the state between PHP calls (CLI vs. browser). */ class TestMailer extends \Mailer { - protected $table = '_Behat_TestMailer'; + /** + * @var TestSessionEnvironment + */ + protected $testSessionEnvironment; + + public function __construct() { + $this->testSessionEnvironment = \Injector::inst()->get('TestSessionEnvironment'); + } /** * Send a plain-text email. * TestMailer will merely record that the email was asked to be sent, without sending anything. */ public function sendPlain($to, $from, $subject, $plainContent, $attachedFiles = false, $customHeaders = false) { - $this->initTable(); - $this->saveEmail(array( 'Type' => 'plain', 'To' => $to, @@ -39,8 +44,6 @@ class TestMailer extends \Mailer { public function sendHTML($to, $from, $subject, $htmlContent, $attachedFiles = false, $customHeaders = false, $plainContent = false, $inlineImages = false) { - $this->initTable(); - $this->saveEmail(array( 'Type' => 'html', 'To' => $to, @@ -59,10 +62,9 @@ class TestMailer extends \Mailer { * Clear the log of emails sent */ public function clearEmails() { - $this->initTable(); - - $db = $this->getDb(); - $db->query(sprintf('TRUNCATE TABLE "%s"', $this->table)); + $state = $this->testSessionEnvironment->getState(); + if(isset($state->emails)) unset($state->emails); + $this->testSessionEnvironment->persistState(); } /** @@ -94,11 +96,9 @@ class TestMailer extends \Mailer { */ public function findEmails($to = null, $from = null, $subject = null, $content = null) { $matches = array(); - - $this->initTable(); $args = func_get_args(); - $db = $this->getDb(); - $emails = $db->query(sprintf('SELECT * FROM "%s"', $this->table)); + $state = $this->testSessionEnvironment->getState(); + $emails = isset($state->emails) ? $state->emails : array(); foreach($emails as $email) { $matched = true; @@ -116,41 +116,11 @@ class TestMailer extends \Mailer { return $matches; } - protected function initTable() { - $db = $this->getDb(); - if(!$db->hasTable($this->table)) { - $db->beginSchemaUpdate(); - $db->requireTable($this->table, array( - 'Type' => 'Enum("plain,html")', - 'From' => 'Text', - 'To' => 'Text', - 'Subject' => 'Text', - 'Content' => 'Text', - 'PlainContent' => 'Text', - 'AttachedFiles' => 'Text', - 'CustomHeaders' => 'Text', - )); - $db->endSchemaUpdate(); - } - } - protected function saveEmail($data) { - $db = $this->getDb(); - $data = array_filter($data); - $manipulation = array( - $this->table => array( - 'command' => 'insert', - 'fields' => array() - ) - ); - foreach($data as $k => $v) { - $manipulation[$this->table]['fields'][$k] = $db->prepStringForDB($v); - } - $db->manipulate($manipulation); - } - - protected function getDb() { - return \DB::getConn(); + $state = $this->testSessionEnvironment->getState(); + if(!isset($state->emails)) $state->emails = array(); + $state->emails[] = array_filter($data); + $this->testSessionEnvironment->persistState(); } }