summaryrefslogtreecommitdiff
path: root/vendor/swiftmailer/swiftmailer/tests
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/swiftmailer/swiftmailer/tests')
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php62
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/StreamCollector.php11
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php46
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php34
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-2022-jp/one.txt11
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-8859-1/one.txt19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/one.txt22
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/three.txt45
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/two.txt3
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.priv15
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.pub6
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/files/data.txt1
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.pngbin0 -> 3194 bytes
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zipbin0 -> 202 bytes
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/CA.srl1
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.crt21
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.key27
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/create-cert.sh40
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.crt19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.key27
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.crt19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.key27
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.crt19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.key27
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.crt19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.key27
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.crt19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.key27
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default37
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/AttachmentAcceptanceTest.php12
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/ByteStream/FileByteStreamAcceptanceTest.php162
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php179
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php24
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php12
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Base64EncoderAcceptanceTest.php45
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php54
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php50
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EncodingAcceptanceTest.php30
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php173
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php173
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php55
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php123
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php56
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php88
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php88
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php160
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php136
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php32
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php127
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php1249
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php15
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php131
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php33
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php26
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php67
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php40
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php39
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bootstrap.php21
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php42
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php20
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php38
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php21
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php75
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php73
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php192
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php38
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php110
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php38
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php36
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php20
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php71
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php19
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php67
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default63
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/AttachmentSmokeTest.php33
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php23
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php31
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php40
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php201
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php43
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php52
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php65
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php358
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php176
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php173
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php400
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php141
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php34
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php32
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php38
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php97
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php142
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php30
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php41
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php240
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php73
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php42
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php145
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php129
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php1092
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php318
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php323
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php171
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php516
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php55
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php13
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php221
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php69
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php189
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php327
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php398
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php77
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php355
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php231
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php166
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php737
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php827
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php9
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/AntiFloodPluginTest.php93
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php128
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php267
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php188
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php65
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php24
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php101
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php183
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php86
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php64
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php54
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php102
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php225
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php45
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php554
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php129
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php36
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php59
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php558
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php1249
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php64
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php64
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php213
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php67
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php165
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php529
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php297
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php518
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php749
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/MailTransportTest.php533
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php151
-rw-r--r--vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php43
150 files changed, 21430 insertions, 0 deletions
diff --git a/vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php b/vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php
new file mode 100644
index 0000000..069d11a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/IdenticalBinaryConstraint.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * A binary safe string comparison.
+ *
+ * @author Chris Corbyn
+ */
+class IdenticalBinaryConstraint extends \PHPUnit_Framework_Constraint
+{
+ protected $value;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ /**
+ * Evaluates the constraint for parameter $other. Returns TRUE if the
+ * constraint is met, FALSE otherwise.
+ *
+ * @param mixed $other Value or object to evaluate.
+ *
+ * @return bool
+ */
+ public function matches($other)
+ {
+ $aHex = $this->asHexString($this->value);
+ $bHex = $this->asHexString($other);
+
+ return $aHex === $bHex;
+ }
+
+ /**
+ * Returns a string representation of the constraint.
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return 'indentical binary';
+ }
+
+ /**
+ * Get the given string of bytes as a stirng of Hexadecimal sequences.
+ *
+ * @param string $binary
+ *
+ * @return string
+ */
+ private function asHexString($binary)
+ {
+ $hex = '';
+
+ $bytes = unpack('H*', $binary);
+
+ foreach ($bytes as &$byte) {
+ $byte = strtoupper($byte);
+ }
+
+ return implode('', $bytes);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/StreamCollector.php b/vendor/swiftmailer/swiftmailer/tests/StreamCollector.php
new file mode 100644
index 0000000..7f079d9
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/StreamCollector.php
@@ -0,0 +1,11 @@
+<?php
+
+class Swift_StreamCollector
+{
+ public $content = '';
+
+ public function __invoke($arg)
+ {
+ $this->content .= $arg;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php
new file mode 100644
index 0000000..71c5713
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerSmokeTestCase.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Base test for smoke tests.
+ *
+ * @author Rouven Weßling
+ */
+class SwiftMailerSmokeTestCase extends SwiftMailerTestCase
+{
+ protected function setUp()
+ {
+ if (!defined('SWIFT_SMOKE_TRANSPORT_TYPE')) {
+ $this->markTestSkipped(
+ 'Smoke tests are skipped if tests/smoke.conf.php is not edited'
+ );
+ }
+ }
+
+ protected function _getMailer()
+ {
+ switch (SWIFT_SMOKE_TRANSPORT_TYPE) {
+ case 'smtp':
+ $transport = Swift_DependencyContainer::getInstance()->lookup('transport.smtp')
+ ->setHost(SWIFT_SMOKE_SMTP_HOST)
+ ->setPort(SWIFT_SMOKE_SMTP_PORT)
+ ->setUsername(SWIFT_SMOKE_SMTP_USER)
+ ->setPassword(SWIFT_SMOKE_SMTP_PASS)
+ ->setEncryption(SWIFT_SMOKE_SMTP_ENCRYPTION)
+ ;
+ break;
+ case 'sendmail':
+ $transport = Swift_DependencyContainer::getInstance()->lookup('transport.sendmail')
+ ->setCommand(SWIFT_SMOKE_SENDMAIL_COMMAND)
+ ;
+ break;
+ case 'mail':
+ case 'nativemail':
+ $transport = Swift_DependencyContainer::getInstance()->lookup('transport.mail');
+ break;
+ default:
+ throw new Exception('Undefined transport ['.SWIFT_SMOKE_TRANSPORT_TYPE.']');
+ }
+
+ return new Swift_Mailer($transport);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php
new file mode 100644
index 0000000..f0e2736
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/SwiftMailerTestCase.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * A base test case with some custom expectations.
+ *
+ * @author Rouven Weßling
+ */
+class SwiftMailerTestCase extends \PHPUnit_Framework_TestCase
+{
+ public static function regExp($pattern)
+ {
+ if (!is_string($pattern)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+ }
+
+ return new PHPUnit_Framework_Constraint_PCREMatch($pattern);
+ }
+
+ public function assertIdenticalBinary($expected, $actual, $message = '')
+ {
+ $constraint = new IdenticalBinaryConstraint($expected);
+ self::assertThat($actual, $constraint, $message);
+ }
+
+ protected function tearDown()
+ {
+ \Mockery::close();
+ }
+
+ protected function getMockery($class)
+ {
+ return \Mockery::mock($class);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-2022-jp/one.txt b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-2022-jp/one.txt
new file mode 100644
index 0000000..c2923de
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-2022-jp/one.txt
@@ -0,0 +1,11 @@
+ISO-2022-JPは、インターネット上(特に電子メール)などで使われる日本の文字用の文字符号化方式。ISO/IEC 2022のエスケープシーケンスを利用して文字集合を切り替える7ビットのコードであることを特徴とする (アナウンス機能のエスケープシーケンスは省略される)。俗に「JISコード」と呼ばれることもある。
+
+概要
+日本語表記への利用が想定されている文字コードであり、日本語の利用されるネットワークにおいて、日本の規格を応用したものである。また文字集合としては、日本語で用いられる漢字、ひらがな、カタカナはもちろん、ラテン文字、ギリシア文字、キリル文字なども含んでおり、学術や産業の分野での利用も考慮たものとなっている。規格名に、ISOの日本語の言語コードであるjaではなく、国・地域名コードのJPが示されているゆえんである。
+文字集合としてJIS X 0201のC0集合(制御文字)、JIS X 0201のラテン文字集合、ISO 646の国際基準版図形文字、JIS X 0208の1978年版(JIS C 6226-1978)と1983年および1990年版が利用できる。JIS X 0201の片仮名文字集合は利用できない。1986年以降、日本の電子メールで用いられてきたJUNETコードを、村井純・Mark Crispin・Erik van der Poelが1993年にRFC化したもの(RFC 1468)。後にJIS X 0208:1997の附属書2としてJISに規定された。MIMEにおける文字符号化方式の識別用の名前として IANA に登録されている。
+なお、符号化の仕様についてはISO/IEC 2022#ISO-2022-JPも参照。
+
+ISO-2022-JPと非標準的拡張使用
+「JISコード」(または「ISO-2022-JP」)というコード名の規定下では、その仕様通りの使用が求められる。しかし、Windows OS上では、実際にはCP932コード (MicrosoftによるShift JISを拡張した亜種。ISO-2022-JP規定外文字が追加されている。)による独自拡張(の文字)を断りなく使うアプリケーションが多い。この例としてInternet ExplorerやOutlook Expressがある。また、EmEditor、秀丸エディタやThunderbirdのようなMicrosoft社以外のWindowsアプリケーションでも同様の場合がある。この場合、ISO-2022-JPの範囲外の文字を使ってしまうと、異なる製品間では未定義不明文字として認識されるか、もしくは文字化けを起こす原因となる。そのため、Windows用の電子メールクライアントであっても独自拡張の文字を使用すると警告を出したり、あえて使えないように制限しているものも存在する。さらにはISO-2022-JPの範囲内であってもCP932は非標準文字(FULLWIDTH TILDE等)を持つので文字化けの原因になり得る。
+また、符号化方式名をISO-2022-JPとしているのに、文字集合としてはJIS X 0212 (いわゆる補助漢字) やJIS X 0201の片仮名文字集合 (いわゆる半角カナ) をも符号化している例があるが、ISO-2022-JPではこれらの文字を許容していない。これらの符号化は独自拡張の実装であり、中にはISO/IEC 2022の仕様に準拠すらしていないものもある[2]。従って受信側の電子メールクライアントがこれらの独自拡張に対応していない場合、その文字あるいはその文字を含む行、時にはテキスト全体が文字化けすることがある。
+
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-8859-1/one.txt b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-8859-1/one.txt
new file mode 100644
index 0000000..3101178
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/iso-8859-1/one.txt
@@ -0,0 +1,19 @@
+Op mat eraus hinnen beschte, rou zënne schaddreg ké. Ké sin Eisen Kaffi prächteg, den haut esou Fielse wa, Well zielen d'Welt am dir. Aus grousse rëschten d'Stroos do, as dat Kléder gewëss d'Kàchen. Schied gehéiert d'Vioule net hu, rou ke zënter Säiten d'Hierz. Ze eise Fletschen mat, gei as gréng d'Lëtzebuerger. Wäit räich no mat.
+
+Säiten d'Liewen aus en. Un gëtt bléit lossen wee, da wéi alle weisen Kolrettchen. Et deser d'Pan d'Kirmes vun, en wuel Benn rëschten méi. En get drem ménger beschte, da wär Stad welle. Nun Dach d'Pied do, mä gét ruffen gehéiert. Ze onser ugedon fir, d'Liewen Plett'len ech no, si Räis wielen bereet wat. Iwer spilt fir jo.
+
+An hin däischter Margréitchen, eng ke Frot brommt, vu den Räis néierens. Da hir Hunn Frot nozegon, rout Fläiß Himmel zum si, net gutt Kaffi Gesträich fu. Vill lait Gaart sou wa, Land Mamm Schuebersonndeg rei do. Gei geet Minutt en, gei d'Leit beschte Kolrettchen et, Mamm fergiess un hun.
+
+Et gutt Heck kommen oft, Lann rëscht rei um, Hunn rëscht schéinste ke der. En lait zielen schnéiwäiss hir, fu rou botze éiweg Minutt, rem fest gudden schaddreg en. Noper bereet Margréitchen mat op, dem denkt d'Leit d'Vioule no, oft ké Himmel Hämmel. En denkt blénken Fréijor net, Gart Schiet d'Natur no wou. No hin Ierd Frot d'Kirmes. Hire aremt un rou, ké den éiweg wielen Milliounen.
+
+Mir si Hunn Blénkeg. Ké get ston derfir d'Kàchen. Haut d'Pan fu ons, dé frou löschteg d'Meereische rei. Sou op wuel Léift. Stret schlon grousse gin hu. Mä denkt d'Leit hinnen net, ké gét haut fort rëscht.
+
+Koum d'Pan hannendrun ass ké, ké den brét Kaffi geplot. Schéi Hären d'Pied fu gét, do d'Mier néierens bei. Rëm päift Hämmel am, wee Engel beschéngt mä. Brommt klinzecht der ke, wa rout jeitzt dén. Get Zalot d'Vioule däischter da, jo fir Bänk päift duerch, bei d'Beem schéinen Plett'len jo. Den haut Faarwen ze, eng en Biereg Kirmesdag, um sin alles Faarwen d'Vioule.
+
+Eng Hunn Schied et, wat wa Frot fest gebotzt. Bei jo bleiwe ruffen Klarinett. Un Feld klinzecht gét, rifft Margréitchen rem ke. Mir dé Noper duurch gewëss, ston sech kille sin en. Gei Stret d'Wise um, Haus Gart wee as. Monn ménger an blo, wat da Gart gefällt Hämmelsbrot.
+
+Brommt geplot och ze, dat wa Räis Well Kaffi. Do get spilt prächteg, as wär kille bleiwe gewalteg. Onser frësch Margréitchen rem ke, blo en huet ugedon. Onser Hemecht wär de, hu eraus d'Sonn dat, eise deser hannendrun da och.
+
+As durch Himmel hun, no fest iw'rem schéinste mir, Hunn séngt Hierz ke zum. Séngt iw'rem d'Natur zum an. Ke wär gutt Grénge. Kënnt gudden prächteg mä rei. Dé dir Blénkeg Klarinett Kolrettchen, da fort muerges d'Kanner wou, main Feld ruffen vu wéi. Da gin esou Zalot gewalteg, gét vill Hemecht blénken dé.
+
+Haut gréng nun et, nei vu Bass gréng d'Gaassen. Fest d'Beem uechter si gin. Oft vu sinn wellen kréien. Et ass lait Zalot schéinen. \ No newline at end of file
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/one.txt b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/one.txt
new file mode 100644
index 0000000..26c94d5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/one.txt
@@ -0,0 +1,22 @@
+Код одно гринспана руководишь на. Его вы знания движение. Ты две начать
+одиночку, сказать основатель удовольствием но миф. Бы какие система тем.
+Полностью использует три мы, человек клоунов те нас, бы давать творческую
+эзотерическая шеф.
+
+Мог не помнить никакого сэкономленного, две либо какие пишите бы. Должен
+компанию кто те, этот заключалась проектировщик не ты. Глупые периоды ты
+для. Вам который хороший он. Те любых кремния концентрируются мог,
+собирать принадлежите без вы.
+
+Джоэла меньше хорошего вы миф, за тем году разработки. Даже управляющим
+руководители был не. Три коде выпускать заботиться ну. То его система
+удовольствием безостановочно, или ты главной процессорах. Мы без джоэл
+знания получат, статьи остальные мы ещё.
+
+Них русском касается поскольку по, образование должником
+систематизированный ну мои. Прийти кандидата университет но нас, для бы
+должны никакого, биг многие причин интервьюирования за.
+
+Тем до плиту почему. Вот учёт такие одного бы, об биг разным внешних
+промежуток. Вас до какому возможностей безответственный, были погодите бы
+его, по них глупые долгий количества.
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/three.txt b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/three.txt
new file mode 100644
index 0000000..c81ccd5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/three.txt
@@ -0,0 +1,45 @@
+Αν ήδη διάβασε γλιτώσει μεταγλωτίσει, αυτήν θυμάμαι μου μα. Την κατάσταση χρησιμοποίησέ να! Τα διαφορά φαινόμενο διολισθήσεις πες, υψηλότερη προκαλείς περισσότερες όχι κι. Με ελέγχου γίνεται σας, μικρής δημιουργούν τη του. Τις τα γράψει εικόνες απαράδεκτη?
+
+Να ότι πρώτοι απαραίτητο. Άμεση πετάνε κακόκεφος τον ώς, να χώρου πιθανότητες του. Το μέχρι ορίστε λιγότερους σας. Πω ναί φυσικά εικόνες.
+
+Μου οι κώδικα αποκλειστικούς, λες το μάλλον συνεχώς. Νέου σημεία απίστευτα σας μα. Χρόνου μεταγλωτιστής σε νέα, τη τις πιάνει μπορούσες προγραμματιστές. Των κάνε βγαίνει εντυπωσιακό τα? Κρατάει τεσσαρών δυστυχώς της κι, ήδη υψηλότερη εξακολουθεί τα?
+
+Ώρα πετάνε μπορούσε λιγότερους αν, τα απαράδεκτη συγχωνευτεί ροή. Τη έγραψες συνηθίζουν σαν. Όλα με υλικό στήλες χειρότερα. Ανώδυνη δουλέψει επί ως, αν διαδίκτυο εσωτερικών παράγοντες από. Κεντρικό επιτυχία πες το.
+
+Πω ναι λέει τελειώσει, έξι ως έργων τελειώσει. Με αρχεία βουτήξουν ανταγωνιστής ώρα, πολύ γραφικά σελίδων τα στη. Όρο οέλεγχος δημιουργούν δε, ας θέλεις ελέγχου συντακτικό όρο! Της θυμάμαι επιδιόρθωση τα. Για μπορούσε περισσότερο αν, μέγιστη σημαίνει αποφάσισε τα του, άτομο αποτελέσει τι στα.
+
+Τι στην αφήσεις διοίκηση στη. Τα εσφαλμένη δημιουργια επιχείριση έξι! Βήμα μαγικά εκτελέσει ανά τη. Όλη αφήσεις συνεχώς εμπορικά αν, το λες κόλπα επιτυχία. Ότι οι ζώνη κειμένων. Όρο κι ρωτάει γραμμής πελάτες, τελειώσει διολισθήσεις καθυστερούσε αν εγώ? Τι πετούν διοίκηση προβλήματα ήδη.
+
+Τη γλιτώσει αποθηκευτικού μια. Πω έξι δημιουργια πιθανότητες, ως πέντε ελέγχους εκτελείται λες. Πως ερωτήσεις διοικητικό συγκεντρωμένοι οι, ας συνεχώς διοικητικό αποστηθίσει σαν. Δε πρώτες συνεχώς διολισθήσεις έχω, από τι κανένας βουτήξουν, γειτονιάς προσεκτικά ανταγωνιστής κι σαν.
+
+Δημιουργια συνηθίζουν κλπ τι? Όχι ποσοστό διακοπής κι. Κλπ φακέλους δεδομένη εξοργιστικά θα? Υποψήφιο καθορίζουν με όλη, στα πήρε προσοχή εταιρείες πω, ώς τον συνάδελφος διοικητικό δημιουργήσεις! Δούλευε επιτίθενται σας θα, με ένας παραγωγικής ένα, να ναι σημεία μέγιστη απαράδεκτη?
+
+Σας τεσσαρών συνεντεύξης τη, αρπάζεις σίγουρος μη για', επί τοπικές εντολές ακούσει θα? Ως δυστυχής μεταγλωτιστής όλη, να την είχαν σφάλμα απαραίτητο! Μην ώς άτομο διορθώσει χρησιμοποιούνταν. Δεν τα κόλπα πετάξαμε, μη που άγχος υόρκη άμεση, αφού δυστυχώς διακόψουμε όρο αν! Όλη μαγικά πετάνε επιδιορθώσεις δε, ροή φυσικά αποτελέσει πω.
+
+Άπειρα παραπάνω φαινόμενο πω ώρα, σαν πόρτες κρατήσουν συνηθίζουν ως. Κι ώρα τρέξει είχαμε εφαρμογή. Απλό σχεδιαστής μεταγλωτιστής ας επί, τις τα όταν έγραψες γραμμής? Όλα κάνεις συνάδελφος εργαζόμενοι θα, χαρτιού χαμηλός τα ροή. Ως ναι όροφο έρθει, μην πελάτες αποφάσισε μεταφραστής με, να βιαστικά εκδόσεις αναζήτησης λες. Των φταίει εκθέσεις προσπαθήσεις οι, σπίτι αποστηθίσει ας λες?
+
+Ώς που υπηρεσία απαραίτητο δημιουργείς. Μη άρα χαρά καθώς νύχτας, πω ματ μπουν είχαν. Άμεση δημιουργείς ώς ροή, γράψει γραμμής σίγουρος στα τι! Αν αφού πρώτοι εργαζόμενων ναί.
+
+Άμεση διορθώσεις με δύο? Έχουν παράδειγμα των θα, μου έρθει θυμάμαι περισσότερο το. Ότι θα αφού χρειάζονται περισσότερες. Σαν συνεχώς περίπου οι.
+
+Ώς πρώτης πετάξαμε λες, όρο κι πρώτες ζητήσεις δυστυχής. Ανά χρόνου διακοπή επιχειρηματίες ας, ώς μόλις άτομο χειρότερα όρο, κρατάει σχεδιαστής προσπαθήσεις νέο το. Πουλάς προσθέσει όλη πω, τύπου χαρακτηριστικό εγώ σε, πω πιο δούλευε αναζήτησης? Αναφορά δίνοντας σαν μη, μάθε δεδομένη εσωτερικών με ναι, αναφέρονται περιβάλλοντος ώρα αν. Και λέει απόλαυσε τα, που το όροφο προσπαθούν?
+
+Πάντα χρόνου χρήματα ναι το, σαν σωστά θυμάμαι σκεφτείς τα. Μα αποτελέσει ανεπιθύμητη την, πιο το τέτοιο ατόμου, τη των τρόπο εργαλείων επιδιόρθωσης. Περιβάλλον παραγωγικής σου κι, κλπ οι τύπου κακόκεφους αποστηθίσει, δε των πλέον τρόποι. Πιθανότητες χαρακτηριστικών σας κι, γραφικά δημιουργήσεις μια οι, πω πολλοί εξαρτάται προσεκτικά εδώ. Σταματάς παράγοντες για' ώς, στις ρωτάει το ναι! Καρέκλα ζητήσεις συνδυασμούς τη ήδη!
+
+Για μαγικά συνεχώς ακούσει το. Σταματάς προϊόντα βουτήξουν ώς ροή. Είχαν πρώτες οι ναι, μα λες αποστηθίσει ανακαλύπτεις. Όροφο άλγεβρα παραπάνω εδώ τη, πρόσληψη λαμβάνουν καταλάθος ήδη ας? Ως και εισαγωγή κρατήσουν, ένας κακόκεφους κι μας, όχι κώδικάς παίξουν πω. Πω νέα κρατάει εκφράσουν, τότε τελικών τη όχι, ας της τρέξει αλλάζοντας αποκλειστικούς.
+
+Ένας βιβλίο σε άρα, ναι ως γράψει ταξινομεί διορθώσεις! Εδώ να γεγονός συγγραφείς, ώς ήδη διακόψουμε επιχειρηματίες? Ότι πακέτων εσφαλμένη κι, θα όρο κόλπα παραγωγικής? Αν έχω κεντρικό υψηλότερη, κι δεν ίδιο πετάνε παρατηρούμενη! Που λοιπόν σημαντικό μα, προκαλείς χειροκροτήματα ως όλα, μα επί κόλπα άγχος γραμμές! Δε σου κάνεις βουτήξουν, μη έργων επενδυτής χρησιμοποίησέ στα, ως του πρώτες διάσημα σημαντικό.
+
+Βιβλίο τεράστιο προκύπτουν σαν το, σαν τρόπο επιδιόρθωση ας. Είχαν προσοχή προσπάθεια κι ματ, εδώ ως έτσι σελίδων συζήτηση. Και στην βγαίνει εσφαλμένη με, δυστυχής παράδειγμα δε μας, από σε υόρκη επιδιόρθωσης. Νέα πω νέου πιθανό, στήλες συγγραφείς μπαίνοντας μα για', το ρωτήσει κακόκεφους της? Μου σε αρέσει συγγραφής συγχωνευτεί, μη μου υόρκη ξέχασε διακοπής! Ώς επί αποφάσισε αποκλειστικούς χρησιμοποιώντας, χρήματα σελίδων ταξινομεί ναι με.
+
+Μη ανά γραμμή απόλαυσε, πω ναι μάτσο διασφαλίζεται. Τη έξι μόλις εργάστηκε δημιουργούν, έκδοση αναφορά δυσκολότερο οι νέο. Σας ως μπορούσε παράδειγμα, αν ότι δούλευε μπορούσε αποκλειστικούς, πιο λέει βουτήξουν διορθώσει ως. Έχω τελευταία κακόκεφους ας, όσο εργαζόμενων δημιουργήσεις τα.
+
+Του αν δουλέψει μπορούσε, πετούν χαμηλός εδώ ας? Κύκλο τύπους με που, δεν σε έχουν συνεχώς χειρότερα, τις τι απαράδεκτη συνηθίζουν? Θα μην τους αυτήν, τη ένα πήρε πακέτων, κι προκύπτουν περιβάλλον πως. Μα για δουλέψει απόλαυσε εφαμοργής, ώς εδώ σημαίνει μπορούσες, άμεση ακούσει προσοχή τη εδώ?
+
+Στα δώσε αθόρυβες λιγότερους οι, δε αναγκάζονται αποκλειστικούς όλα! Ας μπουν διοικητικό μια, πάντα ελέγχου διορθώσεις ώς τον. Ότι πήρε κανόνα μα. Που άτομα κάνεις δημιουργίες τα, οι μας αφού κόλπα προγραμματιστής, αφού ωραίο προκύπτουν στα ως. Θέμα χρησιμοποιήσει αν όλα, του τα άλγεβρα σελίδων. Τα ότι ανώδυνη δυστυχώς συνδυασμούς, μας οι πάντα γνωρίζουμε ανταγωνιστής, όχι τα δοκιμάσεις σχεδιαστής! Στην συνεντεύξης επιδιόρθωση πιο τα, μα από πουλάς περιβάλλον παραγωγικής.
+
+Έχουν μεταγλωτίσει σε σας, σε πάντα πρώτης μειώσει των, γράψει ρουτίνα δυσκολότερο ήδη μα? Ταξινομεί διορθώσεις να μας. Θα της προσπαθούν περιεχόμενα, δε έχω τοπικές στέλνοντάς. Ανά δε αλφα άμεση, κάποιο ρωτάει γνωρίζουμε πω στη, φράση μαγικά συνέχεια δε δύο! Αν είχαμε μειώσει ροή, μας μετράει καθυστερούσε επιδιορθώσεις μη. Χάος υόρκη κεντρικό έχω σε, ανά περίπου αναγκάζονται πω.
+
+Όσο επιστρέφουν χρονοδιαγράμματα μη. Πως ωραίο κακόκεφος διαχειριστής ως, τις να διακοπής αναζήτησης. Κάποιο ποσοστό ταξινομεί επί τη? Μάθε άμεση αλλάζοντας δύο με, μου νέου πάντα να.
+
+Πω του δυστυχώς πιθανότητες. Κι ρωτάει υψηλότερη δημιουργια ότι, πω εισαγωγή τελευταία απομόνωση ναι. Των ζητήσεις γνωρίζουμε ώς? Για' μη παραδοτέου αναφέρονται! Ύψος παραγωγικά ροή ως, φυσικά διάβασε εικόνες όσο σε? Δεν υόρκη διορθώσεις επεξεργασία θα, ως μέση σύστημα χρησιμοποιήσει τις. \ No newline at end of file
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/two.txt b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/two.txt
new file mode 100644
index 0000000..2443fc4
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/charsets/utf-8/two.txt
@@ -0,0 +1,3 @@
+रखति आवश्यकत प्रेरना मुख्यतह हिंदी किएलोग असक्षम कार्यलय करते विवरण किके मानसिक दिनांक पुर्व संसाध एवम् कुशलता अमितकुमार प्रोत्साहित जनित देखने उदेशीत विकसित बलवान ब्रौशर किएलोग विश्लेषण लोगो कैसे जागरुक प्रव्रुति प्रोत्साहित सदस्य आवश्यकत प्रसारन उपलब्धता अथवा हिंदी जनित दर्शाता यन्त्रालय बलवान अतित सहयोग शुरुआत सभीकुछ माहितीवानीज्य लिये खरिदे है।अभी एकत्रित सम्पर्क रिती मुश्किल प्राथमिक भेदनक्षमता विश्व उन्हे गटको द्वारा तकरीबन
+
+विश्व द्वारा व्याख्या सके। आजपर वातावरण व्याख्यान पहोच। हमारी कीसे प्राथमिक विचारशिलता पुर्व करती कम्प्युटर भेदनक्षमता लिये बलवान और्४५० यायेका वार्तालाप सुचना भारत शुरुआत लाभान्वित पढाए संस्था वर्णित मार्गदर्शन चुनने \ No newline at end of file
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.priv b/vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.priv
new file mode 100644
index 0000000..3bd381a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.priv
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQDZeUdi1RKnm9cRYNn6E24xxrRTouh3Va8JOEHQ5SB018lvbjwH
+2lW5mZ/I0kh/dHsTN0zcN0VE62WIbnLreMk/af/4Pg1i93+c9TmfXmoropsmdLos
+w0tjq50jGbBqtHZNJYAokP/u3uUuRw8g0V/O4zlQ3GlO/PDH7xDQzekl9wIDAQAB
+AoGAaoCBXD5a72hbb/BNb7HaUlgscZUjYWW93bcGTGYZef8/b+m9Tl83gjhgzvlk
+db62k1eOtX3/11uskp78eqLhctv7yWc0mQQhgOogY2qCwHTCH8wja8kJkUAnKQhs
+P9sa5iJvgckiuX3SdxgTMwib9d1VyGq6YywiORiZF9rxyhECQQD/xhiZSi7y0ciB
+g4bassy0GVMS7EDRumMHc8wC23E1H2mj5yPE/QLqkW4ddmCv2BbJnYmyNvOaK9tk
+T2W+mn3/AkEA2aqDGja9CaTlY4BCXfiT166n+xVl5+d+1DENQ4FK9O2jpSi1265J
+tjEkXVxUOpV1ZEcUVOdK6RpvsKpc7vVICQJBALEFO5UsQJ4SD0GD9Ft8kCy9sj9Q
+f/Qnmc5YmIQJuKpZmVW07Y6yxcfu61U8zuIlHnBftiM/4Q18+RTN1s86QaUCQHoL
+9MTfCnH85q46/XuJZQRbp07O+bvlfqTl+CTwuyHImaiCwi2ydRxWQ6ihm4zZvuAC
+RvEwWz2HGDc73y4RlFkCQDDdnN9e46l1nMDLDI4cyyGBVg4Z2IZ3IAu5GaoUCGjM
+a8w6kxE8f1d8DD5vvqVbmfK89TA/DjT+7/arBNBCiCM=
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.pub b/vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.pub
new file mode 100644
index 0000000..b503a91
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/dkim/dkim.test.pub
@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZeUdi1RKnm9cRYNn6E24xxrRT
+ouh3Va8JOEHQ5SB018lvbjwH2lW5mZ/I0kh/dHsTN0zcN0VE62WIbnLreMk/af/4
+Pg1i93+c9TmfXmoropsmdLosw0tjq50jGbBqtHZNJYAokP/u3uUuRw8g0V/O4zlQ
+3GlO/PDH7xDQzekl9wIDAQAB
+-----END PUBLIC KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/files/data.txt b/vendor/swiftmailer/swiftmailer/tests/_samples/files/data.txt
new file mode 100644
index 0000000..3f35021
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/files/data.txt
@@ -0,0 +1 @@
+<data> \ No newline at end of file
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png b/vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png
new file mode 100644
index 0000000..1b95f61
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/files/swiftmailer.png
Binary files differ
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip b/vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip
new file mode 100644
index 0000000..5a580ec
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/files/textfile.zip
Binary files differ
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/CA.srl b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/CA.srl
new file mode 100644
index 0000000..dd9818a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/CA.srl
@@ -0,0 +1 @@
+D42DA34CF90FA0DE
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.crt b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.crt
new file mode 100644
index 0000000..695f814
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDazCCAlOgAwIBAgIJAKJCGQYLxWT1MA0GCSqGSIb3DQEBBQUAMEwxFzAVBgNV
+BAMMDlN3aWZ0bWFpbGVyIENBMRQwEgYDVQQKDAtTd2lmdG1haWxlcjEOMAwGA1UE
+BwwFUGFyaXMxCzAJBgNVBAYTAkZSMB4XDTEzMTEyNzA4MzkxMFoXDTE3MTEyNjA4
+MzkxMFowTDEXMBUGA1UEAwwOU3dpZnRtYWlsZXIgQ0ExFDASBgNVBAoMC1N3aWZ0
+bWFpbGVyMQ4wDAYDVQQHDAVQYXJpczELMAkGA1UEBhMCRlIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC7RLdHE3OWo9aZwv1xA/cYyPui/gegxpTqClRp
+gGcVQ+jxIfnJQDQndyoAvFDiqOiZ+gAjZGJeUHDp9C/2IZp05MLh+omt9N8pBykm
+3nj/3ZwPXOAO0uyDPAOHhISITAxEuZCqDnq7iYujywtwfQ7bpW1hCK9PfNZYMStM
+kw7LsGr5BqcKkPuOWTvxE3+NqK8HxydYolsoApEGhgonyImVh1Pg1Kjkt5ojvwAX
+zOdjfw5poY5NArwuLORUH+XocetRo8DC6S42HkU/MoqcYxa9EuRuwuQh7GtE6baR
+PgrDsEYaY4Asy43sK81V51F/8Q1bHZKN/goQdxQwzv+/nOLTAgMBAAGjUDBOMB0G
+A1UdDgQWBBRHgqkl543tKhsVAvcx1I0JFU7JuDAfBgNVHSMEGDAWgBRHgqkl543t
+KhsVAvcx1I0JFU7JuDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAz
+OJiEQcygKGkkXXDiXGBvP/cSznj3nG9FolON0yHUBgdvLfNnctRMStGzPke0siLt
+RJvjqiL0Uw+blmLJU8lgMyLJ9ctXkiLJ/WflabN7VzmwYRWe5HzafGQJAg5uFjae
+VtAAHQgvbmdXB6brWvcMQmB8di7wjVedeigZvkt1z2V0FtBy8ybJaT5H6bX9Bf5C
+dS9r4mLhk/0ThthpRhRxsmupSL6e49nJaIk9q0UTEQVnorJXPcs4SPTIY51bCp6u
+cOebhNgndSxCiy0zSD7vRjNiyB/YNGZ9Uv/3DNTLleMZ9kZgfoKVpwYKrRL0IFT/
+cfS2OV1wxRxq668qaOfK
+-----END CERTIFICATE-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.key b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.key
new file mode 100644
index 0000000..df67470
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/ca.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAu0S3RxNzlqPWmcL9cQP3GMj7ov4HoMaU6gpUaYBnFUPo8SH5
+yUA0J3cqALxQ4qjomfoAI2RiXlBw6fQv9iGadOTC4fqJrfTfKQcpJt54/92cD1zg
+DtLsgzwDh4SEiEwMRLmQqg56u4mLo8sLcH0O26VtYQivT3zWWDErTJMOy7Bq+Qan
+CpD7jlk78RN/jaivB8cnWKJbKAKRBoYKJ8iJlYdT4NSo5LeaI78AF8znY38OaaGO
+TQK8LizkVB/l6HHrUaPAwukuNh5FPzKKnGMWvRLkbsLkIexrROm2kT4Kw7BGGmOA
+LMuN7CvNVedRf/ENWx2Sjf4KEHcUMM7/v5zi0wIDAQABAoIBAGyaWkvu/O7Uz2TW
+z1JWgVuvWzfYaKYV5FCicvfITn/npVUKZikPge+NTR+mFqaMXHDHqoLb+axGrGUR
+hysPq9q0vEx/lo763tyVWYlAJh4E8Dd8njganK0zBbz23kGJEOheUYY95XGTQBda
+bqTq8c3x7zAB8GGBvXDh+wFqm38GLyMF6T+YEzWJZqXfg31f1ldRvf6+VFwlLfz6
+cvTR7oUpYIsUeGE47kBs13SN7Oju6a355o/7wy9tOCRiu+r/ikXFh8rFGLfeTiwv
+R1dhYjcEYGxZUD8u64U+Cj4qR1P0gHJL0kbh22VMMqgALOc8FpndkjNdg1Nun2X8
+BWpsPwECgYEA7C9PfTOIZfxGBlCl05rmWex++/h5E5PbH1Cw/NGjIH1HjmAkO3+5
+WyMXhySOJ8yWyCBQ/nxqc0w7+TO4C7wQcEdZdUak25KJ74v0sfmWWrVw6kcnLU6k
+oawW/L2F2w7ET3zDoxKh4fOF34pfHpSbZk7XJ68YOfHpYVnP4efkQVMCgYEAyvrM
+KA7xjnsKumWh206ag3QEI0M/9uPHWmrh2164p7w1MtawccZTxYYJ5o5SsjTwbxkf
+0cAamp4qLInmRUxU1gk76tPYC3Ndp6Yf1C+dt0q/vtzyJetCDrdz8HHT1SpKbW0l
+g6z1I5FMwa6oWvWsfS++W51vsxUheNsOJ4uxKIECgYBwM7GRiw+7U3N4wItm0Wmp
+Qp642Tu7vzwTzmOmV3klkB6UVrwfv/ewgiVFQGqAIcNn42JW44g2qfq70oQWnws4
+K80l15+t6Bm7QUPH4Qg6o4O26IKGFZxEadqpyudyP7um/2B5cfqRuvzYS4YQowyI
+N+AirB3YOUJjyyTk7yMSnQKBgGNLpSvDg6+ryWe96Bwcq8G6s3t8noHsk81LlAl4
+oOSNUYj5NX+zAbATDizXWuUKuMPgioxVaa5RyVfYbelgme/KvKD32Sxg12P4BIIM
+eR79VifMdjjOiZYhcHojdPlGovo89qkfpxwrLF1jT8CPhj4HaRvwPIBiyekRYC9A
+Sv4BAoGAXCIC1xxAJP15osUuQjcM8KdsL1qw+LiPB2+cJJ2VMAZGV7CR2K0aCsis
+OwRaYM0jZKUpxzp1uwtfrfqbhdYsv+jIBkfwoShYZuo6MhbUrj0sffkhJC3WrT2z
+xafCFLFv1idzGvvNxatlp1DNKrndG2NS3syVAox9MnL5OMsvGM8=
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/create-cert.sh b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/create-cert.sh
new file mode 100644
index 0000000..0454f20
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/create-cert.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+openssl genrsa -out CA.key 2048
+openssl req -x509 -new -nodes -key CA.key -days 1460 -subj '/CN=Swiftmailer CA/O=Swiftmailer/L=Paris/C=FR' -out CA.crt
+openssl x509 -in CA.crt -clrtrust -out CA.crt
+
+openssl genrsa -out sign.key 2048
+openssl req -new -key sign.key -subj '/CN=Swiftmailer-User/O=Swiftmailer/L=Paris/C=FR' -out sign.csr
+openssl x509 -req -in sign.csr -CA CA.crt -CAkey CA.key -out sign.crt -days 1460 -addtrust emailProtection
+openssl x509 -in sign.crt -clrtrust -out sign.crt
+
+rm sign.csr
+
+openssl genrsa -out intermediate.key 2048
+openssl req -new -key intermediate.key -subj '/CN=Swiftmailer Intermediate/O=Swiftmailer/L=Paris/C=FR' -out intermediate.csr
+openssl x509 -req -in intermediate.csr -CA CA.crt -CAkey CA.key -set_serial 01 -out intermediate.crt -days 1460
+openssl x509 -in intermediate.crt -clrtrust -out intermediate.crt
+
+rm intermediate.csr
+
+openssl genrsa -out sign2.key 2048
+openssl req -new -key sign2.key -subj '/CN=Swiftmailer-User2/O=Swiftmailer/L=Paris/C=FR' -out sign2.csr
+openssl x509 -req -in sign2.csr -CA intermediate.crt -CAkey intermediate.key -set_serial 01 -out sign2.crt -days 1460 -addtrust emailProtection
+openssl x509 -in sign2.crt -clrtrust -out sign2.crt
+
+rm sign2.csr
+
+openssl genrsa -out encrypt.key 2048
+openssl req -new -key encrypt.key -subj '/CN=Swiftmailer-User/O=Swiftmailer/L=Paris/C=FR' -out encrypt.csr
+openssl x509 -req -in encrypt.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out encrypt.crt -days 1460 -addtrust emailProtection
+openssl x509 -in encrypt.crt -clrtrust -out encrypt.crt
+
+rm encrypt.csr
+
+openssl genrsa -out encrypt2.key 2048
+openssl req -new -key encrypt2.key -subj '/CN=Swiftmailer-User2/O=Swiftmailer/L=Paris/C=FR' -out encrypt2.csr
+openssl x509 -req -in encrypt2.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out encrypt2.crt -days 1460 -addtrust emailProtection
+openssl x509 -in encrypt2.crt -clrtrust -out encrypt2.crt
+
+rm encrypt2.csr
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.crt b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.crt
new file mode 100644
index 0000000..7435855
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFjCCAf4CCQDULaNM+Q+g3TANBgkqhkiG9w0BAQUFADBMMRcwFQYDVQQDDA5T
+d2lmdG1haWxlciBDQTEUMBIGA1UECgwLU3dpZnRtYWlsZXIxDjAMBgNVBAcMBVBh
+cmlzMQswCQYDVQQGEwJGUjAeFw0xMzExMjcwODM5MTFaFw0xNzExMjYwODM5MTFa
+ME4xGTAXBgNVBAMMEFN3aWZ0bWFpbGVyLVVzZXIxFDASBgNVBAoMC1N3aWZ0bWFp
+bGVyMQ4wDAYDVQQHDAVQYXJpczELMAkGA1UEBhMCRlIwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCcNO+fVZBT2znmVwXXZ08n3G5WA1kyvqh9z4RBBZOD
+V46Gc1X9MMXr9+wzZBFkAckKaa6KsTkeUr4pC8XUBpQnakxH/kW9CaDPdOE+7wNo
+FkPfc6pjWWgpAVxdkrtk7pb4/aGQ++HUkqVu0cMpIcj/7ht7H+3QLZHybn+oMr2+
+FDnn8vPmHxVioinSrxKTlUITuLWS9ZZUTrDa0dG8UAv55A/Tba4T4McCPDpJSA4m
+9jrW321NGQUntQoItOJxagaueSvh6PveGV826gTXoU5X+YJ3I2OZUEQ2l6yByAzf
+nT+QlxPj5ikotFwL72HsenYtetynOO/k43FblAF/V/l7AgMBAAEwDQYJKoZIhvcN
+AQEFBQADggEBAJ048Sdb9Sw5OJM5L00OtGHgcT1B/phqdzSjkM/s64cg3Q20VN+F
+fZIIkOnxgyYWcpOWXcdNw2tm5OWhWPGsBcYgMac7uK/ukgoOJSjICg+TTS5kRo96
+iHtmImqkWc6WjNODh7uMnQ6DsZsscdl7Bkx5pKhgGnEdHr5GW8sztgXgyPQO5LUs
+YzCmR1RK1WoNMxwbPrGLgYdcpJw69ns5hJbZbMWwrdufiMjYWvTfBPABkk1JRCcY
+K6rRTAx4fApsw1kEIY8grGxyAzfRXLArpro7thJr0SIquZ8GpXkQT/mgRR8JD9Hp
+z9yhr98EnKzITE/yclGN4pUsuk9S3jiyzUU=
+-----END CERTIFICATE-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.key b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.key
new file mode 100644
index 0000000..aa620ca
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAnDTvn1WQU9s55lcF12dPJ9xuVgNZMr6ofc+EQQWTg1eOhnNV
+/TDF6/fsM2QRZAHJCmmuirE5HlK+KQvF1AaUJ2pMR/5FvQmgz3ThPu8DaBZD33Oq
+Y1loKQFcXZK7ZO6W+P2hkPvh1JKlbtHDKSHI/+4bex/t0C2R8m5/qDK9vhQ55/Lz
+5h8VYqIp0q8Sk5VCE7i1kvWWVE6w2tHRvFAL+eQP022uE+DHAjw6SUgOJvY61t9t
+TRkFJ7UKCLTicWoGrnkr4ej73hlfNuoE16FOV/mCdyNjmVBENpesgcgM350/kJcT
+4+YpKLRcC+9h7Hp2LXrcpzjv5ONxW5QBf1f5ewIDAQABAoIBADmuMm2botfUM+Ui
+bT3FIC2P8A5C3kUmsgEDB8sazAXL5w0uuanswKkJu2aepO1Q23PE4nbESlswIpf1
+iO9qHnsPfWt4MThEveTdO++JQrDEx/tTMq/M6/F4VysWa6wxjf4Taf2nhRSBsiTh
+wDcICri2q98jQyWELkhfFTR+yCHPsn6iNtzE2OpNv9ojKiSqck/sVjC39Z+uU/HD
+N4v0CPf9pDGkO+modaVGKf2TpvZT7Hpq/jsPzkk1h7BY7aWdZiIY4YkBkWYqZk8f
+0dsxKkOR2glfuEYNtcywG+4UGx3i1AY0mMu96hH5M1ACFmFrTCoodmWDnWy9wUpm
+leLmG8ECgYEAywWdryqcvLyhcmqHbnmUhCL9Vl4/5w5fr/5/FNvqArxSGwd2CxcN
+Jtkvu22cxWAUoe155eMc6GlPIdNRG8KdWg4sg0TN3Jb2jiHQ3QkHXUJlWU6onjP1
+g2n5h052JxVNGBEb7hr3U7ZMW6wnuYnGdYwCB9P3r5oGxxtfVRB8ygUCgYEAxPfy
+tAd3SNT8Sv/cciw76GYKbztUjJRXkLo6GOBGq/AQxP1NDWMuL2AES11YIahidMsF
+TMmM+zhkNHsd5P69p87FTMWx0cLoH0M9iQNK7Q6C1luTjLf5DTFuk+nHGErM4Drs
++6Ly1Z4KLXfXgBDD8Ce6U9+W3RrCc36poGZvjX8CgYEAna0P6WJr9r19mhIYevmc
+Gf/ex7xNXxMvx80dP8MIfPVrwyhJSpWtljVpt+SKtFRJ0fVRDfUUl4Bqf/fR74B3
+muCVO6ItTBxHAt5Ki9CeUpTlh7XqiWwLSvP8Y1TRuMr3ZDCtg4CYBAD6Ttxmwde6
+NcL2NMQwgsZaazrcEIHMmU0CgYEAl/Mn2tZ/oUIdt8YWzEVvmeNOXW0J1sGBo/bm
+ZtZt7qpuZWl7jb5bnNSXu4QxPxXljnAokIpUJmHke9AWydfze4c6EfXZLhcMd0Gq
+MQ7HOIWfTbqr4zzx9smRoq4Ql57s2nba521XpJAdDeKL7xH/9j7PsXCls8C3Dd5D
+AajEmgUCgYAGEdn6tYxIdX7jF39E3x7zHQf8jHIoQ7+cLTLtd944mSGgeqMfbiww
+CoUa+AAUqjdAD5ViAyJrA+gmDtWpkFnJZtToXYwfUF2o3zRo4k1DeBrVbFqwSQkE
+omrfiBGtviYIPdqQLE34LYpWEooNPraqO9qTyc+9w5038u2OFS+WmQ==
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.crt b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.crt
new file mode 100644
index 0000000..6908165
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFzCCAf8CCQDULaNM+Q+g3jANBgkqhkiG9w0BAQUFADBMMRcwFQYDVQQDDA5T
+d2lmdG1haWxlciBDQTEUMBIGA1UECgwLU3dpZnRtYWlsZXIxDjAMBgNVBAcMBVBh
+cmlzMQswCQYDVQQGEwJGUjAeFw0xMzExMjcwODM5MTJaFw0xNzExMjYwODM5MTJa
+ME8xGjAYBgNVBAMMEVN3aWZ0bWFpbGVyLVVzZXIyMRQwEgYDVQQKDAtTd2lmdG1h
+aWxlcjEOMAwGA1UEBwwFUGFyaXMxCzAJBgNVBAYTAkZSMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAw4AoYVYss2sa1BWJAJpK6gVemjXrp1mVXVpb1/z6
+SH15AGsp3kiNXsMpgvsdofbqC/5HXrw2G8gWqo+uh6GuK67+Tvp7tO2aD4+8CZzU
+K1cffj7Pbx95DUPwXckv79PT5ZcuyeFaVo92aug11+gS/P8n0WXSlzZxNuZ1f3G2
+r/IgwfNKZlarEf1Ih781L2SwmyveW/dtsV2pdrd4IZwsV5SOF2zBFIXSuhPN0c+m
+mtwSJe+Ow1udLX4KJkAX8sGVFJ5P5q4s2nS9vLkkj7X6YRQscbyJO9L7e1TksRqL
+DLxZwiko6gUhp4/bIs1wDj5tzkQBi4qXviRq3i7A9b2d0QIDAQABMA0GCSqGSIb3
+DQEBBQUAA4IBAQAj8iARhPB2DA3YfT5mJJrgU156Sm0Z3mekAECsr+VqFZtU/9Dz
+pPFYEf0hg61cjvwhLtOmaTB+50hu1KNNlu8QlxAfPJqNxtH85W0CYiZHJwW9eSTr
+z1swaHpRHLDUgo3oAXdh5syMbdl0MWos0Z14WP5yYu4IwJXs+j2JRW70BICyrNjm
+d+AjCzoYjKMdJkSj4uxQEOuW2/5veAoDyU+kHDdfT7SmbyoKu+Pw4Xg/XDuKoWYg
+w5/sRiw5vxsmOr9+anspDHdP9rUe1JEfwAJqZB3fwdqEyxu54Xw/GedG4wZBEJf0
+ZcS1eh31emcjYUHQa1IA93jcFSmXzJ+ftJrY
+-----END CERTIFICATE-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.key b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.key
new file mode 100644
index 0000000..e322a8f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/encrypt2.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAw4AoYVYss2sa1BWJAJpK6gVemjXrp1mVXVpb1/z6SH15AGsp
+3kiNXsMpgvsdofbqC/5HXrw2G8gWqo+uh6GuK67+Tvp7tO2aD4+8CZzUK1cffj7P
+bx95DUPwXckv79PT5ZcuyeFaVo92aug11+gS/P8n0WXSlzZxNuZ1f3G2r/IgwfNK
+ZlarEf1Ih781L2SwmyveW/dtsV2pdrd4IZwsV5SOF2zBFIXSuhPN0c+mmtwSJe+O
+w1udLX4KJkAX8sGVFJ5P5q4s2nS9vLkkj7X6YRQscbyJO9L7e1TksRqLDLxZwiko
+6gUhp4/bIs1wDj5tzkQBi4qXviRq3i7A9b2d0QIDAQABAoIBAH8RvK1PmqxfkEeL
+W8oVf13OcafgJjRW6NuNkKa5mmAlldFs1gDRvXl7dm7ZE3CjkYqMEw2DXdP+4KSp
+0TH9J7zi+A6ThnaZ/QniTcEdu1YUQbcH0kIS/dZec0wyKUNDtrXC5zl2jQY4Jyrj
+laOpBzaEDfhvq0p3q2yYrIRSgACpSEVEsfPoHrxtlLhfMkVNe8P0nkQkzdwou5MQ
+MZKV4JUopLHLgPH6IXQCqA1wzlU32yZ86w88GFcBVLkwlLJCKbuAo7yxMCD+nzvA
+xm5NuF1kzpP0gk+kZRXF+rFEV4av/2kSS+n8IeUBQZrxovLBuQHVDvJXoqcEjmlh
+ZUltznUCgYEA4inwieePfb7kh7L/ma5OLLn+uCNwzVw9LayzXT1dyPravOnkHl6h
+MgaoTspqDyU8k8pStedRrr5dVYbseni/A4WSMGvi4innqSXBQGp64TyeJy/e+LrS
+ypSWQ6RSJkCxI5t8s4mOpR7FMcdE34I5qeA4G5RS1HIacn7Hxc7uXtcCgYEA3Uqn
+E7EDfNfYdZm6AikvE6x64oihWI0x47rlkLu6lf6ihiF1dbfaEN+IAaIxQ/unGYwU
+130F0TUwarXnVkeBIRlij4fXhExyd7USSQH1VpqmIqDwsS2ojrzQVMo5UcH+A22G
+bbHPtwJNmw8a7yzTPWo2/vnjgV2OaXEQ9vCVG5cCgYEAu1kEoihJDGBijSqxY4wp
+xBE7OSxamDNtlnV2i6l3FDMBmfaieqnnHDq5l7NDklJFUSQLyhXZ60hUprHDGV0G
+1pMCW8wzQSh3d/4HjSXnrsd5N3sHWMHiNeBKbbQkPP3f/2AhN9SebpgDwE2S9xe4
+TsmnkOkYiFYRJIFzWaAmhDcCgYEAwxRCgZt0xaPKULG6RpljxOYyVm24PsYKCwYB
+xjuYWw5k2/W3BJWVCXblAPuojpPUVTMmVGkErc9D5W6Ch471iOZF+t334cs6xci8
+W9v8GeKvPqu+Q5NKmrpctcKoESkA8qik7yLnSCAhpeYFCn/roKJ35QMJyktddhqU
+p/yilfUCgYBxZ6YmFjYH6l5SxQdcfa5JQ2To8lZCfRJwB65EyWj4pKH4TaWFS7vb
+50WOGTBwJgyhTKLCO3lOmXIUyIwC+OO9xzaeRCBjqEhpup/Ih3MsfMEd6BZRVK5E
+IxtmIWba5HQ52k8FKHeRrRB7PSVSADUN2pUFkLudH+j/01kSZyJoLA==
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.crt b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.crt
new file mode 100644
index 0000000..012f734
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFjCCAf4CAQEwDQYJKoZIhvcNAQEFBQAwTDEXMBUGA1UEAwwOU3dpZnRtYWls
+ZXIgQ0ExFDASBgNVBAoMC1N3aWZ0bWFpbGVyMQ4wDAYDVQQHDAVQYXJpczELMAkG
+A1UEBhMCRlIwHhcNMTQxMTIwMTMyNTQxWhcNMTgxMTE5MTMyNTQxWjBWMSEwHwYD
+VQQDDBhTd2lmdG1haWxlciBJbnRlcm1lZGlhdGUxFDASBgNVBAoMC1N3aWZ0bWFp
+bGVyMQ4wDAYDVQQHDAVQYXJpczELMAkGA1UEBhMCRlIwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDSgEhftX6f1wV+uqWl4J+zwCn8fHaLZT6GZ0Gs9ThE
+4e+4mkLG1rvSEIJon8U0ic8Zph1UGa1Grveh5bgbldHlFxYSsCCyDGgixRvRWNhI
+KuO+SxaIZChqqKwVn3aNQ4BZOSo/MjJ/jQyr9BMgMmdxlHR3e1wkkeAkW//sOsfu
+xQGF1h9yeQvuu/GbG6K7vHSGOGd5O3G7bftfQ7l78TMqeJ7jV32AdJeuO5MD4dRn
+W4CQLTaeribLN0MKn35UdSiFoZxKHqqWcgtl5xcJWPOmq6CsAJ2Eo90kW/BHOrLv
+10h6Oan9R1PdXSvSCvVnXY3Kz30zofw305oA/KJk/hVzAgMBAAEwDQYJKoZIhvcN
+AQEFBQADggEBABijZ2NNd05Js5VFNr4uyaydam9Yqu/nnrxbPRbAXPlCduydu2Gd
+d1ekn3nblMJ87Bc7zVyHdAQD8/AfS1LOKuoWHpTzmlpIL+8T5sbCYG5J1jKdeLkh
+7L/UD5v1ACgA33oKtN8GzcrIq8Zp73r0n+c3hFCfDYRSZRCxGyIf3qgU2LBOD0A3
+wTff/N8E/p3WaJX9VnuQ7xyRMOubDuqJnlo5YsFv7wjyGOIAz9afZzcEbH6czt/t
+g0Xc/kGr/fkAjUu+z3ZfE4247Gut5m3hEVwWkpEEzQo4osX/BEX20Q2nPz9WBq4a
+pK3qNNGwAqS4gdE3ihOExMWxAKgr9d2CcU4=
+-----END CERTIFICATE-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.key b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.key
new file mode 100644
index 0000000..569eb0c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/intermediate.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEA0oBIX7V+n9cFfrqlpeCfs8Ap/Hx2i2U+hmdBrPU4ROHvuJpC
+xta70hCCaJ/FNInPGaYdVBmtRq73oeW4G5XR5RcWErAgsgxoIsUb0VjYSCrjvksW
+iGQoaqisFZ92jUOAWTkqPzIyf40Mq/QTIDJncZR0d3tcJJHgJFv/7DrH7sUBhdYf
+cnkL7rvxmxuiu7x0hjhneTtxu237X0O5e/EzKnie41d9gHSXrjuTA+HUZ1uAkC02
+nq4myzdDCp9+VHUohaGcSh6qlnILZecXCVjzpqugrACdhKPdJFvwRzqy79dIejmp
+/UdT3V0r0gr1Z12Nys99M6H8N9OaAPyiZP4VcwIDAQABAoIBAQDLJiKyu2XIvKsA
+8wCKZY262+mpUjTVso/1BhHL6Zy0XZgMgFORsgrxYB16+zZGzfiguD/1uhIP9Svn
+gtt7Q8udW/phbrkfG/okFDYUg7m3bCz+qVjFqGOZC8+Hzq2LB2oGsbSj6L3zexyP
+lq4elIZghvUfml4CrQW0EVWbld79/kF7XHABcIOk2+3f63XAQWkjdFNxj5+z6TR0
+52Rv7SmRioAsukW9wr77G3Luv/0cEzDFXgGW5s0wO+rJg28smlsIaj+Y0KsptTig
+reQvReAT/S5ZxEp4H6WtXQ1WmaliMB0Gcu4TKB0yE8DoTeCePuslo9DqGokXYT66
+oqtcVMqBAoGBAPoOL9byNNU/bBNDWSCiq8PqhSjl0M4vYBGqtgMXM4GFOJU+W2nX
+YRJbbxoSd/DKjnxEsR6V0vDTDHj4ZSkgmpEmVhEdAiwUwaZ0T8YUaCPhdiAENo5+
+zRBWVJcvAC2XKTK1hy5D7Z5vlC32HHygYqitU+JsK4ylvhrdeOcGx5cfAoGBANeB
+X0JbeuqBEwwEHZqYSpzmtB+IEiuYc9ARTttHEvIWgCThK4ldAzbXhDUIQy3Hm0sL
+PzDA33furNl2WwB+vmOuioYMNjArKrfg689Aim1byg4AHM5XVQcqoDSOABtI55iP
+E0hYDe/d4ema2gk1uR/mT4pnLnk2VzRKsHUbP9stAoGBAKjyIuJwPMADnMqbC0Hg
+hnrVHejW9TAJlDf7hgQqjdMppmQ3gF3PdjeH7VXJOp5GzOQrKRxIEABEJ74n3Xlf
+HO+K3kWrusb7syb6mNd0/DOZ5kyVbCL0iypJmdeXmuAyrFQlj9LzdD1Cl/RBv1d4
+qY/bo7xsZzQc24edMU2uJ/XzAoGBAMHChA95iK5HlwR6vtM8kfk4REMFaLDhxV8R
+8MCeyp33NQfzm91JT5aDd07nOt9yVGHInuwKveFrKuXq0C9FxZCCYfHcEOyGI0Zo
+aBxTfyKMIMMtvriXNM/Yt2oJMndVuUUlfsTQxtcfu/r5S4h0URopTOK3msVI4mcV
+sEnaUjORAoGAGDnslKYtROQMXTe4sh6CoJ32J8UZVV9M+8NLus9rO0v/eZ/pIFxo
+MXGrrrl51ScqahCQ+DXHzpLvInsdlAJvDP3ymhb7H2xGsyvb3x2YgsLmr1YVOnli
+ISbCssno3vZyFU1TDjeEIKqZHc92byHNMjMuhmlaA25g8kb0cCO76EA=
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.crt b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.crt
new file mode 100644
index 0000000..15fd65d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFjCCAf4CCQDULaNM+Q+g3DANBgkqhkiG9w0BAQUFADBMMRcwFQYDVQQDDA5T
+d2lmdG1haWxlciBDQTEUMBIGA1UECgwLU3dpZnRtYWlsZXIxDjAMBgNVBAcMBVBh
+cmlzMQswCQYDVQQGEwJGUjAeFw0xMzExMjcwODM5MTBaFw0xNzExMjYwODM5MTBa
+ME4xGTAXBgNVBAMMEFN3aWZ0bWFpbGVyLVVzZXIxFDASBgNVBAoMC1N3aWZ0bWFp
+bGVyMQ4wDAYDVQQHDAVQYXJpczELMAkGA1UEBhMCRlIwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCTe8ZouyjVGgqlljhaswYqLj7icMoHq+Qg13CE+zJg
+tl2/UzyPhAd3WWOIvlQ0lu+E/n0bXrS6+q28DrQ3UgJ9BskzzLz15qUO12b92AvG
+vLJ+9kKuiM5KXDljOAsXc7/A9UUGwEFA1D0mkeMmkHuiQavAMkzBLha22hGpg/hz
+VbE6W9MGna0szd8yh38IY1M5uR+OZ0dG3KbVZb7H3N0OLOP8j8n+4YtAGAW+Onz/
+2CGPfZ1kaDMvY/WTZwyGeA4FwCPy1D8tfeswqKnWDB9Sfl8hns5VxnoJ3dqKQHeX
+iC4OMfQ0U4CcuM5sVYJZRNNwP7/TeUh3HegnOnuZ1hy9AgMBAAEwDQYJKoZIhvcN
+AQEFBQADggEBAAEPjGt98GIK6ecAEat52aG+8UP7TuZaxoH3cbZdhFTafrP8187F
+Rk5G3LCPTeA/QIzbHppA4fPAiS07OVSwVCknpTJbtKKn0gmtTZxThacFHF2NlzTH
+XxM5bIbkK3jzIF+WattyTSj34UHHfaNAmvmS7Jyq6MhjSDbcQ+/dZ9eo2tF/AmrC
++MBhyH8aUYwKhTOQQh8yC11niziHhGO99FQ4tpuD9AKlun5snHq4uK9AOFe8VhoR
+q2CqX5g5v8OAtdlvzhp50IqD4BNOP+JrUxjGLHDG76BZZIK2Ai1eBz+GhRlIQru/
+8EhQzd94mdFEPblGbmuD2QXWLFFKLiYOwOc=
+-----END CERTIFICATE-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.key b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.key
new file mode 100644
index 0000000..b3d3c53
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAk3vGaLso1RoKpZY4WrMGKi4+4nDKB6vkINdwhPsyYLZdv1M8
+j4QHd1ljiL5UNJbvhP59G160uvqtvA60N1ICfQbJM8y89ealDtdm/dgLxryyfvZC
+rojOSlw5YzgLF3O/wPVFBsBBQNQ9JpHjJpB7okGrwDJMwS4WttoRqYP4c1WxOlvT
+Bp2tLM3fMod/CGNTObkfjmdHRtym1WW+x9zdDizj/I/J/uGLQBgFvjp8/9ghj32d
+ZGgzL2P1k2cMhngOBcAj8tQ/LX3rMKip1gwfUn5fIZ7OVcZ6Cd3aikB3l4guDjH0
+NFOAnLjObFWCWUTTcD+/03lIdx3oJzp7mdYcvQIDAQABAoIBAH2vrw/T6GFrlwU0
+twP8q1VJIghCDLpq77hZQafilzU6VTxWyDaaUu6QPDXt1b8Xnjnd02p+1FDAj0zD
+zyuR9VLtdIxzf9mj3KiAQ2IzOx3787YlUgCB0CQo4jM/MJyk5RahL1kogLOp7A8x
+pr5XxTUq+B6L/0Nmbq8XupOXRyWp53amZ5N8sgWDv4oKh9fqgAhxbSG6KUkTmhYs
+DLinWg86Q28pSn+eivf4dehR56YwtTBVguXW3WKO70+GW1RotSrS6e6SSxfKYksZ
+a7/J1hCmJkEE3+4C8BpcI0MelgaK66ocN0pOqDF9ByxphARqyD7tYCfoS2P8gi81
+XoiZJaECgYEAwqx4AnDX63AANsfKuKVsEQfMSAG47SnKOVwHB7prTAgchTRcDph1
+EVOPtJ+4ssanosXzLcN/dCRlvqLEqnKYAOizy3C56CyRguCpO1AGbRpJjRmHTRgA
+w8iArhM07HgJ3XLFn99V/0bsPCMxW8dje1ZMjKjoQtDrXRQMtWaVY+UCgYEAwfGi
+f0If6z7wJj9gQUkGimWDAg/bxDkvEeh3nSD/PQyNiW0XDclcb3roNPQsal2ZoMwt
+f1bwkclw7yUCIZBvXWEkZapjKCdseTp6nglScxr8GAzfN9p5KQl+OS3GzC6xZf6C
+BsZQ5ucsHTHsCAi3WbwGK829z9c7x0qRwgwu9/kCgYEAsqwEwYi8Q/RZ3e1lXC9H
+jiHwFi6ugc2XMyoJscghbnkLZB54V1UKLUraXFcz97FobnbsCJajxf8Z+uv9QMtI
+Q51QV2ow1q0BKHP2HuAF5eD4nK5Phix/lzHRGPO74UUTGNKcG22pylBXxaIvTSMl
+ZTABth/YfGqvepBKUbvDZRkCgYB5ykbUCW9H6D8glZ3ZgYU09ag+bD0CzTIs2cH7
+j1QZPz/GdBYNF00PyKv3TPpzVRH7cxyDIdJyioB7/M6Iy03T4wPbQBOCjLdGrZ2A
+jrQTCngSlkq6pVx+k7KLL57ua8gFF70JihIV3kfKkaX6KZcSJ8vsSAgRc8TbUo2T
+wNjh6QKBgDyxw4bG2ULs+LVaHcnp7nizLgRGXJsCkDICjla6y0eCgAnG8fSt8CcG
+s5DIfJeVs/NXe/NVNuVrfwsUx0gBOirtFwQStvi5wJnY/maGAyjmgafisNFgAroT
+aM5f+wyGPQeGCs7bj7JWY7Nx9lkyuUV7DdKBTZNMOe51K3+PTEL3
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.crt b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.crt
new file mode 100644
index 0000000..44f4d9b
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.crt
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDGTCCAgECAQEwDQYJKoZIhvcNAQEFBQAwVjEhMB8GA1UEAwwYU3dpZnRtYWls
+ZXIgSW50ZXJtZWRpYXRlMRQwEgYDVQQKDAtTd2lmdG1haWxlcjEOMAwGA1UEBwwF
+UGFyaXMxCzAJBgNVBAYTAkZSMB4XDTE0MTEyMDEzMjYyNloXDTE4MTExOTEzMjYy
+NlowTzEaMBgGA1UEAwwRU3dpZnRtYWlsZXItVXNlcjIxFDASBgNVBAoMC1N3aWZ0
+bWFpbGVyMQ4wDAYDVQQHDAVQYXJpczELMAkGA1UEBhMCRlIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDbr1m4z/rzFS/DxUUQIhKNx19oAeGYLt3niaEP
+twfvBMNB80gMgM9d+XtqrPAMPeY/2C8t5NlChNPKMcR70JBKdmlSH4/aTjaIfWmD
+PoZJjvRRXINZgSHNKIt4ZGAN/EPFr19CBisV4iPxzu+lyIbbkaZJ/qtyatlP7m/q
+8TnykFRlyxNEveCakpcXeRd3YTFGKWoED+/URhVc0cCPZVjoeSTtPHAYBnC29lG5
+VFbq6NBQiyF4tpjOHRarq6G8PtQFH9CpAZg5bPk3bqka9C8mEr5jWfrM4EHtUkTl
+CwVLOQRBsz/nMBT27pXZh18GU0hc3geNDN4kqaeqgNBo0mblAgMBAAEwDQYJKoZI
+hvcNAQEFBQADggEBAAHDMuv6oxWPsTQWWGWWFIk7QZu3iogMqFuxhhQxg8BE37CT
+Vt1mBVEjYGMkWhMSwWBMWuP6yuOZecWtpp6eOie/UKGg1XoW7Y7zq2aQaP7YPug0
+8Lgq1jIo7iO2b6gZeMtLiTZrxyte0z1XzS3wy7ZC9mZjYd7QE7mZ+/rzQ0x5zjOp
+G8b3msS/yYYJCMN+HtHln++HOGmm6uhvbsHTfvvZvtl7F5vJ5WhGGlUfjhanSEtZ
+1RKx+cbgIv1eFOGO1OTuZfEuKdLb0T38d/rjLeI99nVVKEIGtLmX4dj327GHe/D3
+aPr2blF2gOvlzkfN9Vz6ZUE2s3rVBeCg2AVseYQ=
+-----END CERTIFICATE-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.key b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.key
new file mode 100644
index 0000000..ffb189b
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/_samples/smime/sign2.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA269ZuM/68xUvw8VFECISjcdfaAHhmC7d54mhD7cH7wTDQfNI
+DIDPXfl7aqzwDD3mP9gvLeTZQoTTyjHEe9CQSnZpUh+P2k42iH1pgz6GSY70UVyD
+WYEhzSiLeGRgDfxDxa9fQgYrFeIj8c7vpciG25GmSf6rcmrZT+5v6vE58pBUZcsT
+RL3gmpKXF3kXd2ExRilqBA/v1EYVXNHAj2VY6Hkk7TxwGAZwtvZRuVRW6ujQUIsh
+eLaYzh0Wq6uhvD7UBR/QqQGYOWz5N26pGvQvJhK+Y1n6zOBB7VJE5QsFSzkEQbM/
+5zAU9u6V2YdfBlNIXN4HjQzeJKmnqoDQaNJm5QIDAQABAoIBAAM2FvuqnqJ7Bs23
+zoCj3t2PsodUr7WHydqemmoeZNFLoocORVlZcK6Q/QrcKE4lgX4hbN8g30QnqOjl
+vVeJ/vH3tSZsK7AnQIjSPH6cpV3h5xRhY9IlHxdepltGLFlH/L2hCKVwbaTOP3RD
+cCFeQwpmoKWoQV1UzoRqmdw3Vn+DMaUULomLVR9aSW9PnKeFL+tPWShf7GmVISfM
+2H6xKw/qT0XAX59ZHA1laxSFVvbV5ZcKrBOFMV407Vzw2d3ojmfEzNsHjUVBXX8j
+B5nK1VeJiTVmcoVhnRX7tXESDaZy+Kv38pqOmc8Svn70lDJ35SM2EpWnX39w5LsQ
+29NsIUECgYEA/vNKiMfVmmZNQrpcuHQe5adlmz9+I4xJ4wbRzrS7czpbKF0/iaPf
+dKoVz67yYHOJCBHTVaXWkElQsq1mkyuFt/cc0ReJXO8709+t+6ULsE50cLQm/HN5
+npg3gw0Ls/9dy/cHM5SdVIHMBm9oQ65rXup/dqWC8Dz2cAAOQhIPwx0CgYEA3Jbk
+DPdUlrj4sXcE3V/CtmBuK9Xq1xolJt026fYCrle0YhdMKmchRBDCc6BzM+F/vDyC
+llPfQu8TDXK40Oan7GbxMdoLqKK9gSIq1dvfG1YMMz8OrBcX8xKe61KFRWd7QSBJ
+BcY575NzYHapOHVGnUJ68j8zCow0gfb7q6iK4GkCgYEAz2mUuKSCxYL21hORfUqT
+HFjMU7oa38axEa6pn9XvLjZKlRMPruWP1HTPG9ADRa6Yy+TcnrA1V9sdeM+TRKXC
+usCiRAU27lF+xccS30gNs1iQaGRX10gGqJzDhK1nWP+nClmlFTSRrn+OQan/FBjh
+Jy31lsveM54VC1cwQlY5Vo0CgYEArtjfnLNzFiE55xjq/znHUd4vlYlzItrzddHE
+lEBOsbiNH29ODRI/2P7b0uDsT8Q/BoqEC/ohLqHn3TIA8nzRv91880HdGecdBL17
+bJZiSv2yn/AshhWsAxzQYMDBKFk05lNb7jrIc3DR9DU6PqketsoaP+f+Yi7t89I8
+fD0VD3kCgYAaJCoQshng/ijiHF/RJXLrXXHJSUmaOfbweX/mzFup0YR1LxUjcv85
+cxvwc41Y2iI5MwUXyX97/GYKeoobzWZy3XflNWtg04rcInVaPsb/OOFDDqI+MkzT
+B4PcCurOmjzcxHMVE34CYvl3YVwWrPb5JO1rYG9T2gKUJnLU6qG4Bw==
+-----END RSA PRIVATE KEY-----
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default b/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default
new file mode 100644
index 0000000..5717c98
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ Swift Mailer V4 accpetance test configuration.
+
+ YOU ONLY NEED TO EDIT THIS FILE IF YOU WISH TO RUN THE ACCEPTANCE TESTS.
+
+ The acceptance tests are run by default when "All Tests" are run with the
+ testing suite, however, without configuration options here only the unit tests
+ will be run and the acceptance tests will be skipped.
+
+ You can fill out only the parts you know and leave the other bits.
+ */
+
+/*
+ Defines: The name and port of a SMTP server you can connect to.
+ Recommended: smtp.gmail.com:25
+ */
+define('SWIFT_SMTP_HOST', 'localhost:4456');
+
+/*
+ Defines: An SMTP server and port which uses TLS encryption.
+ Recommended: smtp.gmail.com:465
+ */
+define('SWIFT_TLS_HOST', 'smtp.gmail.com:465');
+
+/*
+ Defines: An SMTP server and port which uses SSL encryption.
+ Recommended: smtp.gmail.com:465
+ */
+define('SWIFT_SSL_HOST', 'smtp.gmail.com:465');
+
+/*
+ Defines: The path to a sendmail binary (one which can run in -bs mode).
+ Recommended: /usr/sbin/sendmail
+ */
+define('SWIFT_SENDMAIL_PATH', '/usr/sbin/sendmail -bs');
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/AttachmentAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/AttachmentAcceptanceTest.php
new file mode 100644
index 0000000..5c0b826
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/AttachmentAcceptanceTest.php
@@ -0,0 +1,12 @@
+<?php
+
+require_once 'swift_required.php';
+require_once __DIR__.'/Mime/AttachmentAcceptanceTest.php';
+
+class Swift_AttachmentAcceptanceTest extends Swift_Mime_AttachmentAcceptanceTest
+{
+ protected function _createAttachment()
+ {
+ return Swift_Attachment::newInstance();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/ByteStream/FileByteStreamAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/ByteStream/FileByteStreamAcceptanceTest.php
new file mode 100644
index 0000000..49ad20a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/ByteStream/FileByteStreamAcceptanceTest.php
@@ -0,0 +1,162 @@
+<?php
+
+class Swift_ByteStream_FileByteStreamAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_testFile;
+
+ protected function setUp()
+ {
+ $this->_testFile = sys_get_temp_dir().'/swift-test-file'.__CLASS__;
+ file_put_contents($this->_testFile, 'abcdefghijklm');
+ }
+
+ protected function tearDown()
+ {
+ unlink($this->_testFile);
+ }
+
+ public function testFileDataCanBeRead()
+ {
+ $file = $this->_createFileStream($this->_testFile);
+ $str = '';
+ while (false !== $bytes = $file->read(8192)) {
+ $str .= $bytes;
+ }
+ $this->assertEquals('abcdefghijklm', $str);
+ }
+
+ public function testFileDataCanBeReadSequentially()
+ {
+ $file = $this->_createFileStream($this->_testFile);
+ $this->assertEquals('abcde', $file->read(5));
+ $this->assertEquals('fghijklm', $file->read(8));
+ $this->assertFalse($file->read(1));
+ }
+
+ public function testFilenameIsReturned()
+ {
+ $file = $this->_createFileStream($this->_testFile);
+ $this->assertEquals($this->_testFile, $file->getPath());
+ }
+
+ public function testFileCanBeWrittenTo()
+ {
+ $file = $this->_createFileStream($this->_testFile, true);
+ $file->write('foobar');
+ $this->assertEquals('foobar', $file->read(8192));
+ }
+
+ public function testReadingFromThenWritingToFile()
+ {
+ $file = $this->_createFileStream($this->_testFile, true);
+ $file->write('foobar');
+ $this->assertEquals('foobar', $file->read(8192));
+ $file->write('zipbutton');
+ $this->assertEquals('zipbutton', $file->read(8192));
+ }
+
+ public function testWritingToFileWithCanonicalization()
+ {
+ $file = $this->_createFileStream($this->_testFile, true);
+ $file->addFilter($this->_createFilter(array("\r\n", "\r"), "\n"), 'allToLF');
+ $file->write("foo\r\nbar\r");
+ $file->write("\nzip\r\ntest\r");
+ $file->flushBuffers();
+ $this->assertEquals("foo\nbar\nzip\ntest\n", file_get_contents($this->_testFile));
+ }
+
+ public function testWritingWithFulleMessageLengthOfAMultipleOf8192()
+ {
+ $file = $this->_createFileStream($this->_testFile, true);
+ $file->addFilter($this->_createFilter(array("\r\n", "\r"), "\n"), 'allToLF');
+ $file->write('');
+ $file->flushBuffers();
+ $this->assertEquals('', file_get_contents($this->_testFile));
+ }
+
+ public function testBindingOtherStreamsMirrorsWriteOperations()
+ {
+ $file = $this->_createFileStream($this->_testFile, true);
+ $is1 = $this->_createMockInputStream();
+ $is2 = $this->_createMockInputStream();
+
+ $is1->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is1->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+ $is2->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is2->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+
+ $file->bind($is1);
+ $file->bind($is2);
+
+ $file->write('x');
+ $file->write('y');
+ }
+
+ public function testBindingOtherStreamsMirrorsFlushOperations()
+ {
+ $file = $this->_createFileStream(
+ $this->_testFile, true
+ );
+ $is1 = $this->_createMockInputStream();
+ $is2 = $this->_createMockInputStream();
+
+ $is1->expects($this->once())
+ ->method('flushBuffers');
+ $is2->expects($this->once())
+ ->method('flushBuffers');
+
+ $file->bind($is1);
+ $file->bind($is2);
+
+ $file->flushBuffers();
+ }
+
+ public function testUnbindingStreamPreventsFurtherWrites()
+ {
+ $file = $this->_createFileStream($this->_testFile, true);
+ $is1 = $this->_createMockInputStream();
+ $is2 = $this->_createMockInputStream();
+
+ $is1->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is1->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+ $is2->expects($this->once())
+ ->method('write')
+ ->with('x');
+
+ $file->bind($is1);
+ $file->bind($is2);
+
+ $file->write('x');
+
+ $file->unbind($is2);
+
+ $file->write('y');
+ }
+
+ private function _createFilter($search, $replace)
+ {
+ return new Swift_StreamFilters_StringReplacementFilter($search, $replace);
+ }
+
+ private function _createMockInputStream()
+ {
+ return $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ }
+
+ private function _createFileStream($file, $writable = false)
+ {
+ return new Swift_ByteStream_FileByteStream($file, $writable);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php
new file mode 100644
index 0000000..c13e570
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/CharacterReaderFactory/SimpleCharacterReaderFactoryAcceptanceTest.php
@@ -0,0 +1,179 @@
+<?php
+
+class Swift_CharacterReaderFactory_SimpleCharacterReaderFactoryAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_factory;
+ private $_prefix = 'Swift_CharacterReader_';
+
+ protected function setUp()
+ {
+ $this->_factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ }
+
+ public function testCreatingUtf8Reader()
+ {
+ foreach (array('utf8', 'utf-8', 'UTF-8', 'UTF8') as $utf8) {
+ $reader = $this->_factory->getReaderFor($utf8);
+ $this->assertInstanceOf($this->_prefix.'Utf8Reader', $reader);
+ }
+ }
+
+ public function testCreatingIso8859XReaders()
+ {
+ $charsets = array();
+ foreach (range(1, 16) as $number) {
+ foreach (array('iso', 'iec') as $body) {
+ $charsets[] = $body.'-8859-'.$number;
+ $charsets[] = $body.'8859-'.$number;
+ $charsets[] = strtoupper($body).'-8859-'.$number;
+ $charsets[] = strtoupper($body).'8859-'.$number;
+ }
+ }
+
+ foreach ($charsets as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingWindows125XReaders()
+ {
+ $charsets = array();
+ foreach (range(0, 8) as $number) {
+ $charsets[] = 'windows-125'.$number;
+ $charsets[] = 'windows125'.$number;
+ $charsets[] = 'WINDOWS-125'.$number;
+ $charsets[] = 'WINDOWS125'.$number;
+ }
+
+ foreach ($charsets as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingCodePageReaders()
+ {
+ $charsets = array();
+ foreach (range(0, 8) as $number) {
+ $charsets[] = 'cp-125'.$number;
+ $charsets[] = 'cp125'.$number;
+ $charsets[] = 'CP-125'.$number;
+ $charsets[] = 'CP125'.$number;
+ }
+
+ foreach (array(437, 737, 850, 855, 857, 858, 860,
+ 861, 863, 865, 866, 869, ) as $number) {
+ $charsets[] = 'cp-'.$number;
+ $charsets[] = 'cp'.$number;
+ $charsets[] = 'CP-'.$number;
+ $charsets[] = 'CP'.$number;
+ }
+
+ foreach ($charsets as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingAnsiReader()
+ {
+ foreach (array('ansi', 'ANSI') as $ansi) {
+ $reader = $this->_factory->getReaderFor($ansi);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingMacintoshReader()
+ {
+ foreach (array('macintosh', 'MACINTOSH') as $mac) {
+ $reader = $this->_factory->getReaderFor($mac);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingKOIReaders()
+ {
+ $charsets = array();
+ foreach (array('7', '8-r', '8-u', '8u', '8r') as $end) {
+ $charsets[] = 'koi-'.$end;
+ $charsets[] = 'koi'.$end;
+ $charsets[] = 'KOI-'.$end;
+ $charsets[] = 'KOI'.$end;
+ }
+
+ foreach ($charsets as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingIsciiReaders()
+ {
+ foreach (array('iscii', 'ISCII', 'viscii', 'VISCII') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingMIKReader()
+ {
+ foreach (array('mik', 'MIK') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingCorkReader()
+ {
+ foreach (array('cork', 'CORK', 't1', 'T1') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(1, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingUcs2Reader()
+ {
+ foreach (array('ucs-2', 'UCS-2', 'ucs2', 'UCS2') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(2, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingUtf16Reader()
+ {
+ foreach (array('utf-16', 'UTF-16', 'utf16', 'UTF16') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(2, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingUcs4Reader()
+ {
+ foreach (array('ucs-4', 'UCS-4', 'ucs4', 'UCS4') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(4, $reader->getInitialByteSize());
+ }
+ }
+
+ public function testCreatingUtf32Reader()
+ {
+ foreach (array('utf-32', 'UTF-32', 'utf32', 'UTF32') as $charset) {
+ $reader = $this->_factory->getReaderFor($charset);
+ $this->assertInstanceOf($this->_prefix.'GenericFixedWidthReader', $reader);
+ $this->assertEquals(4, $reader->getInitialByteSize());
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php
new file mode 100644
index 0000000..e83c2bf
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/DependencyContainerAcceptanceTest.php
@@ -0,0 +1,24 @@
+<?php
+
+require_once 'swift_required.php';
+
+//This is more of a "cross your fingers and hope it works" test!
+
+class Swift_DependencyContainerAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoLookupsFail()
+ {
+ $di = Swift_DependencyContainer::getInstance();
+ foreach ($di->listItems() as $itemName) {
+ try {
+ // to be removed in 6.0
+ if ('transport.mail' === $itemName) {
+ continue;
+ }
+ $di->lookup($itemName);
+ } catch (Swift_DependencyException $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php
new file mode 100644
index 0000000..fc5a814
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EmbeddedFileAcceptanceTest.php
@@ -0,0 +1,12 @@
+<?php
+
+require_once 'swift_required.php';
+require_once __DIR__.'/Mime/EmbeddedFileAcceptanceTest.php';
+
+class Swift_EmbeddedFileAcceptanceTest extends Swift_Mime_EmbeddedFileAcceptanceTest
+{
+ protected function _createEmbeddedFile()
+ {
+ return Swift_EmbeddedFile::newInstance();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Base64EncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Base64EncoderAcceptanceTest.php
new file mode 100644
index 0000000..bada509
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Base64EncoderAcceptanceTest.php
@@ -0,0 +1,45 @@
+<?php
+
+class Swift_Encoder_Base64EncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_samplesDir;
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../_samples/charsets');
+ $this->_encoder = new Swift_Encoder_Base64Encoder();
+ }
+
+ public function testEncodingAndDecodingSamples()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+ $encodedText = $this->_encoder->encodeString($text);
+
+ $this->assertEquals(
+ base64_decode($encodedText), $text,
+ '%s: Encoded string should decode back to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php
new file mode 100644
index 0000000..442d9a9
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/QpEncoderAcceptanceTest.php
@@ -0,0 +1,54 @@
+<?php
+
+class Swift_Encoder_QpEncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_samplesDir;
+ private $_factory;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../_samples/charsets');
+ $this->_factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ }
+
+ public function testEncodingAndDecodingSamples()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $encoding = $encodingDir;
+ $charStream = new Swift_CharacterStream_ArrayCharacterStream(
+ $this->_factory, $encoding);
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+ $encodedText = $encoder->encodeString($text);
+
+ foreach (explode("\r\n", $encodedText) as $line) {
+ $this->assertLessThanOrEqual(76, strlen($line));
+ }
+
+ $this->assertEquals(
+ quoted_printable_decode($encodedText), $text,
+ '%s: Encoded string should decode back to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php
new file mode 100644
index 0000000..bcb6b95
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Encoder/Rfc2231EncoderAcceptanceTest.php
@@ -0,0 +1,50 @@
+<?php
+
+class Swift_Encoder_Rfc2231EncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_samplesDir;
+ private $_factory;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../_samples/charsets');
+ $this->_factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ }
+
+ public function testEncodingAndDecodingSamples()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $encoding = $encodingDir;
+ $charStream = new Swift_CharacterStream_ArrayCharacterStream(
+ $this->_factory, $encoding);
+ $encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+ $encodedText = $encoder->encodeString($text);
+
+ $this->assertEquals(
+ urldecode(implode('', explode("\r\n", $encodedText))), $text,
+ '%s: Encoded string should decode back to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EncodingAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EncodingAcceptanceTest.php
new file mode 100644
index 0000000..6a4d05d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/EncodingAcceptanceTest.php
@@ -0,0 +1,30 @@
+<?php
+
+require_once 'swift_required.php';
+
+class Swift_EncodingAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ public function testGet7BitEncodingReturns7BitEncoder()
+ {
+ $encoder = Swift_Encoding::get7BitEncoding();
+ $this->assertEquals('7bit', $encoder->getName());
+ }
+
+ public function testGet8BitEncodingReturns8BitEncoder()
+ {
+ $encoder = Swift_Encoding::get8BitEncoding();
+ $this->assertEquals('8bit', $encoder->getName());
+ }
+
+ public function testGetQpEncodingReturnsQpEncoder()
+ {
+ $encoder = Swift_Encoding::getQpEncoding();
+ $this->assertEquals('quoted-printable', $encoder->getName());
+ }
+
+ public function testGetBase64EncodingReturnsBase64Encoder()
+ {
+ $encoder = Swift_Encoding::getBase64Encoding();
+ $this->assertEquals('base64', $encoder->getName());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php
new file mode 100644
index 0000000..5fab14c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/ArrayKeyCacheAcceptanceTest.php
@@ -0,0 +1,173 @@
+<?php
+
+class Swift_KeyCache_ArrayKeyCacheAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_cache;
+ private $_key1 = 'key1';
+ private $_key2 = 'key2';
+
+ protected function setUp()
+ {
+ $this->_cache = new Swift_KeyCache_ArrayKeyCache(
+ new Swift_KeyCache_SimpleKeyCacheInputStream()
+ );
+ }
+
+ public function testStringDataCanBeSetAndFetched()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testStringDataCanBeOverwritten()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'whatever', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('whatever', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testStringDataCanBeAppended()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'ing', Swift_KeyCache::MODE_APPEND
+ );
+ $this->assertEquals('testing', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testHasKeyReturnValue()
+ {
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'foo'));
+ }
+
+ public function testNsKeyIsWellPartitioned()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key2, 'foo', 'ing', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $this->_cache->getString($this->_key1, 'foo'));
+ $this->assertEquals('ing', $this->_cache->getString($this->_key2, 'foo'));
+ }
+
+ public function testItemKeyIsWellPartitioned()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'bar', 'ing', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $this->_cache->getString($this->_key1, 'foo'));
+ $this->assertEquals('ing', $this->_cache->getString($this->_key1, 'bar'));
+ }
+
+ public function testByteStreamCanBeImported()
+ {
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write('abcdef');
+
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os, Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('abcdef', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testByteStreamCanBeAppended()
+ {
+ $os1 = new Swift_ByteStream_ArrayByteStream();
+ $os1->write('abcdef');
+
+ $os2 = new Swift_ByteStream_ArrayByteStream();
+ $os2->write('xyzuvw');
+
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os1, Swift_KeyCache::MODE_APPEND
+ );
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os2, Swift_KeyCache::MODE_APPEND
+ );
+
+ $this->assertEquals('abcdefxyzuvw', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testByteStreamAndStringCanBeAppended()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_APPEND
+ );
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write('abcdef');
+
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os, Swift_KeyCache::MODE_APPEND
+ );
+ $this->assertEquals('testabcdef', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testDataCanBeExportedToByteStream()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+
+ $this->_cache->exportToByteStream($this->_key1, 'foo', $is);
+
+ $string = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $string .= $bytes;
+ }
+
+ $this->assertEquals('test', $string);
+ }
+
+ public function testKeyCanBeCleared()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->_cache->clearKey($this->_key1, 'foo');
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'foo'));
+ }
+
+ public function testNsKeyCanBeCleared()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'bar', 'xyz', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'bar'));
+ $this->_cache->clearAll($this->_key1);
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'bar'));
+ }
+
+ public function testKeyCacheInputStream()
+ {
+ $is = $this->_cache->getInputByteStream($this->_key1, 'foo');
+ $is->write('abc');
+ $is->write('xyz');
+ $this->assertEquals('abcxyz', $this->_cache->getString($this->_key1, 'foo'));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php
new file mode 100644
index 0000000..0e027c2
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/KeyCache/DiskKeyCacheAcceptanceTest.php
@@ -0,0 +1,173 @@
+<?php
+
+class Swift_KeyCache_DiskKeyCacheAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_cache;
+ private $_key1;
+ private $_key2;
+
+ protected function setUp()
+ {
+ $this->_key1 = uniqid(microtime(true), true);
+ $this->_key2 = uniqid(microtime(true), true);
+ $this->_cache = new Swift_KeyCache_DiskKeyCache(new Swift_KeyCache_SimpleKeyCacheInputStream(), sys_get_temp_dir());
+ }
+
+ public function testStringDataCanBeSetAndFetched()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testStringDataCanBeOverwritten()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'whatever', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('whatever', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testStringDataCanBeAppended()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'ing', Swift_KeyCache::MODE_APPEND
+ );
+ $this->assertEquals('testing', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testHasKeyReturnValue()
+ {
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'foo'));
+ }
+
+ public function testNsKeyIsWellPartitioned()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key2, 'foo', 'ing', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $this->_cache->getString($this->_key1, 'foo'));
+ $this->assertEquals('ing', $this->_cache->getString($this->_key2, 'foo'));
+ }
+
+ public function testItemKeyIsWellPartitioned()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'bar', 'ing', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $this->_cache->getString($this->_key1, 'foo'));
+ $this->assertEquals('ing', $this->_cache->getString($this->_key1, 'bar'));
+ }
+
+ public function testByteStreamCanBeImported()
+ {
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write('abcdef');
+
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os, Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('abcdef', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testByteStreamCanBeAppended()
+ {
+ $os1 = new Swift_ByteStream_ArrayByteStream();
+ $os1->write('abcdef');
+
+ $os2 = new Swift_ByteStream_ArrayByteStream();
+ $os2->write('xyzuvw');
+
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os1, Swift_KeyCache::MODE_APPEND
+ );
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os2, Swift_KeyCache::MODE_APPEND
+ );
+
+ $this->assertEquals('abcdefxyzuvw', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testByteStreamAndStringCanBeAppended()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_APPEND
+ );
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write('abcdef');
+
+ $this->_cache->importFromByteStream(
+ $this->_key1, 'foo', $os, Swift_KeyCache::MODE_APPEND
+ );
+ $this->assertEquals('testabcdef', $this->_cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testDataCanBeExportedToByteStream()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+
+ $this->_cache->exportToByteStream($this->_key1, 'foo', $is);
+
+ $string = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $string .= $bytes;
+ }
+
+ $this->assertEquals('test', $string);
+ }
+
+ public function testKeyCanBeCleared()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->_cache->clearKey($this->_key1, 'foo');
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'foo'));
+ }
+
+ public function testNsKeyCanBeCleared()
+ {
+ $this->_cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->_cache->setString(
+ $this->_key1, 'bar', 'xyz', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->assertTrue($this->_cache->hasKey($this->_key1, 'bar'));
+ $this->_cache->clearAll($this->_key1);
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'foo'));
+ $this->assertFalse($this->_cache->hasKey($this->_key1, 'bar'));
+ }
+
+ public function testKeyCacheInputStream()
+ {
+ $is = $this->_cache->getInputByteStream($this->_key1, 'foo');
+ $is->write('abc');
+ $is->write('xyz');
+ $this->assertEquals('abcxyz', $this->_cache->getString($this->_key1, 'foo'));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php
new file mode 100644
index 0000000..5f4e983
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MessageAcceptanceTest.php
@@ -0,0 +1,55 @@
+<?php
+
+require_once 'swift_required.php';
+require_once __DIR__.'/Mime/SimpleMessageAcceptanceTest.php';
+
+class Swift_MessageAcceptanceTest extends Swift_Mime_SimpleMessageAcceptanceTest
+{
+ public function testAddPartWrapper()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = $message->getDate();
+ $boundary = $message->getBoundary();
+
+ $message->addPart('foo', 'text/plain', 'iso-8859-1');
+ $message->addPart('test <b>foo</b>', 'text/html', 'iso-8859-1');
+
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'test <b>foo</b>'.
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n",
+ $message->toString()
+ );
+ }
+
+ protected function _createMessage()
+ {
+ Swift_DependencyContainer::getInstance()
+ ->register('properties.charset')->asValue(null);
+
+ return Swift_Message::newInstance();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php
new file mode 100644
index 0000000..7353d9d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/AttachmentAcceptanceTest.php
@@ -0,0 +1,123 @@
+<?php
+
+class Swift_Mime_AttachmentAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_contentEncoder;
+ private $_cache;
+ private $_grammar;
+ private $_headers;
+
+ protected function setUp()
+ {
+ $this->_cache = new Swift_KeyCache_ArrayKeyCache(
+ new Swift_KeyCache_SimpleKeyCacheInputStream()
+ );
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $this->_contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+
+ $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $paramEncoder = new Swift_Encoder_Rfc2231Encoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $this->_grammar = new Swift_Mime_Grammar();
+ $this->_headers = new Swift_Mime_SimpleHeaderSet(
+ new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $this->_grammar)
+ );
+ }
+
+ public function testDispositionIsSetInHeader()
+ {
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setDisposition('inline');
+ $this->assertEquals(
+ 'Content-Type: application/pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: inline'."\r\n",
+ $attachment->toString()
+ );
+ }
+
+ public function testDispositionIsAttachmentByDefault()
+ {
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $this->assertEquals(
+ 'Content-Type: application/pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment'."\r\n",
+ $attachment->toString()
+ );
+ }
+
+ public function testFilenameIsSetInHeader()
+ {
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $this->assertEquals(
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf'."\r\n",
+ $attachment->toString()
+ );
+ }
+
+ public function testSizeIsSetInHeader()
+ {
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setSize(12340);
+ $this->assertEquals(
+ 'Content-Type: application/pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; size=12340'."\r\n",
+ $attachment->toString()
+ );
+ }
+
+ public function testMultipleParametersInHeader()
+ {
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setSize(12340);
+ $this->assertEquals(
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf; size=12340'."\r\n",
+ $attachment->toString()
+ );
+ }
+
+ public function testEndToEnd()
+ {
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setSize(12340);
+ $attachment->setBody('abcd');
+ $this->assertEquals(
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf; size=12340'."\r\n".
+ "\r\n".
+ base64_encode('abcd'),
+ $attachment->toString()
+ );
+ }
+
+ protected function _createAttachment()
+ {
+ $entity = new Swift_Mime_Attachment(
+ $this->_headers,
+ $this->_contentEncoder,
+ $this->_cache,
+ $this->_grammar
+ );
+
+ return $entity;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php
new file mode 100644
index 0000000..a72f5ff
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/Base64ContentEncoderAcceptanceTest.php
@@ -0,0 +1,56 @@
+<?php
+
+class Swift_Mime_ContentEncoder_Base64ContentEncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_samplesDir;
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../../_samples/charsets');
+ $this->_encoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+ }
+
+ public function testEncodingAndDecodingSamples()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write($text);
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+
+ $this->_encoder->encodeByteStream($os, $is);
+
+ $encoded = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $encoded .= $bytes;
+ }
+
+ $this->assertEquals(
+ base64_decode($encoded), $text,
+ '%s: Encoded string should decode back to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php
new file mode 100644
index 0000000..0dfc4e2
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/NativeQpContentEncoderAcceptanceTest.php
@@ -0,0 +1,88 @@
+<?php
+
+class Swift_Mime_ContentEncoder_NativeQpContentEncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ protected $_samplesDir;
+
+ /**
+ * @var Swift_Mime_ContentEncoder_NativeQpContentEncoder
+ */
+ protected $_encoder;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../../_samples/charsets');
+ $this->_encoder = new Swift_Mime_ContentEncoder_NativeQpContentEncoder();
+ }
+
+ public function testEncodingAndDecodingSamples()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write($text);
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+ $this->_encoder->encodeByteStream($os, $is);
+
+ $encoded = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $encoded .= $bytes;
+ }
+
+ $this->assertEquals(
+ quoted_printable_decode($encoded),
+ // CR and LF are converted to CRLF
+ preg_replace('~\r(?!\n)|(?<!\r)\n~', "\r\n", $text),
+ '%s: Encoded string should decode back to original string for sample '.$sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+
+ public function testEncodingAndDecodingSamplesFromDiConfiguredInstance()
+ {
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertSame('=C3=A4=C3=B6=C3=BC=C3=9F', $encoder->encodeString('äöüß'));
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testCharsetChangeNotImplemented()
+ {
+ $this->_encoder->charsetChanged('utf-8');
+ $this->_encoder->charsetChanged('charset');
+ $this->_encoder->encodeString('foo');
+ }
+
+ public function testGetName()
+ {
+ $this->assertSame('quoted-printable', $this->_encoder->getName());
+ }
+
+ private function _createEncoderFromContainer()
+ {
+ return Swift_DependencyContainer::getInstance()
+ ->lookup('mime.nativeqpcontentencoder')
+ ;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php
new file mode 100644
index 0000000..5eff4e2
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/PlainContentEncoderAcceptanceTest.php
@@ -0,0 +1,88 @@
+<?php
+
+class Swift_Mime_ContentEncoder_PlainContentEncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_samplesDir;
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../../_samples/charsets');
+ $this->_encoder = new Swift_Mime_ContentEncoder_PlainContentEncoder('8bit');
+ }
+
+ public function testEncodingAndDecodingSamplesString()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+ $encodedText = $this->_encoder->encodeString($text);
+
+ $this->assertEquals(
+ $encodedText, $text,
+ '%s: Encoded string should be identical to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+
+ public function testEncodingAndDecodingSamplesByteStream()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write($text);
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+
+ $this->_encoder->encodeByteStream($os, $is);
+
+ $encoded = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $encoded .= $bytes;
+ }
+
+ $this->assertEquals(
+ $encoded, $text,
+ '%s: Encoded string should be identical to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php
new file mode 100644
index 0000000..a383b58
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/ContentEncoder/QpContentEncoderAcceptanceTest.php
@@ -0,0 +1,160 @@
+<?php
+
+class Swift_Mime_ContentEncoder_QpContentEncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_samplesDir;
+ private $_factory;
+
+ protected function setUp()
+ {
+ $this->_samplesDir = realpath(__DIR__.'/../../../../_samples/charsets');
+ $this->_factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ }
+
+ protected function tearDown()
+ {
+ Swift_Preferences::getInstance()->setQPDotEscape(false);
+ }
+
+ public function testEncodingAndDecodingSamples()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $encoding = $encodingDir;
+ $charStream = new Swift_CharacterStream_NgCharacterStream(
+ $this->_factory, $encoding);
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write($text);
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+ $encoder->encodeByteStream($os, $is);
+
+ $encoded = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $encoded .= $bytes;
+ }
+
+ $this->assertEquals(
+ quoted_printable_decode($encoded), $text,
+ '%s: Encoded string should decode back to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+
+ public function testEncodingAndDecodingSamplesFromDiConfiguredInstance()
+ {
+ $sampleFp = opendir($this->_samplesDir);
+ while (false !== $encodingDir = readdir($sampleFp)) {
+ if (substr($encodingDir, 0, 1) == '.') {
+ continue;
+ }
+
+ $encoding = $encodingDir;
+ $encoder = $this->_createEncoderFromContainer();
+
+ $sampleDir = $this->_samplesDir.'/'.$encodingDir;
+
+ if (is_dir($sampleDir)) {
+ $fileFp = opendir($sampleDir);
+ while (false !== $sampleFile = readdir($fileFp)) {
+ if (substr($sampleFile, 0, 1) == '.') {
+ continue;
+ }
+
+ $text = file_get_contents($sampleDir.'/'.$sampleFile);
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $os->write($text);
+
+ $is = new Swift_ByteStream_ArrayByteStream();
+ $encoder->encodeByteStream($os, $is);
+
+ $encoded = '';
+ while (false !== $bytes = $is->read(8192)) {
+ $encoded .= $bytes;
+ }
+
+ $this->assertEquals(
+ str_replace("\r\n", "\n", quoted_printable_decode($encoded)), str_replace("\r\n", "\n", $text),
+ '%s: Encoded string should decode back to original string for sample '.
+ $sampleDir.'/'.$sampleFile
+ );
+ }
+ closedir($fileFp);
+ }
+ }
+ closedir($sampleFp);
+ }
+
+ public function testEncodingLFTextWithDiConfiguredInstance()
+ {
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertEquals("a\r\nb\r\nc", $encoder->encodeString("a\nb\nc"));
+ }
+
+ public function testEncodingCRTextWithDiConfiguredInstance()
+ {
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertEquals("a\r\nb\r\nc", $encoder->encodeString("a\rb\rc"));
+ }
+
+ public function testEncodingLFCRTextWithDiConfiguredInstance()
+ {
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertEquals("a\r\n\r\nb\r\n\r\nc", $encoder->encodeString("a\n\rb\n\rc"));
+ }
+
+ public function testEncodingCRLFTextWithDiConfiguredInstance()
+ {
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertEquals("a\r\nb\r\nc", $encoder->encodeString("a\r\nb\r\nc"));
+ }
+
+ public function testEncodingDotStuffingWithDiConfiguredInstance()
+ {
+ // Enable DotEscaping
+ Swift_Preferences::getInstance()->setQPDotEscape(true);
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertEquals("a=2E\r\n=2E\r\n=2Eb\r\nc", $encoder->encodeString("a.\r\n.\r\n.b\r\nc"));
+ // Return to default
+ Swift_Preferences::getInstance()->setQPDotEscape(false);
+ $encoder = $this->_createEncoderFromContainer();
+ $this->assertEquals("a.\r\n.\r\n.b\r\nc", $encoder->encodeString("a.\r\n.\r\n.b\r\nc"));
+ }
+
+ public function testDotStuffingEncodingAndDecodingSamplesFromDiConfiguredInstance()
+ {
+ // Enable DotEscaping
+ Swift_Preferences::getInstance()->setQPDotEscape(true);
+ $this->testEncodingAndDecodingSamplesFromDiConfiguredInstance();
+ }
+
+ private function _createEncoderFromContainer()
+ {
+ return Swift_DependencyContainer::getInstance()
+ ->lookup('mime.qpcontentencoder')
+ ;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php
new file mode 100644
index 0000000..0f7aa72
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/EmbeddedFileAcceptanceTest.php
@@ -0,0 +1,136 @@
+<?php
+
+class Swift_Mime_EmbeddedFileAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_contentEncoder;
+ private $_cache;
+ private $_grammar;
+ private $_headers;
+
+ protected function setUp()
+ {
+ $this->_cache = new Swift_KeyCache_ArrayKeyCache(
+ new Swift_KeyCache_SimpleKeyCacheInputStream()
+ );
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $this->_contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+
+ $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $paramEncoder = new Swift_Encoder_Rfc2231Encoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $this->_grammar = new Swift_Mime_Grammar();
+ $this->_headers = new Swift_Mime_SimpleHeaderSet(
+ new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $this->_grammar)
+ );
+ }
+
+ public function testContentIdIsSetInHeader()
+ {
+ $file = $this->_createEmbeddedFile();
+ $file->setContentType('application/pdf');
+ $file->setId('foo@bar');
+ $this->assertEquals(
+ 'Content-Type: application/pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <foo@bar>'."\r\n".
+ 'Content-Disposition: inline'."\r\n",
+ $file->toString()
+ );
+ }
+
+ public function testDispositionIsSetInHeader()
+ {
+ $file = $this->_createEmbeddedFile();
+ $id = $file->getId();
+ $file->setContentType('application/pdf');
+ $file->setDisposition('attachment');
+ $this->assertEquals(
+ 'Content-Type: application/pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$id.'>'."\r\n".
+ 'Content-Disposition: attachment'."\r\n",
+ $file->toString()
+ );
+ }
+
+ public function testFilenameIsSetInHeader()
+ {
+ $file = $this->_createEmbeddedFile();
+ $id = $file->getId();
+ $file->setContentType('application/pdf');
+ $file->setFilename('foo.pdf');
+ $this->assertEquals(
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$id.'>'."\r\n".
+ 'Content-Disposition: inline; filename=foo.pdf'."\r\n",
+ $file->toString()
+ );
+ }
+
+ public function testSizeIsSetInHeader()
+ {
+ $file = $this->_createEmbeddedFile();
+ $id = $file->getId();
+ $file->setContentType('application/pdf');
+ $file->setSize(12340);
+ $this->assertEquals(
+ 'Content-Type: application/pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$id.'>'."\r\n".
+ 'Content-Disposition: inline; size=12340'."\r\n",
+ $file->toString()
+ );
+ }
+
+ public function testMultipleParametersInHeader()
+ {
+ $file = $this->_createEmbeddedFile();
+ $id = $file->getId();
+ $file->setContentType('application/pdf');
+ $file->setFilename('foo.pdf');
+ $file->setSize(12340);
+
+ $this->assertEquals(
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$id.'>'."\r\n".
+ 'Content-Disposition: inline; filename=foo.pdf; size=12340'."\r\n",
+ $file->toString()
+ );
+ }
+
+ public function testEndToEnd()
+ {
+ $file = $this->_createEmbeddedFile();
+ $id = $file->getId();
+ $file->setContentType('application/pdf');
+ $file->setFilename('foo.pdf');
+ $file->setSize(12340);
+ $file->setBody('abcd');
+ $this->assertEquals(
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$id.'>'."\r\n".
+ 'Content-Disposition: inline; filename=foo.pdf; size=12340'."\r\n".
+ "\r\n".
+ base64_encode('abcd'),
+ $file->toString()
+ );
+ }
+
+ protected function _createEmbeddedFile()
+ {
+ $entity = new Swift_Mime_EmbeddedFile(
+ $this->_headers,
+ $this->_contentEncoder,
+ $this->_cache,
+ $this->_grammar
+ );
+
+ return $entity;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php
new file mode 100644
index 0000000..e3fad6d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/HeaderEncoder/Base64HeaderEncoderAcceptanceTest.php
@@ -0,0 +1,32 @@
+<?php
+
+class Swift_Mime_HeaderEncoder_Base64HeaderEncoderAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_encoder = new Swift_Mime_HeaderEncoder_Base64HeaderEncoder();
+ }
+
+ public function testEncodingJIS()
+ {
+ if (function_exists('mb_convert_encoding')) {
+ // base64_encode and split cannot handle long JIS text to fold
+ $subject = '長い長い長い長い長い長い長い長い長い長い長い長い長い長い長い長い長い長い長い長い件名';
+
+ $encodedWrapperLength = strlen('=?iso-2022-jp?'.$this->_encoder->getName().'??=');
+
+ $old = mb_internal_encoding();
+ mb_internal_encoding('utf-8');
+ $newstring = mb_encode_mimeheader($subject, 'iso-2022-jp', 'B', "\r\n");
+ mb_internal_encoding($old);
+
+ $encoded = $this->_encoder->encodeString($subject, 0, 75 - $encodedWrapperLength, 'iso-2022-jp');
+ $this->assertEquals(
+ $encoded, $newstring,
+ 'Encoded string should decode back to original string for sample '
+ );
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php
new file mode 100644
index 0000000..a7f6fc5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/MimePartAcceptanceTest.php
@@ -0,0 +1,127 @@
+<?php
+
+class Swift_Mime_MimePartAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ private $_contentEncoder;
+ private $_cache;
+ private $_grammar;
+ private $_headers;
+
+ protected function setUp()
+ {
+ $this->_cache = new Swift_KeyCache_ArrayKeyCache(
+ new Swift_KeyCache_SimpleKeyCacheInputStream()
+ );
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $this->_contentEncoder = new Swift_Mime_ContentEncoder_QpContentEncoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'),
+ new Swift_StreamFilters_ByteArrayReplacementFilter(
+ array(array(0x0D, 0x0A), array(0x0D), array(0x0A)),
+ array(array(0x0A), array(0x0A), array(0x0D, 0x0A))
+ )
+ );
+
+ $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $paramEncoder = new Swift_Encoder_Rfc2231Encoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $this->_grammar = new Swift_Mime_Grammar();
+ $this->_headers = new Swift_Mime_SimpleHeaderSet(
+ new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $this->_grammar)
+ );
+ }
+
+ public function testCharsetIsSetInHeader()
+ {
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setCharset('utf-8');
+ $part->setBody('foobar');
+ $this->assertEquals(
+ 'Content-Type: text/plain; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foobar',
+ $part->toString()
+ );
+ }
+
+ public function testFormatIsSetInHeaders()
+ {
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setFormat('flowed');
+ $part->setBody('> foobar');
+ $this->assertEquals(
+ 'Content-Type: text/plain; format=flowed'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ '> foobar',
+ $part->toString()
+ );
+ }
+
+ public function testDelSpIsSetInHeaders()
+ {
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setDelSp(true);
+ $part->setBody('foobar');
+ $this->assertEquals(
+ 'Content-Type: text/plain; delsp=yes'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foobar',
+ $part->toString()
+ );
+ }
+
+ public function testAll3ParamsInHeaders()
+ {
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setCharset('utf-8');
+ $part->setFormat('fixed');
+ $part->setDelSp(true);
+ $part->setBody('foobar');
+ $this->assertEquals(
+ 'Content-Type: text/plain; charset=utf-8; format=fixed; delsp=yes'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foobar',
+ $part->toString()
+ );
+ }
+
+ public function testBodyIsCanonicalized()
+ {
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setCharset('utf-8');
+ $part->setBody("foobar\r\rtest\ning\r");
+ $this->assertEquals(
+ 'Content-Type: text/plain; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ "foobar\r\n".
+ "\r\n".
+ "test\r\n".
+ "ing\r\n",
+ $part->toString()
+ );
+ }
+
+ protected function _createMimePart()
+ {
+ $entity = new Swift_Mime_MimePart(
+ $this->_headers,
+ $this->_contentEncoder,
+ $this->_cache,
+ $this->_grammar
+ );
+
+ return $entity;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php
new file mode 100644
index 0000000..912768e
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Mime/SimpleMessageAcceptanceTest.php
@@ -0,0 +1,1249 @@
+<?php
+
+class Swift_Mime_SimpleMessageAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ protected function setUp()
+ {
+ Swift_Preferences::getInstance()->setCharset(null); //TODO: Test with the charset defined
+ }
+
+ public function testBasicHeaders()
+ {
+ /* -- RFC 2822, 3.6.
+ */
+
+ $message = $this->_createMessage();
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString(),
+ '%s: Only required headers, and non-empty headers should be displayed'
+ );
+ }
+
+ public function testSubjectIsDisplayedIfSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testDateCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $id = $message->getId();
+ $message->setDate(1234);
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', 1234)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testMessageIdCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setId('foo@bar');
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <foo@bar>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testContentTypeCanBeChanged()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setContentType('text/html');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/html'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testCharsetCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setContentType('text/html');
+ $message->setCharset('iso-8859-1');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/html; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testFormatCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFormat('flowed');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain; format=flowed'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testEncoderCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setContentType('text/html');
+ $message->setEncoder(
+ new Swift_Mime_ContentEncoder_PlainContentEncoder('7bit')
+ );
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/html'."\r\n".
+ 'Content-Transfer-Encoding: 7bit'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testFromAddressCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom('chris.corbyn@swiftmailer.org');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: chris.corbyn@swiftmailer.org'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testFromAddressCanBeSetWithName()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris Corbyn'));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testMultipleFromAddressesCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org',
+ ));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>, mark@swiftmailer.org'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testReturnPathAddressCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testEmptyReturnPathHeaderCanBeUsed()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Return-Path: <>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testSenderCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setSender('chris.corbyn@swiftmailer.org');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Sender: chris.corbyn@swiftmailer.org'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testSenderCanBeSetWithName()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setSender(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Sender: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: '."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testReplyToCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array('chris@w3style.co.uk' => 'Myself'));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testMultipleReplyAddressCanBeUsed()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testToAddressCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $message->setTo('mark@swiftmailer.org');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'To: mark@swiftmailer.org'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testMultipleToAddressesCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $message->setTo(array(
+ 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn',
+ ));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'To: mark@swiftmailer.org, Chris Corbyn <chris@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testCcAddressCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $message->setTo(array(
+ 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn',
+ ));
+ $message->setCc('john@some-site.com');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'To: mark@swiftmailer.org, Chris Corbyn <chris@swiftmailer.org>'."\r\n".
+ 'Cc: john@some-site.com'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testMultipleCcAddressesCanBeSet()
+ {
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $message->setTo(array(
+ 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn',
+ ));
+ $message->setCc(array(
+ 'john@some-site.com' => 'John West',
+ 'fred@another-site.co.uk' => 'Big Fred',
+ ));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'To: mark@swiftmailer.org, Chris Corbyn <chris@swiftmailer.org>'."\r\n".
+ 'Cc: John West <john@some-site.com>, Big Fred <fred@another-site.co.uk>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testBccAddressCanBeSet()
+ {
+ //Obviously Transports need to setBcc(array()) and send to each Bcc recipient
+ // separately in accordance with RFC 2822/2821
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $message->setTo(array(
+ 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn',
+ ));
+ $message->setCc(array(
+ 'john@some-site.com' => 'John West',
+ 'fred@another-site.co.uk' => 'Big Fred',
+ ));
+ $message->setBcc('x@alphabet.tld');
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'To: mark@swiftmailer.org, Chris Corbyn <chris@swiftmailer.org>'."\r\n".
+ 'Cc: John West <john@some-site.com>, Big Fred <fred@another-site.co.uk>'."\r\n".
+ 'Bcc: x@alphabet.tld'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testMultipleBccAddressesCanBeSet()
+ {
+ //Obviously Transports need to setBcc(array()) and send to each Bcc recipient
+ // separately in accordance with RFC 2822/2821
+ $message = $this->_createMessage();
+ $message->setSubject('just a test subject');
+ $message->setFrom(array('chris.corbyn@swiftmailer.org' => 'Chris'));
+ $message->setReplyTo(array(
+ 'chris@w3style.co.uk' => 'Myself',
+ 'my.other@address.com' => 'Me',
+ ));
+ $message->setTo(array(
+ 'mark@swiftmailer.org', 'chris@swiftmailer.org' => 'Chris Corbyn',
+ ));
+ $message->setCc(array(
+ 'john@some-site.com' => 'John West',
+ 'fred@another-site.co.uk' => 'Big Fred',
+ ));
+ $message->setBcc(array('x@alphabet.tld', 'a@alphabet.tld' => 'A'));
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'Reply-To: Myself <chris@w3style.co.uk>, Me <my.other@address.com>'."\r\n".
+ 'To: mark@swiftmailer.org, Chris Corbyn <chris@swiftmailer.org>'."\r\n".
+ 'Cc: John West <john@some-site.com>, Big Fred <fred@another-site.co.uk>'."\r\n".
+ 'Bcc: x@alphabet.tld, A <a@alphabet.tld>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testStringBodyIsAppended()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $message->setBody(
+ 'just a test body'."\r\n".
+ 'with a new line'
+ );
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'just a test body'."\r\n".
+ 'with a new line',
+ $message->toString()
+ );
+ }
+
+ public function testStringBodyIsEncoded()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $message->setBody(
+ 'Just s'.pack('C*', 0xC2, 0x01, 0x01).'me multi-'."\r\n".
+ 'line message!'
+ );
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'Just s=C2=01=01me multi-'."\r\n".
+ 'line message!',
+ $message->toString()
+ );
+ }
+
+ public function testChildrenCanBeAttached()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = $message->getDate();
+ $boundary = $message->getBoundary();
+
+ $part1 = $this->_createMimePart();
+ $part1->setContentType('text/plain');
+ $part1->setCharset('iso-8859-1');
+ $part1->setBody('foo');
+
+ $message->attach($part1);
+
+ $part2 = $this->_createMimePart();
+ $part2->setContentType('text/html');
+ $part2->setCharset('iso-8859-1');
+ $part2->setBody('test <b>foo</b>');
+
+ $message->attach($part2);
+
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'test <b>foo</b>'.
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testAttachmentsBeingAttached()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setCharset('iso-8859-1');
+ $part->setBody('foo');
+
+ $message->attach($part);
+
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setBody('<pdf data>');
+
+ $message->attach($attachment);
+
+ $this->assertRegExp(
+ '~^'.
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/mixed;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: text/plain; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--\\1--'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<pdf data>'), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $message->toString()
+ );
+ }
+
+ public function testAttachmentsAndEmbeddedFilesBeingAttached()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setCharset('iso-8859-1');
+ $part->setBody('foo');
+
+ $message->attach($part);
+
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setBody('<pdf data>');
+
+ $message->attach($attachment);
+
+ $file = $this->_createEmbeddedFile();
+ $file->setContentType('image/jpeg');
+ $file->setFilename('myimage.jpg');
+ $file->setBody('<image data>');
+
+ $message->attach($file);
+
+ $cid = $file->getId();
+
+ $this->assertRegExp(
+ '~^'.
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/mixed;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: text/plain; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: multipart/related;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\2'."\r\n".
+ 'Content-Type: image/jpeg; name=myimage.jpg'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$cid.'>'."\r\n".
+ 'Content-Disposition: inline; filename=myimage.jpg'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<image data>'), '~').
+ "\r\n\r\n".
+ '--\\2--'."\r\n".
+ "\r\n\r\n".
+ '--\\1--'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<pdf data>'), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $message->toString()
+ );
+ }
+
+ public function testComplexEmbeddingOfContent()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setBody('<pdf data>');
+
+ $message->attach($attachment);
+
+ $file = $this->_createEmbeddedFile();
+ $file->setContentType('image/jpeg');
+ $file->setFilename('myimage.jpg');
+ $file->setBody('<image data>');
+
+ $part = $this->_createMimePart();
+ $part->setContentType('text/html');
+ $part->setCharset('iso-8859-1');
+ $part->setBody('foo <img src="'.$message->embed($file).'" />');
+
+ $message->attach($part);
+
+ $cid = $file->getId();
+
+ $this->assertRegExp(
+ '~^'.
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/mixed;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: multipart/related;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: text/html; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo <img src=3D"cid:'.$cid.'" />'.//=3D is just = in QP
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: image/jpeg; name=myimage.jpg'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$cid.'>'."\r\n".
+ 'Content-Disposition: inline; filename=myimage.jpg'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<image data>'), '~').
+ "\r\n\r\n".
+ '--\\1--'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<pdf data>'), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $message->toString()
+ );
+ }
+
+ public function testAttachingAndDetachingContent()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+
+ $part = $this->_createMimePart();
+ $part->setContentType('text/plain');
+ $part->setCharset('iso-8859-1');
+ $part->setBody('foo');
+
+ $message->attach($part);
+
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setBody('<pdf data>');
+
+ $message->attach($attachment);
+
+ $file = $this->_createEmbeddedFile();
+ $file->setContentType('image/jpeg');
+ $file->setFilename('myimage.jpg');
+ $file->setBody('<image data>');
+
+ $message->attach($file);
+
+ $cid = $file->getId();
+
+ $message->detach($attachment);
+
+ $this->assertRegExp(
+ '~^'.
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: multipart/related;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: image/jpeg; name=myimage.jpg'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$cid.'>'."\r\n".
+ 'Content-Disposition: inline; filename=myimage.jpg'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<image data>'), '~').
+ "\r\n\r\n".
+ '--\\1--'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $message->toString(),
+ '%s: Attachment should have been detached'
+ );
+ }
+
+ public function testBoundaryDoesNotAppearAfterAllPartsAreDetached()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = $message->getDate();
+ $boundary = $message->getBoundary();
+
+ $part1 = $this->_createMimePart();
+ $part1->setContentType('text/plain');
+ $part1->setCharset('iso-8859-1');
+ $part1->setBody('foo');
+
+ $message->attach($part1);
+
+ $part2 = $this->_createMimePart();
+ $part2->setContentType('text/html');
+ $part2->setCharset('iso-8859-1');
+ $part2->setBody('test <b>foo</b>');
+
+ $message->attach($part2);
+
+ $message->detach($part1);
+ $message->detach($part2);
+
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n",
+ $message->toString(),
+ '%s: Message should be restored to orignal state after parts are detached'
+ );
+ }
+
+ public function testCharsetFormatOrDelSpAreNotShownWhenBoundaryIsSet()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $message->setCharset('utf-8');
+ $message->setFormat('flowed');
+ $message->setDelSp(true);
+
+ $id = $message->getId();
+ $date = $message->getDate();
+ $boundary = $message->getBoundary();
+
+ $part1 = $this->_createMimePart();
+ $part1->setContentType('text/plain');
+ $part1->setCharset('iso-8859-1');
+ $part1->setBody('foo');
+
+ $message->attach($part1);
+
+ $part2 = $this->_createMimePart();
+ $part2->setContentType('text/html');
+ $part2->setCharset('iso-8859-1');
+ $part2->setBody('test <b>foo</b>');
+
+ $message->attach($part2);
+
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'test <b>foo</b>'.
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testBodyCanBeSetWithAttachments()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $message->setContentType('text/html');
+ $message->setCharset('iso-8859-1');
+ $message->setBody('foo');
+
+ $id = $message->getId();
+ $date = date('r', $message->getDate());
+ $boundary = $message->getBoundary();
+
+ $attachment = $this->_createAttachment();
+ $attachment->setContentType('application/pdf');
+ $attachment->setFilename('foo.pdf');
+ $attachment->setBody('<pdf data>');
+
+ $message->attach($attachment);
+
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/mixed;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=iso-8859-1'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: application/pdf; name=foo.pdf'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=foo.pdf'."\r\n".
+ "\r\n".
+ base64_encode('<pdf data>').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testHtmlPartAlwaysAppearsLast()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+
+ $id = $message->getId();
+ $date = date('r', $message->getDate());
+ $boundary = $message->getBoundary();
+
+ $part1 = $this->_createMimePart();
+ $part1->setContentType('text/html');
+ $part1->setBody('foo');
+
+ $part2 = $this->_createMimePart();
+ $part2->setContentType('text/plain');
+ $part2->setBody('bar');
+
+ $message->attach($part1);
+ $message->attach($part2);
+
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'bar'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testBodyBecomesPartIfOtherPartsAttached()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $message->setContentType('text/html');
+ $message->setBody('foo');
+
+ $id = $message->getId();
+ $date = date('r', $message->getDate());
+ $boundary = $message->getBoundary();
+
+ $part2 = $this->_createMimePart();
+ $part2->setContentType('text/plain');
+ $part2->setBody('bar');
+
+ $message->attach($part2);
+
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'bar'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'foo'.
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n",
+ $message->toString()
+ );
+ }
+
+ public function testBodyIsCanonicalized()
+ {
+ $message = $this->_createMessage();
+ $message->setReturnPath('chris@w3style.co.uk');
+ $message->setSubject('just a test subject');
+ $message->setFrom(array(
+ 'chris.corbyn@swiftmailer.org' => 'Chris Corbyn', ));
+ $message->setBody(
+ 'just a test body'."\n".
+ 'with a new line'
+ );
+ $id = $message->getId();
+ $date = $message->getDate();
+ $this->assertEquals(
+ 'Return-Path: <chris@w3style.co.uk>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.date('r', $date)."\r\n".
+ 'Subject: just a test subject'."\r\n".
+ 'From: Chris Corbyn <chris.corbyn@swiftmailer.org>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: text/plain'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'just a test body'."\r\n".
+ 'with a new line',
+ $message->toString()
+ );
+ }
+
+ protected function _createMessage()
+ {
+ return new Swift_Message();
+ }
+
+ protected function _createMimePart()
+ {
+ return new Swift_MimePart();
+ }
+
+ protected function _createAttachment()
+ {
+ return new Swift_Attachment();
+ }
+
+ protected function _createEmbeddedFile()
+ {
+ return new Swift_EmbeddedFile();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php
new file mode 100644
index 0000000..f42405d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/MimePartAcceptanceTest.php
@@ -0,0 +1,15 @@
+<?php
+
+require_once 'swift_required.php';
+require_once __DIR__.'/Mime/MimePartAcceptanceTest.php';
+
+class Swift_MimePartAcceptanceTest extends Swift_Mime_MimePartAcceptanceTest
+{
+ protected function _createMimePart()
+ {
+ Swift_DependencyContainer::getInstance()
+ ->register('properties.charset')->asValue(null);
+
+ return Swift_MimePart::newInstance();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php
new file mode 100644
index 0000000..21abc13
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/AbstractStreamBufferAcceptanceTest.php
@@ -0,0 +1,131 @@
+<?php
+
+abstract class Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest extends \PHPUnit_Framework_TestCase
+{
+ protected $_buffer;
+
+ abstract protected function _initializeBuffer();
+
+ protected function setUp()
+ {
+ if (true == getenv('TRAVIS')) {
+ $this->markTestSkipped(
+ 'Will fail on travis-ci if not skipped due to travis blocking '.
+ 'socket mailing tcp connections.'
+ );
+ }
+
+ $this->_buffer = new Swift_Transport_StreamBuffer(
+ $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock()
+ );
+ }
+
+ public function testReadLine()
+ {
+ $this->_initializeBuffer();
+
+ $line = $this->_buffer->readLine(0);
+ $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line);
+ $seq = $this->_buffer->write("QUIT\r\n");
+ $this->assertTrue((bool) $seq);
+ $line = $this->_buffer->readLine($seq);
+ $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line);
+ $this->_buffer->terminate();
+ }
+
+ public function testWrite()
+ {
+ $this->_initializeBuffer();
+
+ $line = $this->_buffer->readLine(0);
+ $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line);
+
+ $seq = $this->_buffer->write("HELO foo\r\n");
+ $this->assertTrue((bool) $seq);
+ $line = $this->_buffer->readLine($seq);
+ $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line);
+
+ $seq = $this->_buffer->write("QUIT\r\n");
+ $this->assertTrue((bool) $seq);
+ $line = $this->_buffer->readLine($seq);
+ $this->assertRegExp('/^[0-9]{3}.*?\r\n$/D', $line);
+ $this->_buffer->terminate();
+ }
+
+ public function testBindingOtherStreamsMirrorsWriteOperations()
+ {
+ $this->_initializeBuffer();
+
+ $is1 = $this->_createMockInputStream();
+ $is2 = $this->_createMockInputStream();
+
+ $is1->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is1->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+ $is2->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is2->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+
+ $this->_buffer->bind($is1);
+ $this->_buffer->bind($is2);
+
+ $this->_buffer->write('x');
+ $this->_buffer->write('y');
+ }
+
+ public function testBindingOtherStreamsMirrorsFlushOperations()
+ {
+ $this->_initializeBuffer();
+
+ $is1 = $this->_createMockInputStream();
+ $is2 = $this->_createMockInputStream();
+
+ $is1->expects($this->once())
+ ->method('flushBuffers');
+ $is2->expects($this->once())
+ ->method('flushBuffers');
+
+ $this->_buffer->bind($is1);
+ $this->_buffer->bind($is2);
+
+ $this->_buffer->flushBuffers();
+ }
+
+ public function testUnbindingStreamPreventsFurtherWrites()
+ {
+ $this->_initializeBuffer();
+
+ $is1 = $this->_createMockInputStream();
+ $is2 = $this->_createMockInputStream();
+
+ $is1->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is1->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+ $is2->expects($this->once())
+ ->method('write')
+ ->with('x');
+
+ $this->_buffer->bind($is1);
+ $this->_buffer->bind($is2);
+
+ $this->_buffer->write('x');
+
+ $this->_buffer->unbind($is2);
+
+ $this->_buffer->write('y');
+ }
+
+ private function _createMockInputStream()
+ {
+ return $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php
new file mode 100644
index 0000000..4c3c7d3
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/BasicSocketAcceptanceTest.php
@@ -0,0 +1,33 @@
+<?php
+
+require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php';
+
+class Swift_Transport_StreamBuffer_BasicSocketAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest
+{
+ protected function setUp()
+ {
+ if (!defined('SWIFT_SMTP_HOST')) {
+ $this->markTestSkipped(
+ 'Cannot run test without an SMTP host to connect to (define '.
+ 'SWIFT_SMTP_HOST in tests/acceptance.conf.php if you wish to run this test)'
+ );
+ }
+ parent::setUp();
+ }
+
+ protected function _initializeBuffer()
+ {
+ $parts = explode(':', SWIFT_SMTP_HOST);
+ $host = $parts[0];
+ $port = isset($parts[1]) ? $parts[1] : 25;
+
+ $this->_buffer->initialize(array(
+ 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET,
+ 'host' => $host,
+ 'port' => $port,
+ 'protocol' => 'tcp',
+ 'blocking' => 1,
+ 'timeout' => 15,
+ ));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php
new file mode 100644
index 0000000..a37439d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/ProcessAcceptanceTest.php
@@ -0,0 +1,26 @@
+<?php
+
+require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php';
+
+class Swift_Transport_StreamBuffer_ProcessAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest
+{
+ protected function setUp()
+ {
+ if (!defined('SWIFT_SENDMAIL_PATH')) {
+ $this->markTestSkipped(
+ 'Cannot run test without a path to sendmail (define '.
+ 'SWIFT_SENDMAIL_PATH in tests/acceptance.conf.php if you wish to run this test)'
+ );
+ }
+
+ parent::setUp();
+ }
+
+ protected function _initializeBuffer()
+ {
+ $this->_buffer->initialize(array(
+ 'type' => Swift_Transport_IoBuffer::TYPE_PROCESS,
+ 'command' => SWIFT_SENDMAIL_PATH.' -bs',
+ ));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php
new file mode 100644
index 0000000..59362b0
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SocketTimeoutTest.php
@@ -0,0 +1,67 @@
+<?php
+
+class Swift_Transport_StreamBuffer_SocketTimeoutTest extends \PHPUnit_Framework_TestCase
+{
+ protected $_buffer;
+
+ protected $_randomHighPort;
+
+ protected $_server;
+
+ protected function setUp()
+ {
+ if (!defined('SWIFT_SMTP_HOST')) {
+ $this->markTestSkipped(
+ 'Cannot run test without an SMTP host to connect to (define '.
+ 'SWIFT_SMTP_HOST in tests/acceptance.conf.php if you wish to run this test)'
+ );
+ }
+
+ $serverStarted = false;
+ for ($i = 0; $i < 5; ++$i) {
+ $this->_randomHighPort = rand(50000, 65000);
+ $this->_server = stream_socket_server('tcp://127.0.0.1:'.$this->_randomHighPort);
+ if ($this->_server) {
+ $serverStarted = true;
+ }
+ }
+
+ $this->_buffer = new Swift_Transport_StreamBuffer(
+ $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock()
+ );
+ }
+
+ protected function _initializeBuffer()
+ {
+ $host = '127.0.0.1';
+ $port = $this->_randomHighPort;
+
+ $this->_buffer->initialize(array(
+ 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET,
+ 'host' => $host,
+ 'port' => $port,
+ 'protocol' => 'tcp',
+ 'blocking' => 1,
+ 'timeout' => 1,
+ ));
+ }
+
+ public function testTimeoutException()
+ {
+ $this->_initializeBuffer();
+ $e = null;
+ try {
+ $line = $this->_buffer->readLine(0);
+ } catch (Exception $e) {
+ }
+ $this->assertInstanceOf('Swift_IoException', $e, 'IO Exception Not Thrown On Connection Timeout');
+ $this->assertRegExp('/Connection to .* Timed Out/', $e->getMessage());
+ }
+
+ protected function tearDown()
+ {
+ if ($this->_server) {
+ stream_socket_shutdown($this->_server, STREAM_SHUT_RDWR);
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php
new file mode 100644
index 0000000..32e0fe8
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/SslSocketAcceptanceTest.php
@@ -0,0 +1,40 @@
+<?php
+
+require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php';
+
+class Swift_Transport_StreamBuffer_SslSocketAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest
+{
+ protected function setUp()
+ {
+ $streams = stream_get_transports();
+ if (!in_array('ssl', $streams)) {
+ $this->markTestSkipped(
+ 'SSL is not configured for your system. It is not possible to run this test'
+ );
+ }
+ if (!defined('SWIFT_SSL_HOST')) {
+ $this->markTestSkipped(
+ 'Cannot run test without an SSL enabled SMTP host to connect to (define '.
+ 'SWIFT_SSL_HOST in tests/acceptance.conf.php if you wish to run this test)'
+ );
+ }
+
+ parent::setUp();
+ }
+
+ protected function _initializeBuffer()
+ {
+ $parts = explode(':', SWIFT_SSL_HOST);
+ $host = $parts[0];
+ $port = isset($parts[1]) ? $parts[1] : 25;
+
+ $this->_buffer->initialize(array(
+ 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET,
+ 'host' => $host,
+ 'port' => $port,
+ 'protocol' => 'ssl',
+ 'blocking' => 1,
+ 'timeout' => 15,
+ ));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php
new file mode 100644
index 0000000..1053a87
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/acceptance/Swift/Transport/StreamBuffer/TlsSocketAcceptanceTest.php
@@ -0,0 +1,39 @@
+<?php
+
+require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php';
+
+class Swift_Transport_StreamBuffer_TlsSocketAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest
+{
+ protected function setUp()
+ {
+ $streams = stream_get_transports();
+ if (!in_array('tls', $streams)) {
+ $this->markTestSkipped(
+ 'TLS is not configured for your system. It is not possible to run this test'
+ );
+ }
+ if (!defined('SWIFT_TLS_HOST')) {
+ $this->markTestSkipped(
+ 'Cannot run test without a TLS enabled SMTP host to connect to (define '.
+ 'SWIFT_TLS_HOST in tests/acceptance.conf.php if you wish to run this test)'
+ );
+ }
+ parent::setUp();
+ }
+
+ protected function _initializeBuffer()
+ {
+ $parts = explode(':', SWIFT_TLS_HOST);
+ $host = $parts[0];
+ $port = isset($parts[1]) ? $parts[1] : 25;
+
+ $this->_buffer->initialize(array(
+ 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET,
+ 'host' => $host,
+ 'port' => $port,
+ 'protocol' => 'tls',
+ 'blocking' => 1,
+ 'timeout' => 15,
+ ));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bootstrap.php b/vendor/swiftmailer/swiftmailer/tests/bootstrap.php
new file mode 100644
index 0000000..27091a2
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bootstrap.php
@@ -0,0 +1,21 @@
+<?php
+
+require_once dirname(__DIR__).'/vendor/autoload.php';
+
+// Disable garbage collector to prevent segfaults
+gc_disable();
+
+set_include_path(get_include_path().PATH_SEPARATOR.dirname(__DIR__).'/lib');
+
+Mockery::getConfiguration()->allowMockingNonExistentMethods(true);
+
+if (is_file(__DIR__.'/acceptance.conf.php')) {
+ require_once __DIR__.'/acceptance.conf.php';
+}
+if (is_file(__DIR__.'/smoke.conf.php')) {
+ require_once __DIR__.'/smoke.conf.php';
+}
+require_once __DIR__.'/StreamCollector.php';
+require_once __DIR__.'/IdenticalBinaryConstraint.php';
+require_once __DIR__.'/SwiftMailerTestCase.php';
+require_once __DIR__.'/SwiftMailerSmokeTestCase.php';
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php
new file mode 100644
index 0000000..ba29ba8
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug111Test.php
@@ -0,0 +1,42 @@
+<?php
+
+class Swift_Bug111Test extends \PHPUnit_Framework_TestCase
+{
+ public function testUnstructuredHeaderSlashesShouldNotBeEscaped()
+ {
+ $complicated_header = array(
+ 'to' => array(
+ 'email1@example.com',
+ 'email2@example.com',
+ 'email3@example.com',
+ 'email4@example.com',
+ 'email5@example.com',
+ ),
+ 'sub' => array(
+ '-name-' => array(
+ 'email1',
+ '"email2"',
+ 'email3\\',
+ 'email4',
+ 'email5',
+ ),
+ '-url-' => array(
+ 'http://google.com',
+ 'http://yahoo.com',
+ 'http://hotmail.com',
+ 'http://aol.com',
+ 'http://facebook.com',
+ ),
+ ),
+ );
+ $json = json_encode($complicated_header);
+
+ $message = new Swift_Message();
+ $headers = $message->getHeaders();
+ $headers->addTextHeader('X-SMTPAPI', $json);
+ $header = $headers->get('X-SMTPAPI');
+
+ $this->assertEquals('Swift_Mime_Headers_UnstructuredHeader', get_class($header));
+ $this->assertEquals($json, $header->getFieldBody());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php
new file mode 100644
index 0000000..40b5a77
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug118Test.php
@@ -0,0 +1,20 @@
+<?php
+
+class Swift_Bug118Test extends \PHPUnit_Framework_TestCase
+{
+ private $_message;
+
+ protected function setUp()
+ {
+ $this->_message = new Swift_Message();
+ }
+
+ public function testCallingGenerateIdChangesTheMessageId()
+ {
+ $currentId = $this->_message->getId();
+ $this->_message->generateId();
+ $newId = $this->_message->getId();
+
+ $this->assertNotEquals($currentId, $newId);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php
new file mode 100644
index 0000000..7563f4d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug206Test.php
@@ -0,0 +1,38 @@
+<?php
+
+class Swift_Bug206Test extends \PHPUnit_Framework_TestCase
+{
+ private $_factory;
+
+ protected function setUp()
+ {
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $paramEncoder = new Swift_Encoder_Rfc2231Encoder(
+ new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8')
+ );
+ $grammar = new Swift_Mime_Grammar();
+ $this->_factory = new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $grammar);
+ }
+
+ public function testMailboxHeaderEncoding()
+ {
+ $this->_testHeaderIsFullyEncoded('email@example.org', 'Family Name, Name', ' "Family Name, Name" <email@example.org>');
+ $this->_testHeaderIsFullyEncoded('email@example.org', 'Family Namé, Name', ' Family =?utf-8?Q?Nam=C3=A9=2C?= Name');
+ $this->_testHeaderIsFullyEncoded('email@example.org', 'Family Namé , Name', ' Family =?utf-8?Q?Nam=C3=A9_=2C?= Name');
+ $this->_testHeaderIsFullyEncoded('email@example.org', 'Family Namé ;Name', ' Family =?utf-8?Q?Nam=C3=A9_=3BName?= ');
+ }
+
+ private function _testHeaderIsFullyEncoded($email, $name, $expected)
+ {
+ $mailboxHeader = $this->_factory->createMailboxHeader('To', array(
+ $email => $name,
+ ));
+
+ $headerBody = substr($mailboxHeader->toString(), 3, strlen($expected));
+
+ $this->assertEquals($expected, $headerBody);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php
new file mode 100644
index 0000000..f5f057a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug274Test.php
@@ -0,0 +1,21 @@
+<?php
+
+class Swift_Bug274Test extends \PHPUnit_Framework_TestCase
+{
+ public function testEmptyFileNameAsAttachment()
+ {
+ $message = new Swift_Message();
+ $this->setExpectedException('Swift_IoException', 'The path cannot be empty');
+ $message->attach(Swift_Attachment::fromPath(''));
+ }
+
+ public function testNonEmptyFileNameAsAttachment()
+ {
+ $message = new Swift_Message();
+ try {
+ $message->attach(Swift_Attachment::fromPath(__FILE__));
+ } catch (Exception $e) {
+ $this->fail('Path should not be empty');
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php
new file mode 100644
index 0000000..768bf3d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug34Test.php
@@ -0,0 +1,75 @@
+<?php
+
+class Swift_Bug34Test extends \PHPUnit_Framework_TestCase
+{
+ protected function setUp()
+ {
+ Swift_Preferences::getInstance()->setCharset('utf-8');
+ }
+
+ public function testEmbeddedFilesWithMultipartDataCreateMultipartRelatedContentAsAnAlternative()
+ {
+ $message = Swift_Message::newInstance();
+ $message->setCharset('utf-8');
+ $message->setSubject('test subject');
+ $message->addPart('plain part', 'text/plain');
+
+ $image = Swift_Image::newInstance('<image data>', 'image.gif', 'image/gif');
+ $cid = $message->embed($image);
+
+ $message->setBody('<img src="'.$cid.'" />', 'text/html');
+
+ $message->setTo(array('user@domain.tld' => 'User'));
+
+ $message->setFrom(array('other@domain.tld' => 'Other'));
+ $message->setSender(array('other@domain.tld' => 'Other'));
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+ $cidVal = $image->getId();
+
+ $this->assertRegExp(
+ '~^'.
+ 'Sender: Other <other@domain.tld>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: test subject'."\r\n".
+ 'From: Other <other@domain.tld>'."\r\n".
+ 'To: User <user@domain.tld>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/plain; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'plain part'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: multipart/related;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: text/html; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ '<img.*?/>'.
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: image/gif; name=image.gif'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.$cidVal.'>'."\r\n".
+ 'Content-Disposition: inline; filename=image.gif'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<image data>'), '~').
+ "\r\n\r\n".
+ '--\\1--'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $message->toString()
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php
new file mode 100644
index 0000000..98999f0
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug35Test.php
@@ -0,0 +1,73 @@
+<?php
+
+class Swift_Bug35Test extends \PHPUnit_Framework_TestCase
+{
+ protected function setUp()
+ {
+ Swift_Preferences::getInstance()->setCharset('utf-8');
+ }
+
+ public function testHTMLPartAppearsLastEvenWhenAttachmentsAdded()
+ {
+ $message = Swift_Message::newInstance();
+ $message->setCharset('utf-8');
+ $message->setSubject('test subject');
+ $message->addPart('plain part', 'text/plain');
+
+ $attachment = Swift_Attachment::newInstance('<data>', 'image.gif', 'image/gif');
+ $message->attach($attachment);
+
+ $message->setBody('HTML part', 'text/html');
+
+ $message->setTo(array('user@domain.tld' => 'User'));
+
+ $message->setFrom(array('other@domain.tld' => 'Other'));
+ $message->setSender(array('other@domain.tld' => 'Other'));
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+
+ $this->assertRegExp(
+ '~^'.
+ 'Sender: Other <other@domain.tld>'."\r\n".
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: test subject'."\r\n".
+ 'From: Other <other@domain.tld>'."\r\n".
+ 'To: User <user@domain.tld>'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/mixed;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: multipart/alternative;'."\r\n".
+ ' boundary="(.*?)"'."\r\n".
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: text/plain; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'plain part'.
+ "\r\n\r\n".
+ '--\\1'."\r\n".
+ 'Content-Type: text/html; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'HTML part'.
+ "\r\n\r\n".
+ '--\\1--'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: image/gif; name=image.gif'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename=image.gif'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<data>'), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $message->toString()
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php
new file mode 100644
index 0000000..9deae4f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug38Test.php
@@ -0,0 +1,192 @@
+<?php
+
+class Swift_Bug38Test extends \PHPUnit_Framework_TestCase
+{
+ private $_attFile;
+ private $_attFileName;
+ private $_attFileType;
+
+ protected function setUp()
+ {
+ $this->_attFileName = 'data.txt';
+ $this->_attFileType = 'text/plain';
+ $this->_attFile = __DIR__.'/../../_samples/files/data.txt';
+ Swift_Preferences::getInstance()->setCharset('utf-8');
+ }
+
+ public function testWritingMessageToByteStreamProducesCorrectStructure()
+ {
+ $message = new Swift_Message();
+ $message->setSubject('test subject');
+ $message->setTo('user@domain.tld');
+ $message->setCc('other@domain.tld');
+ $message->setFrom('user@domain.tld');
+
+ $image = new Swift_Image('<data>', 'image.gif', 'image/gif');
+
+ $cid = $message->embed($image);
+ $message->setBody('HTML part', 'text/html');
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+ $imgId = $image->getId();
+
+ $stream = new Swift_ByteStream_ArrayByteStream();
+
+ $message->toByteStream($stream);
+
+ $this->assertPatternInStream(
+ '~^'.
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: test subject'."\r\n".
+ 'From: user@domain.tld'."\r\n".
+ 'To: user@domain.tld'."\r\n".
+ 'Cc: other@domain.tld'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/related;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'HTML part'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: image/gif; name=image.gif'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.preg_quote($imgId, '~').'>'."\r\n".
+ 'Content-Disposition: inline; filename=image.gif'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<data>'), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D',
+ $stream
+ );
+ }
+
+ public function testWritingMessageToByteStreamTwiceProducesCorrectStructure()
+ {
+ $message = new Swift_Message();
+ $message->setSubject('test subject');
+ $message->setTo('user@domain.tld');
+ $message->setCc('other@domain.tld');
+ $message->setFrom('user@domain.tld');
+
+ $image = new Swift_Image('<data>', 'image.gif', 'image/gif');
+
+ $cid = $message->embed($image);
+ $message->setBody('HTML part', 'text/html');
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+ $imgId = $image->getId();
+
+ $pattern = '~^'.
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: test subject'."\r\n".
+ 'From: user@domain.tld'."\r\n".
+ 'To: user@domain.tld'."\r\n".
+ 'Cc: other@domain.tld'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/related;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'HTML part'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: image/gif; name=image.gif'."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-ID: <'.preg_quote($imgId, '~').'>'."\r\n".
+ 'Content-Disposition: inline; filename=image.gif'."\r\n".
+ "\r\n".
+ preg_quote(base64_encode('<data>'), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D'
+ ;
+
+ $streamA = new Swift_ByteStream_ArrayByteStream();
+ $streamB = new Swift_ByteStream_ArrayByteStream();
+
+ $message->toByteStream($streamA);
+ $message->toByteStream($streamB);
+
+ $this->assertPatternInStream($pattern, $streamA);
+ $this->assertPatternInStream($pattern, $streamB);
+ }
+
+ public function testWritingMessageToByteStreamTwiceUsingAFileAttachment()
+ {
+ $message = new Swift_Message();
+ $message->setSubject('test subject');
+ $message->setTo('user@domain.tld');
+ $message->setCc('other@domain.tld');
+ $message->setFrom('user@domain.tld');
+
+ $attachment = Swift_Attachment::fromPath($this->_attFile);
+
+ $message->attach($attachment);
+
+ $message->setBody('HTML part', 'text/html');
+
+ $id = $message->getId();
+ $date = preg_quote(date('r', $message->getDate()), '~');
+ $boundary = $message->getBoundary();
+
+ $streamA = new Swift_ByteStream_ArrayByteStream();
+ $streamB = new Swift_ByteStream_ArrayByteStream();
+
+ $pattern = '~^'.
+ 'Message-ID: <'.$id.'>'."\r\n".
+ 'Date: '.$date."\r\n".
+ 'Subject: test subject'."\r\n".
+ 'From: user@domain.tld'."\r\n".
+ 'To: user@domain.tld'."\r\n".
+ 'Cc: other@domain.tld'."\r\n".
+ 'MIME-Version: 1.0'."\r\n".
+ 'Content-Type: multipart/mixed;'."\r\n".
+ ' boundary="'.$boundary.'"'."\r\n".
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: text/html; charset=utf-8'."\r\n".
+ 'Content-Transfer-Encoding: quoted-printable'."\r\n".
+ "\r\n".
+ 'HTML part'.
+ "\r\n\r\n".
+ '--'.$boundary."\r\n".
+ 'Content-Type: '.$this->_attFileType.'; name='.$this->_attFileName."\r\n".
+ 'Content-Transfer-Encoding: base64'."\r\n".
+ 'Content-Disposition: attachment; filename='.$this->_attFileName."\r\n".
+ "\r\n".
+ preg_quote(base64_encode(file_get_contents($this->_attFile)), '~').
+ "\r\n\r\n".
+ '--'.$boundary.'--'."\r\n".
+ '$~D'
+ ;
+
+ $message->toByteStream($streamA);
+ $message->toByteStream($streamB);
+
+ $this->assertPatternInStream($pattern, $streamA);
+ $this->assertPatternInStream($pattern, $streamB);
+ }
+
+ public function assertPatternInStream($pattern, $stream, $message = '%s')
+ {
+ $string = '';
+ while (false !== $bytes = $stream->read(8192)) {
+ $string .= $bytes;
+ }
+ $this->assertRegExp($pattern, $string, $message);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php
new file mode 100644
index 0000000..b83984f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug518Test.php
@@ -0,0 +1,38 @@
+<?php
+
+use Mockery as m;
+
+class Swift_Bug518Test extends \PHPUnit_Framework_TestCase
+{
+ public function testIfEmailChangesAfterQueued()
+ {
+ $failedRecipients = 'value';
+ $message = new Swift_Message();
+ $message->setTo('foo@bar.com');
+
+ $that = $this;
+ $messageValidation = function ($m) use ($that) {
+ //the getTo should return the same value as we put in
+ $that->assertEquals('foo@bar.com', key($m->getTo()), 'The message has changed after it was put to the memory queue');
+
+ return true;
+ };
+
+ $transport = m::mock('Swift_Transport');
+ $transport->shouldReceive('isStarted')->andReturn(true);
+ $transport->shouldReceive('send')
+ ->with(m::on($messageValidation), $failedRecipients)
+ ->andReturn(1);
+
+ $memorySpool = new Swift_MemorySpool();
+ $memorySpool->queueMessage($message);
+
+ /*
+ * The message is queued in memory.
+ * Lets change the message
+ */
+ $message->setTo('other@value.com');
+
+ $memorySpool->flushQueue($transport, $failedRecipients);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php
new file mode 100644
index 0000000..48074f0
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug51Test.php
@@ -0,0 +1,110 @@
+<?php
+
+class Swift_Bug51Test extends \SwiftMailerTestCase
+{
+ private $_attachmentFile;
+ private $_outputFile;
+
+ protected function setUp()
+ {
+ $this->_attachmentFile = sys_get_temp_dir().'/attach.rand.bin';
+ file_put_contents($this->_attachmentFile, '');
+
+ $this->_outputFile = sys_get_temp_dir().'/attach.out.bin';
+ file_put_contents($this->_outputFile, '');
+ }
+
+ protected function tearDown()
+ {
+ unlink($this->_attachmentFile);
+ unlink($this->_outputFile);
+ }
+
+ public function testAttachmentsDoNotGetTruncatedUsingToByteStream()
+ {
+ //Run 100 times with 10KB attachments
+ for ($i = 0; $i < 10; ++$i) {
+ $message = $this->_createMessageWithRandomAttachment(
+ 10000, $this->_attachmentFile
+ );
+
+ file_put_contents($this->_outputFile, '');
+ $message->toByteStream(
+ new Swift_ByteStream_FileByteStream($this->_outputFile, true)
+ );
+
+ $emailSource = file_get_contents($this->_outputFile);
+
+ $this->assertAttachmentFromSourceMatches(
+ file_get_contents($this->_attachmentFile),
+ $emailSource
+ );
+ }
+ }
+
+ public function testAttachmentsDoNotGetTruncatedUsingToString()
+ {
+ //Run 100 times with 10KB attachments
+ for ($i = 0; $i < 10; ++$i) {
+ $message = $this->_createMessageWithRandomAttachment(
+ 10000, $this->_attachmentFile
+ );
+
+ $emailSource = $message->toString();
+
+ $this->assertAttachmentFromSourceMatches(
+ file_get_contents($this->_attachmentFile),
+ $emailSource
+ );
+ }
+ }
+
+ public function assertAttachmentFromSourceMatches($attachmentData, $source)
+ {
+ $encHeader = 'Content-Transfer-Encoding: base64';
+ $base64declaration = strpos($source, $encHeader);
+
+ $attachmentDataStart = strpos($source, "\r\n\r\n", $base64declaration);
+ $attachmentDataEnd = strpos($source, "\r\n--", $attachmentDataStart);
+
+ if (false === $attachmentDataEnd) {
+ $attachmentBase64 = trim(substr($source, $attachmentDataStart));
+ } else {
+ $attachmentBase64 = trim(substr(
+ $source, $attachmentDataStart,
+ $attachmentDataEnd - $attachmentDataStart
+ ));
+ }
+
+ $this->assertIdenticalBinary($attachmentData, base64_decode($attachmentBase64));
+ }
+
+ private function _fillFileWithRandomBytes($byteCount, $file)
+ {
+ // I was going to use dd with if=/dev/random but this way seems more
+ // cross platform even if a hella expensive!!
+
+ file_put_contents($file, '');
+ $fp = fopen($file, 'wb');
+ for ($i = 0; $i < $byteCount; ++$i) {
+ $byteVal = rand(0, 255);
+ fwrite($fp, pack('i', $byteVal));
+ }
+ fclose($fp);
+ }
+
+ private function _createMessageWithRandomAttachment($size, $attachmentPath)
+ {
+ $this->_fillFileWithRandomBytes($size, $attachmentPath);
+
+ $message = Swift_Message::newInstance()
+ ->setSubject('test')
+ ->setBody('test')
+ ->setFrom('a@b.c')
+ ->setTo('d@e.f')
+ ->attach(Swift_Attachment::fromPath($attachmentPath))
+ ;
+
+ return $message;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php
new file mode 100644
index 0000000..263cae5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug534Test.php
@@ -0,0 +1,38 @@
+<?php
+
+use Mockery as m;
+
+class Swift_Bug534Test extends \PHPUnit_Framework_TestCase
+{
+ public function testEmbeddedImagesAreEmbedded()
+ {
+ $message = Swift_Message::newInstance()
+ ->setFrom('from@example.com')
+ ->setTo('to@example.com')
+ ->setSubject('test')
+ ;
+ $cid = $message->embed(Swift_Image::fromPath(__DIR__.'/../../_samples/files/swiftmailer.png'));
+ $message->setBody('<img src="'.$cid.'" />', 'text/html');
+
+ $that = $this;
+ $messageValidation = function (Swift_Mime_Message $message) use ($that) {
+ preg_match('/cid:(.*)"/', $message->toString(), $matches);
+ $cid = $matches[1];
+ preg_match('/Content-ID: <(.*)>/', $message->toString(), $matches);
+ $contentId = $matches[1];
+ $that->assertEquals($cid, $contentId, 'cid in body and mime part Content-ID differ');
+
+ return true;
+ };
+
+ $failedRecipients = array();
+
+ $transport = m::mock('Swift_Transport');
+ $transport->shouldReceive('isStarted')->andReturn(true);
+ $transport->shouldReceive('send')->with(m::on($messageValidation), $failedRecipients)->andReturn(1);
+
+ $memorySpool = new Swift_MemorySpool();
+ $memorySpool->queueMessage($message);
+ $memorySpool->flushQueue($transport, $failedRecipients);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php
new file mode 100644
index 0000000..3393fb8
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug650Test.php
@@ -0,0 +1,36 @@
+<?php
+
+class Swift_Bug650Test extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider encodingDataProvider
+ *
+ * @param string $name
+ * @param string $expectedEncodedName
+ */
+ public function testMailboxHeaderEncoding($name, $expectedEncodedName)
+ {
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $charStream = new Swift_CharacterStream_NgCharacterStream($factory, 'utf-8');
+ $encoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder($charStream);
+ $header = new Swift_Mime_Headers_MailboxHeader('To', $encoder, new Swift_Mime_Grammar());
+ $header->setCharset('utf-8');
+
+ $header->setNameAddresses(array(
+ 'test@example.com' => $name,
+ ));
+
+ $this->assertSame('To: '.$expectedEncodedName." <test@example.com>\r\n", $header->toString());
+ }
+
+ public function encodingDataProvider()
+ {
+ return array(
+ array('this is " a test ö', 'this is =?utf-8?Q?=22?= a test =?utf-8?Q?=C3=B6?='),
+ array(': this is a test ö', '=?utf-8?Q?=3A?= this is a test =?utf-8?Q?=C3=B6?='),
+ array('( test ö', '=?utf-8?Q?=28?= test =?utf-8?Q?=C3=B6?='),
+ array('[ test ö', '=?utf-8?Q?=5B?= test =?utf-8?Q?=C3=B6?='),
+ array('@ test ö)', '=?utf-8?Q?=40?= test =?utf-8?Q?=C3=B6=29?='),
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php
new file mode 100644
index 0000000..d58242f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug71Test.php
@@ -0,0 +1,20 @@
+<?php
+
+class Swift_Bug71Test extends \PHPUnit_Framework_TestCase
+{
+ private $_message;
+
+ protected function setUp()
+ {
+ $this->_message = new Swift_Message('test');
+ }
+
+ public function testCallingToStringAfterSettingNewBodyReflectsChanges()
+ {
+ $this->_message->setBody('BODY1');
+ $this->assertRegExp('/BODY1/', $this->_message->toString());
+
+ $this->_message->setBody('BODY2');
+ $this->assertRegExp('/BODY2/', $this->_message->toString());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php
new file mode 100644
index 0000000..899083c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/Bug76Test.php
@@ -0,0 +1,71 @@
+<?php
+
+class Swift_Bug76Test extends \PHPUnit_Framework_TestCase
+{
+ private $_inputFile;
+ private $_outputFile;
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_inputFile = sys_get_temp_dir().'/in.bin';
+ file_put_contents($this->_inputFile, '');
+
+ $this->_outputFile = sys_get_temp_dir().'/out.bin';
+ file_put_contents($this->_outputFile, '');
+
+ $this->_encoder = $this->_createEncoder();
+ }
+
+ protected function tearDown()
+ {
+ unlink($this->_inputFile);
+ unlink($this->_outputFile);
+ }
+
+ public function testBase64EncodedLineLengthNeverExceeds76CharactersEvenIfArgsDo()
+ {
+ $this->_fillFileWithRandomBytes(1000, $this->_inputFile);
+
+ $os = $this->_createStream($this->_inputFile);
+ $is = $this->_createStream($this->_outputFile);
+
+ $this->_encoder->encodeByteStream($os, $is, 0, 80); //Exceeds 76
+
+ $this->assertMaxLineLength(76, $this->_outputFile,
+ '%s: Line length should not exceed 76 characters'
+ );
+ }
+
+ public function assertMaxLineLength($length, $filePath, $message = '%s')
+ {
+ $lines = file($filePath);
+ foreach ($lines as $line) {
+ $this->assertTrue((strlen(trim($line)) <= 76), $message);
+ }
+ }
+
+ private function _fillFileWithRandomBytes($byteCount, $file)
+ {
+ // I was going to use dd with if=/dev/random but this way seems more
+ // cross platform even if a hella expensive!!
+
+ file_put_contents($file, '');
+ $fp = fopen($file, 'wb');
+ for ($i = 0; $i < $byteCount; ++$i) {
+ $byteVal = rand(0, 255);
+ fwrite($fp, pack('i', $byteVal));
+ }
+ fclose($fp);
+ }
+
+ private function _createEncoder()
+ {
+ return new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+ }
+
+ private function _createStream($file)
+ {
+ return new Swift_ByteStream_FileByteStream($file, true);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php
new file mode 100644
index 0000000..35733ec
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/bug/Swift/BugFileByteStreamConsecutiveReadCallsTest.php
@@ -0,0 +1,19 @@
+<?php
+
+
+class Swift_FileByteStreamConsecutiveReadCalls extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @test
+ * @expectedException \Swift_IoException
+ */
+ public function shouldThrowExceptionOnConsecutiveRead()
+ {
+ $fbs = new \Swift_ByteStream_FileByteStream('does not exist');
+ try {
+ $fbs->read(100);
+ } catch (\Swift_IoException $exc) {
+ $fbs->read(100);
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php b/vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php
new file mode 100644
index 0000000..159c2ae
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/fixtures/MimeEntityFixture.php
@@ -0,0 +1,67 @@
+<?php
+
+class MimeEntityFixture implements Swift_Mime_MimeEntity
+{
+ private $level;
+ private $string;
+ private $contentType;
+
+ public function __construct($level = null, $string = '', $contentType = null)
+ {
+ $this->level = $level;
+ $this->string = $string;
+ $this->contentType = $contentType;
+ }
+
+ public function getNestingLevel()
+ {
+ return $this->level;
+ }
+
+ public function toString()
+ {
+ return $this->string;
+ }
+
+ public function getContentType()
+ {
+ return $this->contentType;
+ }
+
+ // These methods are here to account for the implemented interfaces
+ public function getId()
+ {
+ }
+
+ public function getHeaders()
+ {
+ }
+
+ public function getBody()
+ {
+ }
+
+ public function setBody($body, $contentType = null)
+ {
+ }
+
+ public function toByteStream(Swift_InputByteStream $is)
+ {
+ }
+
+ public function charsetChanged($charset)
+ {
+ }
+
+ public function encoderChanged(Swift_Mime_ContentEncoder $encoder)
+ {
+ }
+
+ public function getChildren()
+ {
+ }
+
+ public function setChildren(array $children)
+ {
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default b/vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default
new file mode 100644
index 0000000..0de2763
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/smoke.conf.php.default
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ Swift Mailer V4 smoke test configuration.
+
+ YOU ONLY NEED TO EDIT THIS FILE IF YOU WISH TO RUN THE SMOKE TESTS.
+
+ The smoke tests are run by default when "All Tests" are run with the
+ testing suite, however, without configuration options here only the unit tests
+ will be run and the smoke tests will be skipped.
+ */
+
+/*
+ Defines: The an address which Swift can send to (it will also send "from" this address).
+ Recommended: (your own email address?)
+ */
+define('SWIFT_SMOKE_EMAIL_ADDRESS', 'test@swiftmailer.org');
+
+/*
+ Defines: The specific transport you want to mail with.
+ Recommended: Any of 'smtp', 'sendmail' or 'mail'
+ */
+define('SWIFT_SMOKE_TRANSPORT_TYPE', 'smtp');
+
+// SMTP-specific settings
+
+/*
+ Defines: An SMTP server to connect to
+ Recommended: smtp.your-isp.com (varies wildly!)
+ */
+define('SWIFT_SMOKE_SMTP_HOST', 'localhost');
+
+/*
+ Defines: The SMTP port to connect to
+ Recommended: 25
+ */
+define('SWIFT_SMOKE_SMTP_PORT', '4456');
+
+/*
+ Defines: A username to authenticate with SMTP (if needed).
+ Recommended: (none)
+ */
+define('SWIFT_SMOKE_SMTP_USER', '');
+
+/*
+ Defines: A password to authenticate with SMTP (if needed).
+ Recommended: (none)
+ */
+define('SWIFT_SMOKE_SMTP_PASS', '');
+
+/*
+ Defines: The encryption needed on your SMTP server.
+ Recommended: (none), or 'tls' or 'ssl'
+ */
+define('SWIFT_SMOKE_SMTP_ENCRYPTION', '');
+
+// Sendmail specific settings
+
+/*
+ Defines: The command to use when sending via sendmail
+ Recommended: /usr/sbin/sendmail -bs (or "-oi -t")
+ */
+define('SWIFT_SMOKE_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs');
diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/AttachmentSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/AttachmentSmokeTest.php
new file mode 100644
index 0000000..5a4ccde
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/AttachmentSmokeTest.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @group smoke
+ */
+class Swift_Smoke_AttachmentSmokeTest extends SwiftMailerSmokeTestCase
+{
+ private $_attFile;
+
+ protected function setUp()
+ {
+ parent::setup(); // For skip
+ $this->_attFile = __DIR__.'/../../../_samples/files/textfile.zip';
+ }
+
+ public function testAttachmentSending()
+ {
+ $mailer = $this->_getMailer();
+ $message = Swift_Message::newInstance()
+ ->setSubject('[Swift Mailer] AttachmentSmokeTest')
+ ->setFrom(array(SWIFT_SMOKE_EMAIL_ADDRESS => 'Swift Mailer'))
+ ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS)
+ ->setBody('This message should contain an attached ZIP file (named "textfile.zip").'.PHP_EOL.
+ 'When unzipped, the archive should produce a text file which reads:'.PHP_EOL.
+ '"This is part of a Swift Mailer v4 smoke test."'
+ )
+ ->attach(Swift_Attachment::fromPath($this->_attFile))
+ ;
+ $this->assertEquals(1, $mailer->send($message),
+ '%s: The smoke test should send a single message'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php
new file mode 100644
index 0000000..c7501d4
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/BasicSmokeTest.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @group smoke
+ */
+class Swift_Smoke_BasicSmokeTest extends SwiftMailerSmokeTestCase
+{
+ public function testBasicSending()
+ {
+ $mailer = $this->_getMailer();
+ $message = Swift_Message::newInstance()
+ ->setSubject('[Swift Mailer] BasicSmokeTest')
+ ->setFrom(array(SWIFT_SMOKE_EMAIL_ADDRESS => 'Swift Mailer'))
+ ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS)
+ ->setBody('One, two, three, four, five...'.PHP_EOL.
+ 'six, seven, eight...'
+ )
+ ;
+ $this->assertEquals(1, $mailer->send($message),
+ '%s: The smoke test should send a single message'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php
new file mode 100644
index 0000000..3b13cc5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/HtmlWithAttachmentSmokeTest.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @group smoke
+ */
+class Swift_Smoke_HtmlWithAttachmentSmokeTest extends SwiftMailerSmokeTestCase
+{
+ private $_attFile;
+
+ protected function setUp()
+ {
+ $this->_attFile = __DIR__.'/../../../_samples/files/textfile.zip';
+ }
+
+ public function testAttachmentSending()
+ {
+ $mailer = $this->_getMailer();
+ $message = Swift_Message::newInstance('[Swift Mailer] HtmlWithAttachmentSmokeTest')
+ ->setFrom(array(SWIFT_SMOKE_EMAIL_ADDRESS => 'Swift Mailer'))
+ ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS)
+ ->attach(Swift_Attachment::fromPath($this->_attFile))
+ ->setBody('<p>This HTML-formatted message should contain an attached ZIP file (named "textfile.zip").'.PHP_EOL.
+ 'When unzipped, the archive should produce a text file which reads:</p>'.PHP_EOL.
+ '<p><q>This is part of a Swift Mailer v4 smoke test.</q></p>', 'text/html'
+ )
+ ;
+ $this->assertEquals(1, $mailer->send($message),
+ '%s: The smoke test should send a single message'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php
new file mode 100644
index 0000000..b9ebef5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/smoke/Swift/Smoke/InternationalSmokeTest.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @group smoke
+ */
+class Swift_Smoke_InternationalSmokeTest extends SwiftMailerSmokeTestCase
+{
+ private $_attFile;
+
+ protected function setUp()
+ {
+ parent::setup(); // For skip
+ $this->_attFile = __DIR__.'/../../../_samples/files/textfile.zip';
+ }
+
+ public function testAttachmentSending()
+ {
+ $mailer = $this->_getMailer();
+ $message = Swift_Message::newInstance()
+ ->setCharset('utf-8')
+ ->setSubject('[Swift Mailer] InternationalSmokeTest (διεθνής)')
+ ->setFrom(array(SWIFT_SMOKE_EMAIL_ADDRESS => 'Χριστοφορου (Swift Mailer)'))
+ ->setTo(SWIFT_SMOKE_EMAIL_ADDRESS)
+ ->setBody('This message should contain an attached ZIP file (named "κείμενο, εδάφιο, θέμα.zip").'.PHP_EOL.
+ 'When unzipped, the archive should produce a text file which reads:'.PHP_EOL.
+ '"This is part of a Swift Mailer v4 smoke test."'.PHP_EOL.
+ PHP_EOL.
+ 'Following is some arbitrary Greek text:'.PHP_EOL.
+ 'Δεν βρέθηκαν λέξεις.'
+ )
+ ->attach(Swift_Attachment::fromPath($this->_attFile)
+ ->setContentType('application/zip')
+ ->setFilename('κείμενο, εδάφιο, θέμα.zip')
+ )
+ ;
+ $this->assertEquals(1, $mailer->send($message),
+ '%s: The smoke test should send a single message'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php
new file mode 100644
index 0000000..60ebb66
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/ByteStream/ArrayByteStreamTest.php
@@ -0,0 +1,201 @@
+<?php
+
+class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase
+{
+ public function testReadingSingleBytesFromBaseInput()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+ $output = array();
+ while (false !== $bytes = $bs->read(1)) {
+ $output[] = $bytes;
+ }
+ $this->assertEquals($input, $output,
+ '%s: Bytes read from stream should be the same as bytes in constructor'
+ );
+ }
+
+ public function testReadingMultipleBytesFromBaseInput()
+ {
+ $input = array('a', 'b', 'c', 'd');
+ $bs = $this->_createArrayStream($input);
+ $output = array();
+ while (false !== $bytes = $bs->read(2)) {
+ $output[] = $bytes;
+ }
+ $this->assertEquals(array('ab', 'cd'), $output,
+ '%s: Bytes read from stream should be in pairs'
+ );
+ }
+
+ public function testReadingOddOffsetOnLastByte()
+ {
+ $input = array('a', 'b', 'c', 'd', 'e');
+ $bs = $this->_createArrayStream($input);
+ $output = array();
+ while (false !== $bytes = $bs->read(2)) {
+ $output[] = $bytes;
+ }
+ $this->assertEquals(array('ab', 'cd', 'e'), $output,
+ '%s: Bytes read from stream should be in pairs except final read'
+ );
+ }
+
+ public function testSettingPointerPartway()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+ $bs->setReadPointer(1);
+ $this->assertEquals('b', $bs->read(1),
+ '%s: Byte should be second byte since pointer as at offset 1'
+ );
+ }
+
+ public function testResettingPointerAfterExhaustion()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+ while (false !== $bs->read(1));
+
+ $bs->setReadPointer(0);
+ $this->assertEquals('a', $bs->read(1),
+ '%s: Byte should be first byte since pointer as at offset 0'
+ );
+ }
+
+ public function testPointerNeverSetsBelowZero()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+
+ $bs->setReadPointer(-1);
+ $this->assertEquals('a', $bs->read(1),
+ '%s: Byte should be first byte since pointer should be at offset 0'
+ );
+ }
+
+ public function testPointerNeverSetsAboveStackSize()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+
+ $bs->setReadPointer(3);
+ $this->assertFalse($bs->read(1),
+ '%s: Stream should be at end and thus return false'
+ );
+ }
+
+ public function testBytesCanBeWrittenToStream()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+
+ $bs->write('de');
+
+ $output = array();
+ while (false !== $bytes = $bs->read(1)) {
+ $output[] = $bytes;
+ }
+ $this->assertEquals(array('a', 'b', 'c', 'd', 'e'), $output,
+ '%s: Bytes read from stream should be from initial stack + written'
+ );
+ }
+
+ public function testContentsCanBeFlushed()
+ {
+ $input = array('a', 'b', 'c');
+ $bs = $this->_createArrayStream($input);
+
+ $bs->flushBuffers();
+
+ $this->assertFalse($bs->read(1),
+ '%s: Contents have been flushed so read() should return false'
+ );
+ }
+
+ public function testConstructorCanTakeStringArgument()
+ {
+ $bs = $this->_createArrayStream('abc');
+ $output = array();
+ while (false !== $bytes = $bs->read(1)) {
+ $output[] = $bytes;
+ }
+ $this->assertEquals(array('a', 'b', 'c'), $output,
+ '%s: Bytes read from stream should be the same as bytes in constructor'
+ );
+ }
+
+ public function testBindingOtherStreamsMirrorsWriteOperations()
+ {
+ $bs = $this->_createArrayStream('');
+ $is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ $is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock();
+
+ $is1->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is1->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+ $is2->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is2->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+
+ $bs->bind($is1);
+ $bs->bind($is2);
+
+ $bs->write('x');
+ $bs->write('y');
+ }
+
+ public function testBindingOtherStreamsMirrorsFlushOperations()
+ {
+ $bs = $this->_createArrayStream('');
+ $is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ $is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock();
+
+ $is1->expects($this->once())
+ ->method('flushBuffers');
+ $is2->expects($this->once())
+ ->method('flushBuffers');
+
+ $bs->bind($is1);
+ $bs->bind($is2);
+
+ $bs->flushBuffers();
+ }
+
+ public function testUnbindingStreamPreventsFurtherWrites()
+ {
+ $bs = $this->_createArrayStream('');
+ $is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ $is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock();
+
+ $is1->expects($this->at(0))
+ ->method('write')
+ ->with('x');
+ $is1->expects($this->at(1))
+ ->method('write')
+ ->with('y');
+ $is2->expects($this->once())
+ ->method('write')
+ ->with('x');
+
+ $bs->bind($is1);
+ $bs->bind($is2);
+
+ $bs->write('x');
+
+ $bs->unbind($is2);
+
+ $bs->write('y');
+ }
+
+ private function _createArrayStream($input)
+ {
+ return new Swift_ByteStream_ArrayByteStream($input);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php
new file mode 100644
index 0000000..3f7a46c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/GenericFixedWidthReaderTest.php
@@ -0,0 +1,43 @@
+<?php
+
+class Swift_CharacterReader_GenericFixedWidthReaderTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInitialByteSizeMatchesWidth()
+ {
+ $reader = new Swift_CharacterReader_GenericFixedWidthReader(1);
+ $this->assertSame(1, $reader->getInitialByteSize());
+
+ $reader = new Swift_CharacterReader_GenericFixedWidthReader(4);
+ $this->assertSame(4, $reader->getInitialByteSize());
+ }
+
+ public function testValidationValueIsBasedOnOctetCount()
+ {
+ $reader = new Swift_CharacterReader_GenericFixedWidthReader(4);
+
+ $this->assertSame(
+ 1, $reader->validateByteSequence(array(0x01, 0x02, 0x03), 3)
+ ); //3 octets
+
+ $this->assertSame(
+ 2, $reader->validateByteSequence(array(0x01, 0x0A), 2)
+ ); //2 octets
+
+ $this->assertSame(
+ 3, $reader->validateByteSequence(array(0xFE), 1)
+ ); //1 octet
+
+ $this->assertSame(
+ 0, $reader->validateByteSequence(array(0xFE, 0x03, 0x67, 0x9A), 4)
+ ); //All 4 octets
+ }
+
+ public function testValidationFailsIfTooManyOctets()
+ {
+ $reader = new Swift_CharacterReader_GenericFixedWidthReader(6);
+
+ $this->assertSame(-1, $reader->validateByteSequence(
+ array(0xFE, 0x03, 0x67, 0x9A, 0x10, 0x09, 0x85), 7
+ )); //7 octets
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php
new file mode 100644
index 0000000..0d56736
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/UsAsciiReaderTest.php
@@ -0,0 +1,52 @@
+<?php
+
+class Swift_CharacterReader_UsAsciiReaderTest extends \PHPUnit_Framework_TestCase
+{
+ /*
+
+ for ($c = '', $size = 1; false !== $bytes = $os->read($size); ) {
+ $c .= $bytes;
+ $size = $v->validateCharacter($c);
+ if (-1 == $size) {
+ throw new Exception( ... invalid char .. );
+ } elseif (0 == $size) {
+ return $c; //next character in $os
+ }
+ }
+
+ */
+
+ private $_reader;
+
+ protected function setUp()
+ {
+ $this->_reader = new Swift_CharacterReader_UsAsciiReader();
+ }
+
+ public function testAllValidAsciiCharactersReturnZero()
+ {
+ for ($ordinal = 0x00; $ordinal <= 0x7F; ++$ordinal) {
+ $this->assertSame(
+ 0, $this->_reader->validateByteSequence(array($ordinal), 1)
+ );
+ }
+ }
+
+ public function testMultipleBytesAreInvalid()
+ {
+ for ($ordinal = 0x00; $ordinal <= 0x7F; $ordinal += 2) {
+ $this->assertSame(
+ -1, $this->_reader->validateByteSequence(array($ordinal, $ordinal + 1), 2)
+ );
+ }
+ }
+
+ public function testBytesAboveAsciiRangeAreInvalid()
+ {
+ for ($ordinal = 0x80; $ordinal <= 0xFF; ++$ordinal) {
+ $this->assertSame(
+ -1, $this->_reader->validateByteSequence(array($ordinal), 1)
+ );
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php
new file mode 100644
index 0000000..ec17eeb
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterReader/Utf8ReaderTest.php
@@ -0,0 +1,65 @@
+<?php
+
+class Swift_CharacterReader_Utf8ReaderTest extends \PHPUnit_Framework_TestCase
+{
+ private $_reader;
+
+ protected function setUp()
+ {
+ $this->_reader = new Swift_CharacterReader_Utf8Reader();
+ }
+
+ public function testLeading7BitOctetCausesReturnZero()
+ {
+ for ($ordinal = 0x00; $ordinal <= 0x7F; ++$ordinal) {
+ $this->assertSame(
+ 0, $this->_reader->validateByteSequence(array($ordinal), 1)
+ );
+ }
+ }
+
+ public function testLeadingByteOf2OctetCharCausesReturn1()
+ {
+ for ($octet = 0xC0; $octet <= 0xDF; ++$octet) {
+ $this->assertSame(
+ 1, $this->_reader->validateByteSequence(array($octet), 1)
+ );
+ }
+ }
+
+ public function testLeadingByteOf3OctetCharCausesReturn2()
+ {
+ for ($octet = 0xE0; $octet <= 0xEF; ++$octet) {
+ $this->assertSame(
+ 2, $this->_reader->validateByteSequence(array($octet), 1)
+ );
+ }
+ }
+
+ public function testLeadingByteOf4OctetCharCausesReturn3()
+ {
+ for ($octet = 0xF0; $octet <= 0xF7; ++$octet) {
+ $this->assertSame(
+ 3, $this->_reader->validateByteSequence(array($octet), 1)
+ );
+ }
+ }
+
+ public function testLeadingByteOf5OctetCharCausesReturn4()
+ {
+ for ($octet = 0xF8; $octet <= 0xFB; ++$octet) {
+ $this->assertSame(
+ 4, $this->_reader->validateByteSequence(array($octet), 1)
+ );
+ }
+ }
+
+ public function testLeadingByteOf6OctetCharCausesReturn5()
+ {
+ for ($octet = 0xFC; $octet <= 0xFD; ++$octet) {
+ $this->assertSame(
+ 5, $this->_reader->validateByteSequence(array($octet), 1)
+ );
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php
new file mode 100644
index 0000000..977051e
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/CharacterStream/ArrayCharacterStreamTest.php
@@ -0,0 +1,358 @@
+<?php
+
+class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCase
+{
+ public function testValidatorAlgorithmOnImportString()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importString(pack('C*',
+ 0xD0, 0x94,
+ 0xD0, 0xB6,
+ 0xD0, 0xBE,
+ 0xD1, 0x8D,
+ 0xD0, 0xBB,
+ 0xD0, 0xB0
+ )
+ );
+ }
+
+ public function testCharactersWrittenUseValidator()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $stream->write(pack('C*',
+ 0xD0, 0xBB,
+ 0xD1, 0x8E,
+ 0xD0, 0xB1,
+ 0xD1, 0x8B,
+ 0xD1, 0x85
+ )
+ );
+ }
+
+ public function testReadCharactersAreInTact()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ //String
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ //Stream
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $stream->write(pack('C*',
+ 0xD0, 0xBB,
+ 0xD1, 0x8E,
+ 0xD0, 0xB1,
+ 0xD1, 0x8B,
+ 0xD1, 0x85
+ )
+ );
+
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1));
+ $this->assertIdenticalBinary(
+ pack('C*', 0xD0, 0xB6, 0xD0, 0xBE), $stream->read(2)
+ );
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBB), $stream->read(1));
+ $this->assertIdenticalBinary(
+ pack('C*', 0xD1, 0x8E, 0xD0, 0xB1, 0xD1, 0x8B), $stream->read(3)
+ );
+ $this->assertIdenticalBinary(pack('C*', 0xD1, 0x85), $stream->read(1));
+
+ $this->assertFalse($stream->read(1));
+ }
+
+ public function testCharactersCanBeReadAsByteArrays()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ //String
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ //Stream
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $stream->write(pack('C*',
+ 0xD0, 0xBB,
+ 0xD1, 0x8E,
+ 0xD0, 0xB1,
+ 0xD1, 0x8B,
+ 0xD1, 0x85
+ )
+ );
+
+ $this->assertEquals(array(0xD0, 0x94), $stream->readBytes(1));
+ $this->assertEquals(array(0xD0, 0xB6, 0xD0, 0xBE), $stream->readBytes(2));
+ $this->assertEquals(array(0xD0, 0xBB), $stream->readBytes(1));
+ $this->assertEquals(
+ array(0xD1, 0x8E, 0xD0, 0xB1, 0xD1, 0x8B), $stream->readBytes(3)
+ );
+ $this->assertEquals(array(0xD1, 0x85), $stream->readBytes(1));
+
+ $this->assertFalse($stream->readBytes(1));
+ }
+
+ public function testRequestingLargeCharCountPastEndOfStream()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE),
+ $stream->read(100)
+ );
+
+ $this->assertFalse($stream->read(1));
+ }
+
+ public function testRequestingByteArrayCountPastEndOfStream()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $this->assertEquals(array(0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE),
+ $stream->readBytes(100)
+ );
+
+ $this->assertFalse($stream->readBytes(1));
+ }
+
+ public function testPointerOffsetCanBeSet()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1));
+
+ $stream->setPointer(0);
+
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1));
+
+ $stream->setPointer(2);
+
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBE), $stream->read(1));
+ }
+
+ public function testContentsCanBeFlushed()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importString(pack('C*', 0xD0, 0x94, 0xD0, 0xB6, 0xD0, 0xBE));
+
+ $stream->flushContents();
+
+ $this->assertFalse($stream->read(1));
+ }
+
+ public function testByteStreamCanBeImportingUsesValidator()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+ $os = $this->_getByteStream();
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $os->shouldReceive('setReadPointer')
+ ->between(0, 1)
+ ->with(0);
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0x94));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xB6));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xBE));
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importByteStream($os);
+ }
+
+ public function testImportingStreamProducesCorrectCharArray()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+ $os = $this->_getByteStream();
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8');
+
+ $os->shouldReceive('setReadPointer')
+ ->between(0, 1)
+ ->with(0);
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0x94));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xB6));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xD0));
+ $os->shouldReceive('read')->once()->andReturn(pack('C*', 0xBE));
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0), 1)->andReturn(1);
+
+ $stream->importByteStream($os);
+
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0x94), $stream->read(1));
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0xB6), $stream->read(1));
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBE), $stream->read(1));
+
+ $this->assertFalse($stream->read(1));
+ }
+
+ public function testAlgorithmWithFixedWidthCharsets()
+ {
+ $reader = $this->_getReader();
+ $factory = $this->_getFactory($reader);
+
+ $reader->shouldReceive('getInitialByteSize')
+ ->zeroOrMoreTimes()
+ ->andReturn(2);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD1, 0x8D), 2);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0, 0xBB), 2);
+ $reader->shouldReceive('validateByteSequence')->once()->with(array(0xD0, 0xB0), 2);
+
+ $stream = new Swift_CharacterStream_ArrayCharacterStream(
+ $factory, 'utf-8'
+ );
+ $stream->importString(pack('C*', 0xD1, 0x8D, 0xD0, 0xBB, 0xD0, 0xB0));
+
+ $this->assertIdenticalBinary(pack('C*', 0xD1, 0x8D), $stream->read(1));
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0xBB), $stream->read(1));
+ $this->assertIdenticalBinary(pack('C*', 0xD0, 0xB0), $stream->read(1));
+
+ $this->assertFalse($stream->read(1));
+ }
+
+ private function _getReader()
+ {
+ return $this->getMockery('Swift_CharacterReader');
+ }
+
+ private function _getFactory($reader)
+ {
+ $factory = $this->getMockery('Swift_CharacterReaderFactory');
+ $factory->shouldReceive('getReaderFor')
+ ->zeroOrMoreTimes()
+ ->with('utf-8')
+ ->andReturn($reader);
+
+ return $factory;
+ }
+
+ private function _getByteStream()
+ {
+ return $this->getMockery('Swift_OutputByteStream');
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php
new file mode 100644
index 0000000..ccd14f6
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/DependencyContainerTest.php
@@ -0,0 +1,176 @@
+<?php
+
+class One
+{
+ public $arg1;
+ public $arg2;
+
+ public function __construct($arg1 = null, $arg2 = null)
+ {
+ $this->arg1 = $arg1;
+ $this->arg2 = $arg2;
+ }
+}
+
+class Swift_DependencyContainerTest extends \PHPUnit_Framework_TestCase
+{
+ private $_container;
+
+ protected function setUp()
+ {
+ $this->_container = new Swift_DependencyContainer();
+ }
+
+ public function testRegisterAndLookupValue()
+ {
+ $this->_container->register('foo')->asValue('bar');
+ $this->assertEquals('bar', $this->_container->lookup('foo'));
+ }
+
+ public function testHasReturnsTrueForRegisteredValue()
+ {
+ $this->_container->register('foo')->asValue('bar');
+ $this->assertTrue($this->_container->has('foo'));
+ }
+
+ public function testHasReturnsFalseForUnregisteredValue()
+ {
+ $this->assertFalse($this->_container->has('foo'));
+ }
+
+ public function testRegisterAndLookupNewInstance()
+ {
+ $this->_container->register('one')->asNewInstanceOf('One');
+ $this->assertInstanceOf('One', $this->_container->lookup('one'));
+ }
+
+ public function testHasReturnsTrueForRegisteredInstance()
+ {
+ $this->_container->register('one')->asNewInstanceOf('One');
+ $this->assertTrue($this->_container->has('one'));
+ }
+
+ public function testNewInstanceIsAlwaysNew()
+ {
+ $this->_container->register('one')->asNewInstanceOf('One');
+ $a = $this->_container->lookup('one');
+ $b = $this->_container->lookup('one');
+ $this->assertEquals($a, $b);
+ }
+
+ public function testRegisterAndLookupSharedInstance()
+ {
+ $this->_container->register('one')->asSharedInstanceOf('One');
+ $this->assertInstanceOf('One', $this->_container->lookup('one'));
+ }
+
+ public function testHasReturnsTrueForSharedInstance()
+ {
+ $this->_container->register('one')->asSharedInstanceOf('One');
+ $this->assertTrue($this->_container->has('one'));
+ }
+
+ public function testMultipleSharedInstancesAreSameInstance()
+ {
+ $this->_container->register('one')->asSharedInstanceOf('One');
+ $a = $this->_container->lookup('one');
+ $b = $this->_container->lookup('one');
+ $this->assertEquals($a, $b);
+ }
+
+ public function testNewInstanceWithDependencies()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('one')->asNewInstanceOf('One')
+ ->withDependencies(array('foo'));
+ $obj = $this->_container->lookup('one');
+ $this->assertSame('FOO', $obj->arg1);
+ }
+
+ public function testNewInstanceWithMultipleDependencies()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('bar')->asValue(42);
+ $this->_container->register('one')->asNewInstanceOf('One')
+ ->withDependencies(array('foo', 'bar'));
+ $obj = $this->_container->lookup('one');
+ $this->assertSame('FOO', $obj->arg1);
+ $this->assertSame(42, $obj->arg2);
+ }
+
+ public function testNewInstanceWithInjectedObjects()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('one')->asNewInstanceOf('One');
+ $this->_container->register('two')->asNewInstanceOf('One')
+ ->withDependencies(array('one', 'foo'));
+ $obj = $this->_container->lookup('two');
+ $this->assertEquals($this->_container->lookup('one'), $obj->arg1);
+ $this->assertSame('FOO', $obj->arg2);
+ }
+
+ public function testNewInstanceWithAddConstructorValue()
+ {
+ $this->_container->register('one')->asNewInstanceOf('One')
+ ->addConstructorValue('x')
+ ->addConstructorValue(99);
+ $obj = $this->_container->lookup('one');
+ $this->assertSame('x', $obj->arg1);
+ $this->assertSame(99, $obj->arg2);
+ }
+
+ public function testNewInstanceWithAddConstructorLookup()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('bar')->asValue(42);
+ $this->_container->register('one')->asNewInstanceOf('One')
+ ->addConstructorLookup('foo')
+ ->addConstructorLookup('bar');
+
+ $obj = $this->_container->lookup('one');
+ $this->assertSame('FOO', $obj->arg1);
+ $this->assertSame(42, $obj->arg2);
+ }
+
+ public function testResolvedDependenciesCanBeLookedUp()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('one')->asNewInstanceOf('One');
+ $this->_container->register('two')->asNewInstanceOf('One')
+ ->withDependencies(array('one', 'foo'));
+ $deps = $this->_container->createDependenciesFor('two');
+ $this->assertEquals(
+ array($this->_container->lookup('one'), 'FOO'), $deps
+ );
+ }
+
+ public function testArrayOfDependenciesCanBeSpecified()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('one')->asNewInstanceOf('One');
+ $this->_container->register('two')->asNewInstanceOf('One')
+ ->withDependencies(array(array('one', 'foo'), 'foo'));
+
+ $obj = $this->_container->lookup('two');
+ $this->assertEquals(array($this->_container->lookup('one'), 'FOO'), $obj->arg1);
+ $this->assertSame('FOO', $obj->arg2);
+ }
+
+ public function testAliasCanBeSet()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('bar')->asAliasOf('foo');
+
+ $this->assertSame('FOO', $this->_container->lookup('bar'));
+ }
+
+ public function testAliasOfAliasCanBeSet()
+ {
+ $this->_container->register('foo')->asValue('FOO');
+ $this->_container->register('bar')->asAliasOf('foo');
+ $this->_container->register('zip')->asAliasOf('bar');
+ $this->_container->register('button')->asAliasOf('zip');
+
+ $this->assertSame('FOO', $this->_container->lookup('button'));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php
new file mode 100644
index 0000000..b89eb9f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Base64EncoderTest.php
@@ -0,0 +1,173 @@
+<?php
+
+class Swift_Encoder_Base64EncoderTest extends \PHPUnit_Framework_TestCase
+{
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_encoder = new Swift_Encoder_Base64Encoder();
+ }
+
+ /*
+ There's really no point in testing the entire base64 encoding to the
+ level QP encoding has been tested. base64_encode() has been in PHP for
+ years.
+ */
+
+ public function testInputOutputRatioIs3to4Bytes()
+ {
+ /*
+ RFC 2045, 6.8
+
+ The encoding process represents 24-bit groups of input bits as output
+ strings of 4 encoded characters. Proceeding from left to right, a
+ 24-bit input group is formed by concatenating 3 8bit input groups.
+ These 24 bits are then treated as 4 concatenated 6-bit groups, each
+ of which is translated into a single digit in the base64 alphabet.
+ */
+
+ $this->assertEquals(
+ 'MTIz', $this->_encoder->encodeString('123'),
+ '%s: 3 bytes of input should yield 4 bytes of output'
+ );
+ $this->assertEquals(
+ 'MTIzNDU2', $this->_encoder->encodeString('123456'),
+ '%s: 6 bytes in input should yield 8 bytes of output'
+ );
+ $this->assertEquals(
+ 'MTIzNDU2Nzg5', $this->_encoder->encodeString('123456789'),
+ '%s: 9 bytes in input should yield 12 bytes of output'
+ );
+ }
+
+ public function testPadLength()
+ {
+ /*
+ RFC 2045, 6.8
+
+ Special processing is performed if fewer than 24 bits are available
+ at the end of the data being encoded. A full encoding quantum is
+ always completed at the end of a body. When fewer than 24 input bits
+ are available in an input group, zero bits are added (on the right)
+ to form an integral number of 6-bit groups. Padding at the end of
+ the data is performed using the "=" character. Since all base64
+ input is an integral number of octets, only the following cases can
+ arise: (1) the final quantum of encoding input is an integral
+ multiple of 24 bits; here, the final unit of encoded output will be
+ an integral multiple of 4 characters with no "=" padding, (2) the
+ final quantum of encoding input is exactly 8 bits; here, the final
+ unit of encoded output will be two characters followed by two "="
+ padding characters, or (3) the final quantum of encoding input is
+ exactly 16 bits; here, the final unit of encoded output will be three
+ characters followed by one "=" padding character.
+ */
+
+ for ($i = 0; $i < 30; ++$i) {
+ $input = pack('C', rand(0, 255));
+ $this->assertRegExp(
+ '~^[a-zA-Z0-9/\+]{2}==$~', $this->_encoder->encodeString($input),
+ '%s: A single byte should have 2 bytes of padding'
+ );
+ }
+
+ for ($i = 0; $i < 30; ++$i) {
+ $input = pack('C*', rand(0, 255), rand(0, 255));
+ $this->assertRegExp(
+ '~^[a-zA-Z0-9/\+]{3}=$~', $this->_encoder->encodeString($input),
+ '%s: Two bytes should have 1 byte of padding'
+ );
+ }
+
+ for ($i = 0; $i < 30; ++$i) {
+ $input = pack('C*', rand(0, 255), rand(0, 255), rand(0, 255));
+ $this->assertRegExp(
+ '~^[a-zA-Z0-9/\+]{4}$~', $this->_encoder->encodeString($input),
+ '%s: Three bytes should have no padding'
+ );
+ }
+ }
+
+ public function testMaximumLineLengthIs76Characters()
+ {
+ /*
+ The encoded output stream must be represented in lines of no more
+ than 76 characters each. All line breaks or other characters not
+ found in Table 1 must be ignored by decoding software.
+ */
+
+ $input =
+ 'abcdefghijklmnopqrstuvwxyz'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ '1234567890'.
+ 'abcdefghijklmnopqrstuvwxyz'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ '1234567890'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+ $output =
+ 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38
+ 'NERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1'."\r\n".//76 *
+ 'Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3'.//38
+ 'h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla'."\r\n".//76 *
+ 'MTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BRUl'.//38
+ 'NUVVZXWFla'; //48
+
+ $this->assertEquals(
+ $output, $this->_encoder->encodeString($input),
+ '%s: Lines should be no more than 76 characters'
+ );
+ }
+
+ public function testMaximumLineLengthCanBeSpecified()
+ {
+ $input =
+ 'abcdefghijklmnopqrstuvwxyz'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ '1234567890'.
+ 'abcdefghijklmnopqrstuvwxyz'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ '1234567890'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+ $output =
+ 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38
+ 'NERUZHSElKS0'."\r\n".//50 *
+ 'xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBhYmNk'.//38
+ 'ZWZnaGlqa2xt'."\r\n".//50 *
+ 'bm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1'.//38
+ 'BRUlNUVVZXWF'."\r\n".//50 *
+ 'laMTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BR'.//38
+ 'UlNUVVZXWFla'; //50 *
+
+ $this->assertEquals(
+ $output, $this->_encoder->encodeString($input, 0, 50),
+ '%s: Lines should be no more than 100 characters'
+ );
+ }
+
+ public function testFirstLineLengthCanBeDifferent()
+ {
+ $input =
+ 'abcdefghijklmnopqrstuvwxyz'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ '1234567890'.
+ 'abcdefghijklmnopqrstuvwxyz'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+ '1234567890'.
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+ $output =
+ 'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38
+ 'NERUZHSElKS0xNTk9QU'."\r\n".//57 *
+ 'VJTVFVWV1hZWjEyMzQ1Njc4OTBhYmNkZWZnaGl'.//38
+ 'qa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLT'."\r\n".//76 *
+ 'E1OT1BRUlNUVVZXWFlaMTIzNDU2Nzg5MEFCQ0R'.//38
+ 'FRkdISUpLTE1OT1BRUlNUVVZXWFla'; //67
+
+ $this->assertEquals(
+ $output, $this->_encoder->encodeString($input, 19),
+ '%s: First line offset is 19 so first line should be 57 chars long'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php
new file mode 100644
index 0000000..6740f22
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/QpEncoderTest.php
@@ -0,0 +1,400 @@
+<?php
+
+class Swift_Encoder_QpEncoderTest extends \SwiftMailerTestCase
+{
+ /* -- RFC 2045, 6.7 --
+ (1) (General 8bit representation) Any octet, except a CR or
+ LF that is part of a CRLF line break of the canonical
+ (standard) form of the data being encoded, may be
+ represented by an "=" followed by a two digit
+ hexadecimal representation of the octet's value. The
+ digits of the hexadecimal alphabet, for this purpose,
+ are "0123456789ABCDEF". Uppercase letters must be
+ used; lowercase letters are not allowed. Thus, for
+ example, the decimal value 12 (US-ASCII form feed) can
+ be represented by "=0C", and the decimal value 61 (US-
+ ASCII EQUAL SIGN) can be represented by "=3D". This
+ rule must be followed except when the following rules
+ allow an alternative encoding.
+ */
+
+ public function testPermittedCharactersAreNotEncoded()
+ {
+ /* -- RFC 2045, 6.7 --
+ (2) (Literal representation) Octets with decimal values of
+ 33 through 60 inclusive, and 62 through 126, inclusive,
+ MAY be represented as the US-ASCII characters which
+ correspond to those octets (EXCLAMATION POINT through
+ LESS THAN, and GREATER THAN through TILDE,
+ respectively).
+ */
+
+ foreach (array_merge(range(33, 60), range(62, 126)) as $ordinal) {
+ $char = chr($ordinal);
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($char);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($ordinal));
+ $charStream->shouldReceive('readBytes')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+
+ $this->assertIdenticalBinary($char, $encoder->encodeString($char));
+ }
+ }
+
+ public function testWhiteSpaceAtLineEndingIsEncoded()
+ {
+ /* -- RFC 2045, 6.7 --
+ (3) (White Space) Octets with values of 9 and 32 MAY be
+ represented as US-ASCII TAB (HT) and SPACE characters,
+ respectively, but MUST NOT be so represented at the end
+ of an encoded line. Any TAB (HT) or SPACE characters
+ on an encoded line MUST thus be followed on that line
+ by a printable character. In particular, an "=" at the
+ end of an encoded line, indicating a soft line break
+ (see rule #5) may follow one or more TAB (HT) or SPACE
+ characters. It follows that an octet with decimal
+ value 9 or 32 appearing at the end of an encoded line
+ must be represented according to Rule #1. This rule is
+ necessary because some MTAs (Message Transport Agents,
+ programs which transport messages from one user to
+ another, or perform a portion of such transfers) are
+ known to pad lines of text with SPACEs, and others are
+ known to remove "white space" characters from the end
+ of a line. Therefore, when decoding a Quoted-Printable
+ body, any trailing white space on a line must be
+ deleted, as it will necessarily have been added by
+ intermediate transport agents.
+ */
+
+ $HT = chr(0x09); //9
+ $SPACE = chr(0x20); //32
+
+ //HT
+ $string = 'a'.$HT.$HT."\r\n".'b';
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x09));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x09));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+ $this->assertEquals(
+ 'a'.$HT.'=09'."\r\n".'b',
+ $encoder->encodeString($string)
+ );
+
+ //SPACE
+ $string = 'a'.$SPACE.$SPACE."\r\n".'b';
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x20));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x20));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+ $this->assertEquals(
+ 'a'.$SPACE.'=20'."\r\n".'b',
+ $encoder->encodeString($string)
+ );
+ }
+
+ public function testCRLFIsLeftAlone()
+ {
+ /*
+ (4) (Line Breaks) A line break in a text body, represented
+ as a CRLF sequence in the text canonical form, must be
+ represented by a (RFC 822) line break, which is also a
+ CRLF sequence, in the Quoted-Printable encoding. Since
+ the canonical representation of media types other than
+ text do not generally include the representation of
+ line breaks as CRLF sequences, no hard line breaks
+ (i.e. line breaks that are intended to be meaningful
+ and to be displayed to the user) can occur in the
+ quoted-printable encoding of such types. Sequences
+ like "=0D", "=0A", "=0A=0D" and "=0D=0A" will routinely
+ appear in non-text data represented in quoted-
+ printable, of course.
+
+ Note that many implementations may elect to encode the
+ local representation of various content types directly
+ rather than converting to canonical form first,
+ encoding, and then converting back to local
+ representation. In particular, this may apply to plain
+ text material on systems that use newline conventions
+ other than a CRLF terminator sequence. Such an
+ implementation optimization is permissible, but only
+ when the combined canonicalization-encoding step is
+ equivalent to performing the three steps separately.
+ */
+
+ $string = 'a'."\r\n".'b'."\r\n".'c'."\r\n";
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(ord('c')));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')->once()->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+ $this->assertEquals($string, $encoder->encodeString($string));
+ }
+
+ public function testLinesLongerThan76CharactersAreSoftBroken()
+ {
+ /*
+ (5) (Soft Line Breaks) The Quoted-Printable encoding
+ REQUIRES that encoded lines be no more than 76
+ characters long. If longer lines are to be encoded
+ with the Quoted-Printable encoding, "soft" line breaks
+ must be used. An equal sign as the last character on a
+ encoded line indicates such a non-significant ("soft")
+ line break in the encoded text.
+ */
+
+ $input = str_repeat('a', 140);
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($input);
+
+ $output = '';
+ for ($i = 0; $i < 140; ++$i) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+
+ if (75 == $i) {
+ $output .= "=\r\n";
+ }
+ $output .= 'a';
+ }
+
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+ $this->assertEquals($output, $encoder->encodeString($input));
+ }
+
+ public function testMaxLineLengthCanBeSpecified()
+ {
+ $input = str_repeat('a', 100);
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($input);
+
+ $output = '';
+ for ($i = 0; $i < 100; ++$i) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+
+ if (53 == $i) {
+ $output .= "=\r\n";
+ }
+ $output .= 'a';
+ }
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+ $this->assertEquals($output, $encoder->encodeString($input, 0, 54));
+ }
+
+ public function testBytesBelowPermittedRangeAreEncoded()
+ {
+ /*
+ According to Rule (1 & 2)
+ */
+
+ foreach (range(0, 32) as $ordinal) {
+ $char = chr($ordinal);
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($char);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($ordinal));
+ $charStream->shouldReceive('readBytes')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+
+ $this->assertEquals(
+ sprintf('=%02X', $ordinal), $encoder->encodeString($char)
+ );
+ }
+ }
+
+ public function testDecimalByte61IsEncoded()
+ {
+ /*
+ According to Rule (1 & 2)
+ */
+
+ $char = '=';
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($char);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(61));
+ $charStream->shouldReceive('readBytes')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+
+ $this->assertEquals('=3D', $encoder->encodeString('='));
+ }
+
+ public function testBytesAbovePermittedRangeAreEncoded()
+ {
+ /*
+ According to Rule (1 & 2)
+ */
+
+ foreach (range(127, 255) as $ordinal) {
+ $char = chr($ordinal);
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($char);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($ordinal));
+ $charStream->shouldReceive('readBytes')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+
+ $this->assertEquals(
+ sprintf('=%02X', $ordinal), $encoder->encodeString($char)
+ );
+ }
+ }
+
+ public function testFirstLineLengthCanBeDifferent()
+ {
+ $input = str_repeat('a', 140);
+
+ $charStream = $this->_createCharStream();
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($input);
+
+ $output = '';
+ for ($i = 0; $i < 140; ++$i) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+
+ if (53 == $i || 53 + 75 == $i) {
+ $output .= "=\r\n";
+ }
+ $output .= 'a';
+ }
+
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_QpEncoder($charStream);
+ $this->assertEquals(
+ $output, $encoder->encodeString($input, 22),
+ '%s: First line should start at offset 22 so can only have max length 54'
+ );
+ }
+
+ public function testTextIsPreWrapped()
+ {
+ $encoder = $this->createEncoder();
+
+ $input = str_repeat('a', 70)."\r\n".
+ str_repeat('a', 70)."\r\n".
+ str_repeat('a', 70);
+
+ $this->assertEquals(
+ $input, $encoder->encodeString($input)
+ );
+ }
+
+ private function _createCharStream()
+ {
+ return $this->getMockery('Swift_CharacterStream')->shouldIgnoreMissing();
+ }
+
+ private function createEncoder()
+ {
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $charStream = new Swift_CharacterStream_NgCharacterStream($factory, 'utf-8');
+
+ return new Swift_Encoder_QpEncoder($charStream);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php
new file mode 100644
index 0000000..28eae6f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Encoder/Rfc2231EncoderTest.php
@@ -0,0 +1,141 @@
+<?php
+
+class Swift_Encoder_Rfc2231EncoderTest extends \SwiftMailerTestCase
+{
+ private $_rfc2045Token = '/^[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E]+$/D';
+
+ /* --
+ This algorithm is described in RFC 2231, but is barely touched upon except
+ for mentioning bytes can be represented as their octet values (e.g. %20 for
+ the SPACE character).
+
+ The tests here focus on how to use that representation to always generate text
+ which matches RFC 2045's definition of "token".
+ */
+
+ public function testEncodingAsciiCharactersProducesValidToken()
+ {
+ $charStream = $this->getMockery('Swift_CharacterStream');
+
+ $string = '';
+ foreach (range(0x00, 0x7F) as $octet) {
+ $char = pack('C', $octet);
+ $string .= $char;
+ $charStream->shouldReceive('read')
+ ->once()
+ ->andReturn($char);
+ }
+
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+ $charStream->shouldReceive('read')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+
+ $encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
+ $encoded = $encoder->encodeString($string);
+
+ foreach (explode("\r\n", $encoded) as $line) {
+ $this->assertRegExp($this->_rfc2045Token, $line,
+ '%s: Encoder should always return a valid RFC 2045 token.');
+ }
+ }
+
+ public function testEncodingNonAsciiCharactersProducesValidToken()
+ {
+ $charStream = $this->getMockery('Swift_CharacterStream');
+
+ $string = '';
+ foreach (range(0x80, 0xFF) as $octet) {
+ $char = pack('C', $octet);
+ $string .= $char;
+ $charStream->shouldReceive('read')
+ ->once()
+ ->andReturn($char);
+ }
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+ $charStream->shouldReceive('read')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+ $encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
+
+ $encoded = $encoder->encodeString($string);
+
+ foreach (explode("\r\n", $encoded) as $line) {
+ $this->assertRegExp($this->_rfc2045Token, $line,
+ '%s: Encoder should always return a valid RFC 2045 token.');
+ }
+ }
+
+ public function testMaximumLineLengthCanBeSet()
+ {
+ $charStream = $this->getMockery('Swift_CharacterStream');
+
+ $string = '';
+ for ($x = 0; $x < 200; ++$x) {
+ $char = 'a';
+ $string .= $char;
+ $charStream->shouldReceive('read')
+ ->once()
+ ->andReturn($char);
+ }
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+ $charStream->shouldReceive('read')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+ $encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
+
+ $encoded = $encoder->encodeString($string, 0, 75);
+
+ $this->assertEquals(
+ str_repeat('a', 75)."\r\n".
+ str_repeat('a', 75)."\r\n".
+ str_repeat('a', 50),
+ $encoded,
+ '%s: Lines should be wrapped at each 75 characters'
+ );
+ }
+
+ public function testFirstLineCanHaveShorterLength()
+ {
+ $charStream = $this->getMockery('Swift_CharacterStream');
+
+ $string = '';
+ for ($x = 0; $x < 200; ++$x) {
+ $char = 'a';
+ $string .= $char;
+ $charStream->shouldReceive('read')
+ ->once()
+ ->andReturn($char);
+ }
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importString')
+ ->once()
+ ->with($string);
+ $charStream->shouldReceive('read')
+ ->atLeast()->times(1)
+ ->andReturn(false);
+ $encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
+ $encoded = $encoder->encodeString($string, 25, 75);
+
+ $this->assertEquals(
+ str_repeat('a', 50)."\r\n".
+ str_repeat('a', 75)."\r\n".
+ str_repeat('a', 75),
+ $encoded,
+ '%s: First line should be 25 bytes shorter than the others.'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php
new file mode 100644
index 0000000..a78bc3a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/CommandEventTest.php
@@ -0,0 +1,34 @@
+<?php
+
+class Swift_Events_CommandEventTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCommandCanBeFetchedByGetter()
+ {
+ $evt = $this->_createEvent($this->_createTransport(), "FOO\r\n");
+ $this->assertEquals("FOO\r\n", $evt->getCommand());
+ }
+
+ public function testSuccessCodesCanBeFetchedViaGetter()
+ {
+ $evt = $this->_createEvent($this->_createTransport(), "FOO\r\n", array(250));
+ $this->assertEquals(array(250), $evt->getSuccessCodes());
+ }
+
+ public function testSourceIsBuffer()
+ {
+ $transport = $this->_createTransport();
+ $evt = $this->_createEvent($transport, "FOO\r\n");
+ $ref = $evt->getSource();
+ $this->assertEquals($transport, $ref);
+ }
+
+ private function _createEvent(Swift_Transport $source, $command, $successCodes = array())
+ {
+ return new Swift_Events_CommandEvent($source, $command, $successCodes);
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php
new file mode 100644
index 0000000..0cfe3ca
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/EventObjectTest.php
@@ -0,0 +1,32 @@
+<?php
+
+class Swift_Events_EventObjectTest extends \PHPUnit_Framework_TestCase
+{
+ public function testEventSourceCanBeReturnedViaGetter()
+ {
+ $source = new stdClass();
+ $evt = $this->_createEvent($source);
+ $ref = $evt->getSource();
+ $this->assertEquals($source, $ref);
+ }
+
+ public function testEventDoesNotHaveCancelledBubbleWhenNew()
+ {
+ $source = new stdClass();
+ $evt = $this->_createEvent($source);
+ $this->assertFalse($evt->bubbleCancelled());
+ }
+
+ public function testBubbleCanBeCancelledInEvent()
+ {
+ $source = new stdClass();
+ $evt = $this->_createEvent($source);
+ $evt->cancelBubble();
+ $this->assertTrue($evt->bubbleCancelled());
+ }
+
+ private function _createEvent($source)
+ {
+ return new Swift_Events_EventObject($source);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php
new file mode 100644
index 0000000..6f611ac
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/ResponseEventTest.php
@@ -0,0 +1,38 @@
+<?php
+
+class Swift_Events_ResponseEventTest extends \PHPUnit_Framework_TestCase
+{
+ public function testResponseCanBeFetchViaGetter()
+ {
+ $evt = $this->_createEvent($this->_createTransport(), "250 Ok\r\n", true);
+ $this->assertEquals("250 Ok\r\n", $evt->getResponse(),
+ '%s: Response should be available via getResponse()'
+ );
+ }
+
+ public function testResultCanBeFetchedViaGetter()
+ {
+ $evt = $this->_createEvent($this->_createTransport(), "250 Ok\r\n", false);
+ $this->assertFalse($evt->isValid(),
+ '%s: Result should be checkable via isValid()'
+ );
+ }
+
+ public function testSourceIsBuffer()
+ {
+ $transport = $this->_createTransport();
+ $evt = $this->_createEvent($transport, "250 Ok\r\n", true);
+ $ref = $evt->getSource();
+ $this->assertEquals($transport, $ref);
+ }
+
+ private function _createEvent(Swift_Transport $source, $response, $result)
+ {
+ return new Swift_Events_ResponseEvent($source, $response, $result);
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php
new file mode 100644
index 0000000..c4a6a7e
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SendEventTest.php
@@ -0,0 +1,97 @@
+<?php
+
+class Swift_Events_SendEventTest extends \PHPUnit_Framework_TestCase
+{
+ public function testMessageCanBeFetchedViaGetter()
+ {
+ $message = $this->_createMessage();
+ $transport = $this->_createTransport();
+
+ $evt = $this->_createEvent($transport, $message);
+
+ $ref = $evt->getMessage();
+ $this->assertEquals($message, $ref,
+ '%s: Message should be returned from getMessage()'
+ );
+ }
+
+ public function testTransportCanBeFetchViaGetter()
+ {
+ $message = $this->_createMessage();
+ $transport = $this->_createTransport();
+
+ $evt = $this->_createEvent($transport, $message);
+
+ $ref = $evt->getTransport();
+ $this->assertEquals($transport, $ref,
+ '%s: Transport should be returned from getTransport()'
+ );
+ }
+
+ public function testTransportCanBeFetchViaGetSource()
+ {
+ $message = $this->_createMessage();
+ $transport = $this->_createTransport();
+
+ $evt = $this->_createEvent($transport, $message);
+
+ $ref = $evt->getSource();
+ $this->assertEquals($transport, $ref,
+ '%s: Transport should be returned from getSource()'
+ );
+ }
+
+ public function testResultCanBeSetAndGet()
+ {
+ $message = $this->_createMessage();
+ $transport = $this->_createTransport();
+
+ $evt = $this->_createEvent($transport, $message);
+
+ $evt->setResult(
+ Swift_Events_SendEvent::RESULT_SUCCESS | Swift_Events_SendEvent::RESULT_TENTATIVE
+ );
+
+ $this->assertTrue((bool) ($evt->getResult() & Swift_Events_SendEvent::RESULT_SUCCESS));
+ $this->assertTrue((bool) ($evt->getResult() & Swift_Events_SendEvent::RESULT_TENTATIVE));
+ }
+
+ public function testFailedRecipientsCanBeSetAndGet()
+ {
+ $message = $this->_createMessage();
+ $transport = $this->_createTransport();
+
+ $evt = $this->_createEvent($transport, $message);
+
+ $evt->setFailedRecipients(array('foo@bar', 'zip@button'));
+
+ $this->assertEquals(array('foo@bar', 'zip@button'), $evt->getFailedRecipients(),
+ '%s: FailedRecipients should be returned from getter'
+ );
+ }
+
+ public function testFailedRecipientsGetsPickedUpCorrectly()
+ {
+ $message = $this->_createMessage();
+ $transport = $this->_createTransport();
+
+ $evt = $this->_createEvent($transport, $message);
+ $this->assertEquals(array(), $evt->getFailedRecipients());
+ }
+
+ private function _createEvent(Swift_Transport $source,
+ Swift_Mime_Message $message)
+ {
+ return new Swift_Events_SendEvent($source, $message);
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+
+ private function _createMessage()
+ {
+ return $this->getMockBuilder('Swift_Mime_Message')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php
new file mode 100644
index 0000000..3f063ff
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/SimpleEventDispatcherTest.php
@@ -0,0 +1,142 @@
+<?php
+
+class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase
+{
+ private $_dispatcher;
+
+ protected function setUp()
+ {
+ $this->_dispatcher = new Swift_Events_SimpleEventDispatcher();
+ }
+
+ public function testSendEventCanBeCreated()
+ {
+ $transport = $this->getMockBuilder('Swift_Transport')->getMock();
+ $message = $this->getMockBuilder('Swift_Mime_Message')->getMock();
+ $evt = $this->_dispatcher->createSendEvent($transport, $message);
+ $this->assertInstanceOf('Swift_Events_SendEvent', $evt);
+ $this->assertSame($message, $evt->getMessage());
+ $this->assertSame($transport, $evt->getTransport());
+ }
+
+ public function testCommandEventCanBeCreated()
+ {
+ $buf = $this->getMockBuilder('Swift_Transport')->getMock();
+ $evt = $this->_dispatcher->createCommandEvent($buf, "FOO\r\n", array(250));
+ $this->assertInstanceOf('Swift_Events_CommandEvent', $evt);
+ $this->assertSame($buf, $evt->getSource());
+ $this->assertEquals("FOO\r\n", $evt->getCommand());
+ $this->assertEquals(array(250), $evt->getSuccessCodes());
+ }
+
+ public function testResponseEventCanBeCreated()
+ {
+ $buf = $this->getMockBuilder('Swift_Transport')->getMock();
+ $evt = $this->_dispatcher->createResponseEvent($buf, "250 Ok\r\n", true);
+ $this->assertInstanceOf('Swift_Events_ResponseEvent', $evt);
+ $this->assertSame($buf, $evt->getSource());
+ $this->assertEquals("250 Ok\r\n", $evt->getResponse());
+ $this->assertTrue($evt->isValid());
+ }
+
+ public function testTransportChangeEventCanBeCreated()
+ {
+ $transport = $this->getMockBuilder('Swift_Transport')->getMock();
+ $evt = $this->_dispatcher->createTransportChangeEvent($transport);
+ $this->assertInstanceOf('Swift_Events_TransportChangeEvent', $evt);
+ $this->assertSame($transport, $evt->getSource());
+ }
+
+ public function testTransportExceptionEventCanBeCreated()
+ {
+ $transport = $this->getMockBuilder('Swift_Transport')->getMock();
+ $ex = new Swift_TransportException('');
+ $evt = $this->_dispatcher->createTransportExceptionEvent($transport, $ex);
+ $this->assertInstanceOf('Swift_Events_TransportExceptionEvent', $evt);
+ $this->assertSame($transport, $evt->getSource());
+ $this->assertSame($ex, $evt->getException());
+ }
+
+ public function testListenersAreNotifiedOfDispatchedEvent()
+ {
+ $transport = $this->getMockBuilder('Swift_Transport')->getMock();
+
+ $evt = $this->_dispatcher->createTransportChangeEvent($transport);
+
+ $listenerA = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock();
+ $listenerB = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock();
+
+ $this->_dispatcher->bindEventListener($listenerA);
+ $this->_dispatcher->bindEventListener($listenerB);
+
+ $listenerA->expects($this->once())
+ ->method('transportStarted')
+ ->with($evt);
+ $listenerB->expects($this->once())
+ ->method('transportStarted')
+ ->with($evt);
+
+ $this->_dispatcher->dispatchEvent($evt, 'transportStarted');
+ }
+
+ public function testListenersAreOnlyCalledIfImplementingCorrectInterface()
+ {
+ $transport = $this->getMockBuilder('Swift_Transport')->getMock();
+ $message = $this->getMockBuilder('Swift_Mime_Message')->getMock();
+
+ $evt = $this->_dispatcher->createSendEvent($transport, $message);
+
+ $targetListener = $this->getMockBuilder('Swift_Events_SendListener')->getMock();
+ $otherListener = $this->getMockBuilder('DummyListener')->getMock();
+
+ $this->_dispatcher->bindEventListener($targetListener);
+ $this->_dispatcher->bindEventListener($otherListener);
+
+ $targetListener->expects($this->once())
+ ->method('sendPerformed')
+ ->with($evt);
+ $otherListener->expects($this->never())
+ ->method('sendPerformed');
+
+ $this->_dispatcher->dispatchEvent($evt, 'sendPerformed');
+ }
+
+ public function testListenersCanCancelBubblingOfEvent()
+ {
+ $transport = $this->getMockBuilder('Swift_Transport')->getMock();
+ $message = $this->getMockBuilder('Swift_Mime_Message')->getMock();
+
+ $evt = $this->_dispatcher->createSendEvent($transport, $message);
+
+ $listenerA = $this->getMockBuilder('Swift_Events_SendListener')->getMock();
+ $listenerB = $this->getMockBuilder('Swift_Events_SendListener')->getMock();
+
+ $this->_dispatcher->bindEventListener($listenerA);
+ $this->_dispatcher->bindEventListener($listenerB);
+
+ $listenerA->expects($this->once())
+ ->method('sendPerformed')
+ ->with($evt)
+ ->will($this->returnCallback(function ($object) {
+ $object->cancelBubble(true);
+ }));
+ $listenerB->expects($this->never())
+ ->method('sendPerformed');
+
+ $this->_dispatcher->dispatchEvent($evt, 'sendPerformed');
+
+ $this->assertTrue($evt->bubbleCancelled());
+ }
+
+ private function _createDispatcher(array $map)
+ {
+ return new Swift_Events_SimpleEventDispatcher($map);
+ }
+}
+
+class DummyListener implements Swift_Events_EventListener
+{
+ public function sendPerformed(Swift_Events_SendEvent $evt)
+ {
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php
new file mode 100644
index 0000000..a260ccb
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportChangeEventTest.php
@@ -0,0 +1,30 @@
+<?php
+
+class Swift_Events_TransportChangeEventTest extends \PHPUnit_Framework_TestCase
+{
+ public function testGetTransportReturnsTransport()
+ {
+ $transport = $this->_createTransport();
+ $evt = $this->_createEvent($transport);
+ $ref = $evt->getTransport();
+ $this->assertEquals($transport, $ref);
+ }
+
+ public function testSourceIsTransport()
+ {
+ $transport = $this->_createTransport();
+ $evt = $this->_createEvent($transport);
+ $ref = $evt->getSource();
+ $this->assertEquals($transport, $ref);
+ }
+
+ private function _createEvent(Swift_Transport $source)
+ {
+ return new Swift_Events_TransportChangeEvent($source);
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php
new file mode 100644
index 0000000..731dfad
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Events/TransportExceptionEventTest.php
@@ -0,0 +1,41 @@
+<?php
+
+class Swift_Events_TransportExceptionEventTest extends \PHPUnit_Framework_TestCase
+{
+ public function testExceptionCanBeFetchViaGetter()
+ {
+ $ex = $this->_createException();
+ $transport = $this->_createTransport();
+ $evt = $this->_createEvent($transport, $ex);
+ $ref = $evt->getException();
+ $this->assertEquals($ex, $ref,
+ '%s: Exception should be available via getException()'
+ );
+ }
+
+ public function testSourceIsTransport()
+ {
+ $ex = $this->_createException();
+ $transport = $this->_createTransport();
+ $evt = $this->_createEvent($transport, $ex);
+ $ref = $evt->getSource();
+ $this->assertEquals($transport, $ref,
+ '%s: Transport should be available via getSource()'
+ );
+ }
+
+ private function _createEvent(Swift_Transport $transport, Swift_TransportException $ex)
+ {
+ return new Swift_Events_TransportExceptionEvent($transport, $ex);
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+
+ private function _createException()
+ {
+ return new Swift_TransportException('');
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php
new file mode 100644
index 0000000..f2ed5dd
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/ArrayKeyCacheTest.php
@@ -0,0 +1,240 @@
+<?php
+
+class Swift_KeyCache_ArrayKeyCacheTest extends \PHPUnit_Framework_TestCase
+{
+ private $_key1 = 'key1';
+ private $_key2 = 'key2';
+
+ public function testStringDataCanBeSetAndFetched()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('test', $cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testStringDataCanBeOverwritten()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $cache->setString(
+ $this->_key1, 'foo', 'whatever', Swift_KeyCache::MODE_WRITE
+ );
+
+ $this->assertEquals('whatever', $cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testStringDataCanBeAppended()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $cache->setString(
+ $this->_key1, 'foo', 'ing', Swift_KeyCache::MODE_APPEND
+ );
+
+ $this->assertEquals('testing', $cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testHasKeyReturnValue()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+
+ $this->assertTrue($cache->hasKey($this->_key1, 'foo'));
+ }
+
+ public function testNsKeyIsWellPartitioned()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $cache->setString(
+ $this->_key2, 'foo', 'ing', Swift_KeyCache::MODE_WRITE
+ );
+
+ $this->assertEquals('test', $cache->getString($this->_key1, 'foo'));
+ $this->assertEquals('ing', $cache->getString($this->_key2, 'foo'));
+ }
+
+ public function testItemKeyIsWellPartitioned()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $cache->setString(
+ $this->_key1, 'bar', 'ing', Swift_KeyCache::MODE_WRITE
+ );
+
+ $this->assertEquals('test', $cache->getString($this->_key1, 'foo'));
+ $this->assertEquals('ing', $cache->getString($this->_key1, 'bar'));
+ }
+
+ public function testByteStreamCanBeImported()
+ {
+ $os = $this->_createOutputStream();
+ $os->expects($this->at(0))
+ ->method('read')
+ ->will($this->returnValue('abc'));
+ $os->expects($this->at(1))
+ ->method('read')
+ ->will($this->returnValue('def'));
+ $os->expects($this->at(2))
+ ->method('read')
+ ->will($this->returnValue(false));
+
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+ $cache->importFromByteStream(
+ $this->_key1, 'foo', $os, Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertEquals('abcdef', $cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testByteStreamCanBeAppended()
+ {
+ $os1 = $this->_createOutputStream();
+ $os1->expects($this->at(0))
+ ->method('read')
+ ->will($this->returnValue('abc'));
+ $os1->expects($this->at(1))
+ ->method('read')
+ ->will($this->returnValue('def'));
+ $os1->expects($this->at(2))
+ ->method('read')
+ ->will($this->returnValue(false));
+
+ $os2 = $this->_createOutputStream();
+ $os2->expects($this->at(0))
+ ->method('read')
+ ->will($this->returnValue('xyz'));
+ $os2->expects($this->at(1))
+ ->method('read')
+ ->will($this->returnValue('uvw'));
+ $os2->expects($this->at(2))
+ ->method('read')
+ ->will($this->returnValue(false));
+
+ $is = $this->_createKeyCacheInputStream(true);
+
+ $cache = $this->_createCache($is);
+
+ $cache->importFromByteStream(
+ $this->_key1, 'foo', $os1, Swift_KeyCache::MODE_APPEND
+ );
+ $cache->importFromByteStream(
+ $this->_key1, 'foo', $os2, Swift_KeyCache::MODE_APPEND
+ );
+
+ $this->assertEquals('abcdefxyzuvw', $cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testByteStreamAndStringCanBeAppended()
+ {
+ $os = $this->_createOutputStream();
+ $os->expects($this->at(0))
+ ->method('read')
+ ->will($this->returnValue('abc'));
+ $os->expects($this->at(1))
+ ->method('read')
+ ->will($this->returnValue('def'));
+ $os->expects($this->at(2))
+ ->method('read')
+ ->will($this->returnValue(false));
+
+ $is = $this->_createKeyCacheInputStream(true);
+
+ $cache = $this->_createCache($is);
+
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_APPEND
+ );
+ $cache->importFromByteStream(
+ $this->_key1, 'foo', $os, Swift_KeyCache::MODE_APPEND
+ );
+ $this->assertEquals('testabcdef', $cache->getString($this->_key1, 'foo'));
+ }
+
+ public function testDataCanBeExportedToByteStream()
+ {
+ //See acceptance test for more detail
+ $is = $this->_createInputStream();
+ $is->expects($this->atLeastOnce())
+ ->method('write');
+
+ $kcis = $this->_createKeyCacheInputStream(true);
+
+ $cache = $this->_createCache($kcis);
+
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+
+ $cache->exportToByteStream($this->_key1, 'foo', $is);
+ }
+
+ public function testKeyCanBeCleared()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($cache->hasKey($this->_key1, 'foo'));
+ $cache->clearKey($this->_key1, 'foo');
+ $this->assertFalse($cache->hasKey($this->_key1, 'foo'));
+ }
+
+ public function testNsKeyCanBeCleared()
+ {
+ $is = $this->_createKeyCacheInputStream();
+ $cache = $this->_createCache($is);
+
+ $cache->setString(
+ $this->_key1, 'foo', 'test', Swift_KeyCache::MODE_WRITE
+ );
+ $cache->setString(
+ $this->_key1, 'bar', 'xyz', Swift_KeyCache::MODE_WRITE
+ );
+ $this->assertTrue($cache->hasKey($this->_key1, 'foo'));
+ $this->assertTrue($cache->hasKey($this->_key1, 'bar'));
+ $cache->clearAll($this->_key1);
+ $this->assertFalse($cache->hasKey($this->_key1, 'foo'));
+ $this->assertFalse($cache->hasKey($this->_key1, 'bar'));
+ }
+
+ private function _createCache($is)
+ {
+ return new Swift_KeyCache_ArrayKeyCache($is);
+ }
+
+ private function _createKeyCacheInputStream()
+ {
+ return $this->getMockBuilder('Swift_KeyCache_KeyCacheInputStream')->getMock();
+ }
+
+ private function _createOutputStream()
+ {
+ return $this->getMockBuilder('Swift_OutputByteStream')->getMock();
+ }
+
+ private function _createInputStream()
+ {
+ return $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php
new file mode 100644
index 0000000..38fbc0d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/KeyCache/SimpleKeyCacheInputStreamTest.php
@@ -0,0 +1,73 @@
+<?php
+
+class Swift_KeyCache_SimpleKeyCacheInputStreamTest extends \PHPUnit_Framework_TestCase
+{
+ private $_nsKey = 'ns1';
+
+ public function testStreamWritesToCacheInAppendMode()
+ {
+ $cache = $this->getMockBuilder('Swift_KeyCache')->getMock();
+ $cache->expects($this->at(0))
+ ->method('setString')
+ ->with($this->_nsKey, 'foo', 'a', Swift_KeyCache::MODE_APPEND);
+ $cache->expects($this->at(1))
+ ->method('setString')
+ ->with($this->_nsKey, 'foo', 'b', Swift_KeyCache::MODE_APPEND);
+ $cache->expects($this->at(2))
+ ->method('setString')
+ ->with($this->_nsKey, 'foo', 'c', Swift_KeyCache::MODE_APPEND);
+
+ $stream = new Swift_KeyCache_SimpleKeyCacheInputStream();
+ $stream->setKeyCache($cache);
+ $stream->setNsKey($this->_nsKey);
+ $stream->setItemKey('foo');
+
+ $stream->write('a');
+ $stream->write('b');
+ $stream->write('c');
+ }
+
+ public function testFlushContentClearsKey()
+ {
+ $cache = $this->getMockBuilder('Swift_KeyCache')->getMock();
+ $cache->expects($this->once())
+ ->method('clearKey')
+ ->with($this->_nsKey, 'foo');
+
+ $stream = new Swift_KeyCache_SimpleKeyCacheInputStream();
+ $stream->setKeyCache($cache);
+ $stream->setNsKey($this->_nsKey);
+ $stream->setItemKey('foo');
+
+ $stream->flushBuffers();
+ }
+
+ public function testClonedStreamStillReferencesSameCache()
+ {
+ $cache = $this->getMockBuilder('Swift_KeyCache')->getMock();
+ $cache->expects($this->at(0))
+ ->method('setString')
+ ->with($this->_nsKey, 'foo', 'a', Swift_KeyCache::MODE_APPEND);
+ $cache->expects($this->at(1))
+ ->method('setString')
+ ->with($this->_nsKey, 'foo', 'b', Swift_KeyCache::MODE_APPEND);
+ $cache->expects($this->at(2))
+ ->method('setString')
+ ->with('test', 'bar', 'x', Swift_KeyCache::MODE_APPEND);
+
+ $stream = new Swift_KeyCache_SimpleKeyCacheInputStream();
+ $stream->setKeyCache($cache);
+ $stream->setNsKey($this->_nsKey);
+ $stream->setItemKey('foo');
+
+ $stream->write('a');
+ $stream->write('b');
+
+ $newStream = clone $stream;
+ $newStream->setKeyCache($cache);
+ $newStream->setNsKey('test');
+ $newStream->setItemKey('bar');
+
+ $newStream->write('x');
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php
new file mode 100644
index 0000000..ff0bce4
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mailer/ArrayRecipientIteratorTest.php
@@ -0,0 +1,42 @@
+<?php
+
+class Swift_Mailer_ArrayRecipientIteratorTest extends \PHPUnit_Framework_TestCase
+{
+ public function testHasNextReturnsFalseForEmptyArray()
+ {
+ $it = new Swift_Mailer_ArrayRecipientIterator(array());
+ $this->assertFalse($it->hasNext());
+ }
+
+ public function testHasNextReturnsTrueIfItemsLeft()
+ {
+ $it = new Swift_Mailer_ArrayRecipientIterator(array('foo@bar' => 'Foo'));
+ $this->assertTrue($it->hasNext());
+ }
+
+ public function testReadingToEndOfListCausesHasNextToReturnFalse()
+ {
+ $it = new Swift_Mailer_ArrayRecipientIterator(array('foo@bar' => 'Foo'));
+ $this->assertTrue($it->hasNext());
+ $it->nextRecipient();
+ $this->assertFalse($it->hasNext());
+ }
+
+ public function testReturnedValueHasPreservedKeyValuePair()
+ {
+ $it = new Swift_Mailer_ArrayRecipientIterator(array('foo@bar' => 'Foo'));
+ $this->assertEquals(array('foo@bar' => 'Foo'), $it->nextRecipient());
+ }
+
+ public function testIteratorMovesNextAfterEachIteration()
+ {
+ $it = new Swift_Mailer_ArrayRecipientIterator(array(
+ 'foo@bar' => 'Foo',
+ 'zip@button' => 'Zip thing',
+ 'test@test' => null,
+ ));
+ $this->assertEquals(array('foo@bar' => 'Foo'), $it->nextRecipient());
+ $this->assertEquals(array('zip@button' => 'Zip thing'), $it->nextRecipient());
+ $this->assertEquals(array('test@test' => null), $it->nextRecipient());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php
new file mode 100644
index 0000000..74951a7
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MailerTest.php
@@ -0,0 +1,145 @@
+<?php
+
+class Swift_MailerTest extends \SwiftMailerTestCase
+{
+ public function testTransportIsStartedWhenSending()
+ {
+ $transport = $this->_createTransport();
+ $message = $this->_createMessage();
+
+ $started = false;
+ $transport->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$started) {
+ return $started;
+ });
+ $transport->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$started) {
+ $started = true;
+
+ return;
+ });
+
+ $mailer = $this->_createMailer($transport);
+ $mailer->send($message);
+ }
+
+ public function testTransportIsOnlyStartedOnce()
+ {
+ $transport = $this->_createTransport();
+ $message = $this->_createMessage();
+
+ $started = false;
+ $transport->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$started) {
+ return $started;
+ });
+ $transport->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$started) {
+ $started = true;
+
+ return;
+ });
+
+ $mailer = $this->_createMailer($transport);
+ for ($i = 0; $i < 10; ++$i) {
+ $mailer->send($message);
+ }
+ }
+
+ public function testMessageIsPassedToTransport()
+ {
+ $transport = $this->_createTransport();
+ $message = $this->_createMessage();
+ $transport->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any());
+
+ $mailer = $this->_createMailer($transport);
+ $mailer->send($message);
+ }
+
+ public function testSendReturnsCountFromTransport()
+ {
+ $transport = $this->_createTransport();
+ $message = $this->_createMessage();
+ $transport->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturn(57);
+
+ $mailer = $this->_createMailer($transport);
+ $this->assertEquals(57, $mailer->send($message));
+ }
+
+ public function testFailedRecipientReferenceIsPassedToTransport()
+ {
+ $failures = array();
+
+ $transport = $this->_createTransport();
+ $message = $this->_createMessage();
+ $transport->shouldReceive('send')
+ ->once()
+ ->with($message, $failures)
+ ->andReturn(57);
+
+ $mailer = $this->_createMailer($transport);
+ $mailer->send($message, $failures);
+ }
+
+ public function testSendRecordsRfcComplianceExceptionAsEntireSendFailure()
+ {
+ $failures = array();
+
+ $rfcException = new Swift_RfcComplianceException('test');
+ $transport = $this->_createTransport();
+ $message = $this->_createMessage();
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo&invalid' => 'Foo', 'bar@valid.tld' => 'Bar'));
+ $transport->shouldReceive('send')
+ ->once()
+ ->with($message, $failures)
+ ->andThrow($rfcException);
+
+ $mailer = $this->_createMailer($transport);
+ $this->assertEquals(0, $mailer->send($message, $failures), '%s: Should return 0');
+ $this->assertEquals(array('foo&invalid', 'bar@valid.tld'), $failures, '%s: Failures should contain all addresses since the entire message failed to compile');
+ }
+
+ public function testRegisterPluginDelegatesToTransport()
+ {
+ $plugin = $this->_createPlugin();
+ $transport = $this->_createTransport();
+ $mailer = $this->_createMailer($transport);
+
+ $transport->shouldReceive('registerPlugin')
+ ->once()
+ ->with($plugin);
+
+ $mailer->registerPlugin($plugin);
+ }
+
+ private function _createPlugin()
+ {
+ return $this->getMockery('Swift_Events_EventListener')->shouldIgnoreMissing();
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockery('Swift_Transport')->shouldIgnoreMissing();
+ }
+
+ private function _createMessage()
+ {
+ return $this->getMockery('Swift_Mime_Message')->shouldIgnoreMissing();
+ }
+
+ private function _createMailer(Swift_Transport $transport)
+ {
+ return new Swift_Mailer($transport);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php
new file mode 100644
index 0000000..35a568c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/MessageTest.php
@@ -0,0 +1,129 @@
+<?php
+
+class Swift_MessageTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCloning()
+ {
+ $message1 = new Swift_Message('subj', 'body', 'ctype');
+ $message2 = new Swift_Message('subj', 'body', 'ctype');
+ $message1_clone = clone $message1;
+
+ $this->_recursiveObjectCloningCheck($message1, $message2, $message1_clone);
+ }
+
+ public function testCloningWithSigners()
+ {
+ $message1 = new Swift_Message('subj', 'body', 'ctype');
+ $signer = new Swift_Signers_DKIMSigner(dirname(dirname(__DIR__)).'/_samples/dkim/dkim.test.priv', 'test.example', 'example');
+ $message1->attachSigner($signer);
+ $message2 = new Swift_Message('subj', 'body', 'ctype');
+ $signer = new Swift_Signers_DKIMSigner(dirname(dirname(__DIR__)).'/_samples/dkim/dkim.test.priv', 'test.example', 'example');
+ $message2->attachSigner($signer);
+ $message1_clone = clone $message1;
+
+ $this->_recursiveObjectCloningCheck($message1, $message2, $message1_clone);
+ }
+
+ public function testBodySwap()
+ {
+ $message1 = new Swift_Message('Test');
+ $html = Swift_MimePart::newInstance('<html></html>', 'text/html');
+ $html->getHeaders()->addTextHeader('X-Test-Remove', 'Test-Value');
+ $html->getHeaders()->addTextHeader('X-Test-Alter', 'Test-Value');
+ $message1->attach($html);
+ $source = $message1->toString();
+ $message2 = clone $message1;
+ $message2->setSubject('Message2');
+ foreach ($message2->getChildren() as $child) {
+ $child->setBody('Test');
+ $child->getHeaders()->removeAll('X-Test-Remove');
+ $child->getHeaders()->get('X-Test-Alter')->setValue('Altered');
+ }
+ $final = $message1->toString();
+ if ($source != $final) {
+ $this->fail("Difference although object cloned \n [".$source."]\n[".$final."]\n");
+ }
+ $final = $message2->toString();
+ if ($final == $source) {
+ $this->fail('Two body matches although they should differ'."\n [".$source."]\n[".$final."]\n");
+ }
+ $id_1 = $message1->getId();
+ $id_2 = $message2->getId();
+ $this->assertEquals($id_1, $id_2, 'Message Ids differ');
+ $id_2 = $message2->generateId();
+ $this->assertNotEquals($id_1, $id_2, 'Message Ids are the same');
+ }
+
+ protected function _recursiveObjectCloningCheck($obj1, $obj2, $obj1_clone)
+ {
+ $obj1_properties = (array) $obj1;
+ $obj2_properties = (array) $obj2;
+ $obj1_clone_properties = (array) $obj1_clone;
+
+ foreach ($obj1_properties as $property => $value) {
+ if (is_object($value)) {
+ $obj1_value = $obj1_properties[$property];
+ $obj2_value = $obj2_properties[$property];
+ $obj1_clone_value = $obj1_clone_properties[$property];
+
+ if ($obj1_value !== $obj2_value) {
+ // two separetely instanciated objects property not referencing same object
+ $this->assertFalse(
+ // but object's clone does - not everything copied
+ $obj1_value === $obj1_clone_value,
+ "Property `$property` cloning error: source and cloned objects property is referencing same object"
+ );
+ } else {
+ // two separetely instanciated objects have same reference
+ $this->assertFalse(
+ // but object's clone doesn't - overdone making copies
+ $obj1_value !== $obj1_clone_value,
+ "Property `$property` not properly cloned: it should reference same object as cloning source (overdone copping)"
+ );
+ }
+ // recurse
+ $this->_recursiveObjectCloningCheck($obj1_value, $obj2_value, $obj1_clone_value);
+ } elseif (is_array($value)) {
+ $obj1_value = $obj1_properties[$property];
+ $obj2_value = $obj2_properties[$property];
+ $obj1_clone_value = $obj1_clone_properties[$property];
+
+ return $this->_recursiveArrayCloningCheck($obj1_value, $obj2_value, $obj1_clone_value);
+ }
+ }
+ }
+
+ protected function _recursiveArrayCloningCheck($array1, $array2, $array1_clone)
+ {
+ foreach ($array1 as $key => $value) {
+ if (is_object($value)) {
+ $arr1_value = $array1[$key];
+ $arr2_value = $array2[$key];
+ $arr1_clone_value = $array1_clone[$key];
+ if ($arr1_value !== $arr2_value) {
+ // two separetely instanciated objects property not referencing same object
+ $this->assertFalse(
+ // but object's clone does - not everything copied
+ $arr1_value === $arr1_clone_value,
+ "Key `$key` cloning error: source and cloned objects property is referencing same object"
+ );
+ } else {
+ // two separetely instanciated objects have same reference
+ $this->assertFalse(
+ // but object's clone doesn't - overdone making copies
+ $arr1_value !== $arr1_clone_value,
+ "Key `$key` not properly cloned: it should reference same object as cloning source (overdone copping)"
+ );
+ }
+ // recurse
+ $this->_recursiveObjectCloningCheck($arr1_value, $arr2_value, $arr1_clone_value);
+ } elseif (is_array($value)) {
+ $arr1_value = $array1[$key];
+ $arr2_value = $array2[$key];
+ $arr1_clone_value = $array1_clone[$key];
+
+ return $this->_recursiveArrayCloningCheck($arr1_value, $arr2_value, $arr1_clone_value);
+ }
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php
new file mode 100644
index 0000000..3efe6ec
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AbstractMimeEntityTest.php
@@ -0,0 +1,1092 @@
+<?php
+
+require_once dirname(dirname(dirname(__DIR__))).'/fixtures/MimeEntityFixture.php';
+
+abstract class Swift_Mime_AbstractMimeEntityTest extends \SwiftMailerTestCase
+{
+ public function testGetHeadersReturnsHeaderSet()
+ {
+ $headers = $this->_createHeaderSet();
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $this->assertSame($headers, $entity->getHeaders());
+ }
+
+ public function testContentTypeIsReturnedFromHeader()
+ {
+ $ctype = $this->_createHeader('Content-Type', 'image/jpeg-test');
+ $headers = $this->_createHeaderSet(array('Content-Type' => $ctype));
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $this->assertEquals('image/jpeg-test', $entity->getContentType());
+ }
+
+ public function testContentTypeIsSetInHeader()
+ {
+ $ctype = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $headers = $this->_createHeaderSet(array('Content-Type' => $ctype));
+
+ $ctype->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('image/jpeg');
+ $ctype->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes()
+ ->with(\Mockery::not('image/jpeg'));
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setContentType('image/jpeg');
+ }
+
+ public function testContentTypeHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addParameterizedHeader')
+ ->once()
+ ->with('Content-Type', 'image/jpeg');
+ $headers->shouldReceive('addParameterizedHeader')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setContentType('image/jpeg');
+ }
+
+ public function testContentTypeCanBeSetViaSetBody()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addParameterizedHeader')
+ ->once()
+ ->with('Content-Type', 'text/html');
+ $headers->shouldReceive('addParameterizedHeader')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBody('<b>foo</b>', 'text/html');
+ }
+
+ public function testGetEncoderFromConstructor()
+ {
+ $encoder = $this->_createEncoder('base64');
+ $entity = $this->_createEntity($this->_createHeaderSet(), $encoder,
+ $this->_createCache()
+ );
+ $this->assertSame($encoder, $entity->getEncoder());
+ }
+
+ public function testSetAndGetEncoder()
+ {
+ $encoder = $this->_createEncoder('base64');
+ $headers = $this->_createHeaderSet();
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setEncoder($encoder);
+ $this->assertSame($encoder, $entity->getEncoder());
+ }
+
+ public function testSettingEncoderUpdatesTransferEncoding()
+ {
+ $encoder = $this->_createEncoder('base64');
+ $encoding = $this->_createHeader(
+ 'Content-Transfer-Encoding', '8bit', array(), false
+ );
+ $headers = $this->_createHeaderSet(array(
+ 'Content-Transfer-Encoding' => $encoding,
+ ));
+ $encoding->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('base64');
+ $encoding->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setEncoder($encoder);
+ }
+
+ public function testSettingEncoderAddsEncodingHeaderIfNonePresent()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addTextHeader')
+ ->once()
+ ->with('Content-Transfer-Encoding', 'something');
+ $headers->shouldReceive('addTextHeader')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setEncoder($this->_createEncoder('something'));
+ }
+
+ public function testIdIsReturnedFromHeader()
+ {
+ /* -- RFC 2045, 7.
+ In constructing a high-level user agent, it may be desirable to allow
+ one body to make reference to another. Accordingly, bodies may be
+ labelled using the "Content-ID" header field, which is syntactically
+ identical to the "Message-ID" header field
+ */
+
+ $cid = $this->_createHeader('Content-ID', 'zip@button');
+ $headers = $this->_createHeaderSet(array('Content-ID' => $cid));
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $this->assertEquals('zip@button', $entity->getId());
+ }
+
+ public function testIdIsSetInHeader()
+ {
+ $cid = $this->_createHeader('Content-ID', 'zip@button', array(), false);
+ $headers = $this->_createHeaderSet(array('Content-ID' => $cid));
+
+ $cid->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('foo@bar');
+ $cid->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setId('foo@bar');
+ }
+
+ public function testIdIsAutoGenerated()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertRegExp('/^.*?@.*?$/D', $entity->getId());
+ }
+
+ public function testGenerateIdCreatesNewId()
+ {
+ $headers = $this->_createHeaderSet();
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $id1 = $entity->generateId();
+ $id2 = $entity->generateId();
+ $this->assertNotEquals($id1, $id2);
+ }
+
+ public function testGenerateIdSetsNewId()
+ {
+ $headers = $this->_createHeaderSet();
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $id = $entity->generateId();
+ $this->assertEquals($id, $entity->getId());
+ }
+
+ public function testDescriptionIsReadFromHeader()
+ {
+ /* -- RFC 2045, 8.
+ The ability to associate some descriptive information with a given
+ body is often desirable. For example, it may be useful to mark an
+ "image" body as "a picture of the Space Shuttle Endeavor." Such text
+ may be placed in the Content-Description header field. This header
+ field is always optional.
+ */
+
+ $desc = $this->_createHeader('Content-Description', 'something');
+ $headers = $this->_createHeaderSet(array('Content-Description' => $desc));
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $this->assertEquals('something', $entity->getDescription());
+ }
+
+ public function testDescriptionIsSetInHeader()
+ {
+ $desc = $this->_createHeader('Content-Description', '', array(), false);
+ $desc->shouldReceive('setFieldBodyModel')->once()->with('whatever');
+
+ $headers = $this->_createHeaderSet(array('Content-Description' => $desc));
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setDescription('whatever');
+ }
+
+ public function testDescriptionHeaderIsAddedIfNotPresent()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addTextHeader')
+ ->once()
+ ->with('Content-Description', 'whatever');
+ $headers->shouldReceive('addTextHeader')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setDescription('whatever');
+ }
+
+ public function testSetAndGetMaxLineLength()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setMaxLineLength(60);
+ $this->assertEquals(60, $entity->getMaxLineLength());
+ }
+
+ public function testEncoderIsUsedForStringGeneration()
+ {
+ $encoder = $this->_createEncoder('base64', false);
+ $encoder->expects($this->once())
+ ->method('encodeString')
+ ->with('blah');
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $encoder, $this->_createCache()
+ );
+ $entity->setBody('blah');
+ $entity->toString();
+ }
+
+ public function testMaxLineLengthIsProvidedWhenEncoding()
+ {
+ $encoder = $this->_createEncoder('base64', false);
+ $encoder->expects($this->once())
+ ->method('encodeString')
+ ->with('blah', 0, 65);
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $encoder, $this->_createCache()
+ );
+ $entity->setBody('blah');
+ $entity->setMaxLineLength(65);
+ $entity->toString();
+ }
+
+ public function testHeadersAppearInString()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->once()
+ ->andReturn(
+ "Content-Type: text/plain; charset=utf-8\r\n".
+ "X-MyHeader: foobar\r\n"
+ );
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $this->assertEquals(
+ "Content-Type: text/plain; charset=utf-8\r\n".
+ "X-MyHeader: foobar\r\n",
+ $entity->toString()
+ );
+ }
+
+ public function testSetAndGetBody()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setBody("blah\r\nblah!");
+ $this->assertEquals("blah\r\nblah!", $entity->getBody());
+ }
+
+ public function testBodyIsAppended()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->once()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBody("blah\r\nblah!");
+ $this->assertEquals(
+ "Content-Type: text/plain; charset=utf-8\r\n".
+ "\r\n".
+ "blah\r\nblah!",
+ $entity->toString()
+ );
+ }
+
+ public function testGetBodyReturnsStringFromByteStream()
+ {
+ $os = $this->_createOutputStream('byte stream string');
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setBody($os);
+ $this->assertEquals('byte stream string', $entity->getBody());
+ }
+
+ public function testByteStreamBodyIsAppended()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $os = $this->_createOutputStream('streamed');
+ $headers->shouldReceive('toString')
+ ->once()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBody($os);
+ $this->assertEquals(
+ "Content-Type: text/plain; charset=utf-8\r\n".
+ "\r\n".
+ 'streamed',
+ $entity->toString()
+ );
+ }
+
+ public function testBoundaryCanBeRetrieved()
+ {
+ /* -- RFC 2046, 5.1.1.
+ boundary := 0*69<bchars> bcharsnospace
+
+ bchars := bcharsnospace / " "
+
+ bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
+ "+" / "_" / "," / "-" / "." /
+ "/" / ":" / "=" / "?"
+ */
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertRegExp(
+ '/^[a-zA-Z0-9\'\(\)\+_\-,\.\/:=\?\ ]{0,69}[a-zA-Z0-9\'\(\)\+_\-,\.\/:=\?]$/D',
+ $entity->getBoundary()
+ );
+ }
+
+ public function testBoundaryNeverChanges()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $firstBoundary = $entity->getBoundary();
+ for ($i = 0; $i < 10; ++$i) {
+ $this->assertEquals($firstBoundary, $entity->getBoundary());
+ }
+ }
+
+ public function testBoundaryCanBeSet()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setBoundary('foobar');
+ $this->assertEquals('foobar', $entity->getBoundary());
+ }
+
+ public function testAddingChildrenGeneratesBoundaryInHeaders()
+ {
+ $child = $this->_createChild();
+ $cType = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $cType->shouldReceive('setParameter')
+ ->once()
+ ->with('boundary', \Mockery::any());
+ $cType->shouldReceive('setParameter')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($this->_createHeaderSet(array(
+ 'Content-Type' => $cType,
+ )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ }
+
+ public function testChildrenOfLevelAttachmentAndLessCauseMultipartMixed()
+ {
+ for ($level = Swift_Mime_MimeEntity::LEVEL_MIXED;
+ $level > Swift_Mime_MimeEntity::LEVEL_TOP; $level /= 2) {
+ $child = $this->_createChild($level);
+ $cType = $this->_createHeader(
+ 'Content-Type', 'text/plain', array(), false
+ );
+ $cType->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('multipart/mixed');
+ $cType->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ }
+ }
+
+ public function testChildrenOfLevelAlternativeAndLessCauseMultipartAlternative()
+ {
+ for ($level = Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE;
+ $level > Swift_Mime_MimeEntity::LEVEL_MIXED; $level /= 2) {
+ $child = $this->_createChild($level);
+ $cType = $this->_createHeader(
+ 'Content-Type', 'text/plain', array(), false
+ );
+ $cType->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('multipart/alternative');
+ $cType->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ }
+ }
+
+ public function testChildrenOfLevelRelatedAndLessCauseMultipartRelated()
+ {
+ for ($level = Swift_Mime_MimeEntity::LEVEL_RELATED;
+ $level > Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE; $level /= 2) {
+ $child = $this->_createChild($level);
+ $cType = $this->_createHeader(
+ 'Content-Type', 'text/plain', array(), false
+ );
+ $cType->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('multipart/related');
+ $cType->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $entity = $this->_createEntity($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ }
+ }
+
+ public function testHighestLevelChildDeterminesContentType()
+ {
+ $combinations = array(
+ array('levels' => array(Swift_Mime_MimeEntity::LEVEL_MIXED,
+ Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ Swift_Mime_MimeEntity::LEVEL_RELATED,
+ ),
+ 'type' => 'multipart/mixed',
+ ),
+ array('levels' => array(Swift_Mime_MimeEntity::LEVEL_MIXED,
+ Swift_Mime_MimeEntity::LEVEL_RELATED,
+ ),
+ 'type' => 'multipart/mixed',
+ ),
+ array('levels' => array(Swift_Mime_MimeEntity::LEVEL_MIXED,
+ Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ ),
+ 'type' => 'multipart/mixed',
+ ),
+ array('levels' => array(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ Swift_Mime_MimeEntity::LEVEL_RELATED,
+ ),
+ 'type' => 'multipart/alternative',
+ ),
+ );
+
+ foreach ($combinations as $combination) {
+ $children = array();
+ foreach ($combination['levels'] as $level) {
+ $children[] = $this->_createChild($level);
+ }
+
+ $cType = $this->_createHeader(
+ 'Content-Type', 'text/plain', array(), false
+ );
+ $cType->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with($combination['type']);
+
+ $headerSet = $this->_createHeaderSet(array('Content-Type' => $cType));
+ $headerSet->shouldReceive('newInstance')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use ($headerSet) {
+ return $headerSet;
+ });
+ $entity = $this->_createEntity($headerSet,
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren($children);
+ }
+ }
+
+ public function testChildrenAppearNestedInString()
+ {
+ /* -- RFC 2046, 5.1.1.
+ (excerpt too verbose to paste here)
+ */
+
+ $headers = $this->_createHeaderSet(array(), false);
+
+ $child1 = new MimeEntityFixture(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'foobar', 'text/plain'
+ );
+
+ $child2 = new MimeEntityFixture(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/html\r\n".
+ "\r\n".
+ '<b>foobar</b>', 'text/html'
+ );
+
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: multipart/alternative; boundary=\"xxx\"\r\n");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBoundary('xxx');
+ $entity->setChildren(array($child1, $child2));
+
+ $this->assertEquals(
+ "Content-Type: multipart/alternative; boundary=\"xxx\"\r\n".
+ "\r\n".
+ "\r\n--xxx\r\n".
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ "foobar\r\n".
+ "\r\n--xxx\r\n".
+ "Content-Type: text/html\r\n".
+ "\r\n".
+ "<b>foobar</b>\r\n".
+ "\r\n--xxx--\r\n",
+ $entity->toString()
+ );
+ }
+
+ public function testMixingLevelsIsHierarchical()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $newHeaders = $this->_createHeaderSet(array(), false);
+
+ $part = $this->_createChild(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'foobar'
+ );
+
+ $attachment = $this->_createChild(Swift_Mime_MimeEntity::LEVEL_MIXED,
+ "Content-Type: application/octet-stream\r\n".
+ "\r\n".
+ 'data'
+ );
+
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: multipart/mixed; boundary=\"xxx\"\r\n");
+ $headers->shouldReceive('newInstance')
+ ->zeroOrMoreTimes()
+ ->andReturn($newHeaders);
+ $newHeaders->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: multipart/alternative; boundary=\"yyy\"\r\n");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBoundary('xxx');
+ $entity->setChildren(array($part, $attachment));
+
+ $this->assertRegExp(
+ '~^'.
+ "Content-Type: multipart/mixed; boundary=\"xxx\"\r\n".
+ "\r\n\r\n--xxx\r\n".
+ "Content-Type: multipart/alternative; boundary=\"yyy\"\r\n".
+ "\r\n\r\n--(.*?)\r\n".
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'foobar'.
+ "\r\n\r\n--\\1--\r\n".
+ "\r\n\r\n--xxx\r\n".
+ "Content-Type: application/octet-stream\r\n".
+ "\r\n".
+ 'data'.
+ "\r\n\r\n--xxx--\r\n".
+ '$~',
+ $entity->toString()
+ );
+ }
+
+ public function testSettingEncoderNotifiesChildren()
+ {
+ $child = $this->_createChild(0, '', false);
+ $encoder = $this->_createEncoder('base64');
+
+ $child->shouldReceive('encoderChanged')
+ ->once()
+ ->with($encoder);
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ $entity->setEncoder($encoder);
+ }
+
+ public function testReceiptOfEncoderChangeNotifiesChildren()
+ {
+ $child = $this->_createChild(0, '', false);
+ $encoder = $this->_createEncoder('base64');
+
+ $child->shouldReceive('encoderChanged')
+ ->once()
+ ->with($encoder);
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ $entity->encoderChanged($encoder);
+ }
+
+ public function testReceiptOfCharsetChangeNotifiesChildren()
+ {
+ $child = $this->_createChild(0, '', false);
+ $child->shouldReceive('charsetChanged')
+ ->once()
+ ->with('windows-874');
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $entity->setChildren(array($child));
+ $entity->charsetChanged('windows-874');
+ }
+
+ public function testEntityIsWrittenToByteStream()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $is = $this->_createInputStream(false);
+ $is->expects($this->atLeastOnce())
+ ->method('write');
+
+ $entity->toByteStream($is);
+ }
+
+ public function testEntityHeadersAreComittedToByteStream()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $is = $this->_createInputStream(false);
+ $is->expects($this->atLeastOnce())
+ ->method('write');
+ $is->expects($this->atLeastOnce())
+ ->method('commit');
+
+ $entity->toByteStream($is);
+ }
+
+ public function testOrderingTextBeforeHtml()
+ {
+ $htmlChild = new MimeEntityFixture(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/html\r\n".
+ "\r\n".
+ 'HTML PART',
+ 'text/html'
+ );
+ $textChild = new MimeEntityFixture(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'TEXT PART',
+ 'text/plain'
+ );
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: multipart/alternative; boundary=\"xxx\"\r\n");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBoundary('xxx');
+ $entity->setChildren(array($htmlChild, $textChild));
+
+ $this->assertEquals(
+ "Content-Type: multipart/alternative; boundary=\"xxx\"\r\n".
+ "\r\n\r\n--xxx\r\n".
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'TEXT PART'.
+ "\r\n\r\n--xxx\r\n".
+ "Content-Type: text/html\r\n".
+ "\r\n".
+ 'HTML PART'.
+ "\r\n\r\n--xxx--\r\n",
+ $entity->toString()
+ );
+ }
+
+ public function testOrderingEqualContentTypesMaintainsOriginalOrdering()
+ {
+ $firstChild = new MimeEntityFixture(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'PART 1',
+ 'text/plain'
+ );
+ $secondChild = new MimeEntityFixture(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE,
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'PART 2',
+ 'text/plain'
+ );
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: multipart/alternative; boundary=\"xxx\"\r\n");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $entity->setBoundary('xxx');
+ $entity->setChildren(array($firstChild, $secondChild));
+
+ $this->assertEquals(
+ "Content-Type: multipart/alternative; boundary=\"xxx\"\r\n".
+ "\r\n\r\n--xxx\r\n".
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'PART 1'.
+ "\r\n\r\n--xxx\r\n".
+ "Content-Type: text/plain\r\n".
+ "\r\n".
+ 'PART 2'.
+ "\r\n\r\n--xxx--\r\n",
+ $entity->toString()
+ );
+ }
+
+ public function testUnsettingChildrenRestoresContentType()
+ {
+ $cType = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $child = $this->_createChild(Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE);
+
+ $cType->shouldReceive('setFieldBodyModel')
+ ->twice()
+ ->with('image/jpeg');
+ $cType->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('multipart/alternative');
+ $cType->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes()
+ ->with(\Mockery::not('multipart/alternative', 'image/jpeg'));
+
+ $entity = $this->_createEntity($this->_createHeaderSet(array(
+ 'Content-Type' => $cType,
+ )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $entity->setContentType('image/jpeg');
+ $entity->setChildren(array($child));
+ $entity->setChildren(array());
+ }
+
+ public function testBodyIsReadFromCacheWhenUsingToStringIfPresent()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $cache = $this->_createCache(false);
+ $cache->shouldReceive('hasKey')
+ ->once()
+ ->with(\Mockery::any(), 'body')
+ ->andReturn(true);
+ $cache->shouldReceive('getString')
+ ->once()
+ ->with(\Mockery::any(), 'body')
+ ->andReturn("\r\ncache\r\ncache!");
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $cache
+ );
+
+ $entity->setBody("blah\r\nblah!");
+ $this->assertEquals(
+ "Content-Type: text/plain; charset=utf-8\r\n".
+ "\r\n".
+ "cache\r\ncache!",
+ $entity->toString()
+ );
+ }
+
+ public function testBodyIsAddedToCacheWhenUsingToString()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $cache = $this->_createCache(false);
+ $cache->shouldReceive('hasKey')
+ ->once()
+ ->with(\Mockery::any(), 'body')
+ ->andReturn(false);
+ $cache->shouldReceive('setString')
+ ->once()
+ ->with(\Mockery::any(), 'body', "\r\nblah\r\nblah!", Swift_KeyCache::MODE_WRITE);
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $cache
+ );
+
+ $entity->setBody("blah\r\nblah!");
+ $entity->toString();
+ }
+
+ public function testBodyIsClearedFromCacheIfNewBodySet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $cache = $this->_createCache(false);
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $cache
+ );
+
+ $entity->setBody("blah\r\nblah!");
+ $entity->toString();
+
+ // We set the expectation at this point because we only care what happens when calling setBody()
+ $cache->shouldReceive('clearKey')
+ ->once()
+ ->with(\Mockery::any(), 'body');
+
+ $entity->setBody("new\r\nnew!");
+ }
+
+ public function testBodyIsNotClearedFromCacheIfSameBodySet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $cache = $this->_createCache(false);
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $cache
+ );
+
+ $entity->setBody("blah\r\nblah!");
+ $entity->toString();
+
+ // We set the expectation at this point because we only care what happens when calling setBody()
+ $cache->shouldReceive('clearKey')
+ ->never();
+
+ $entity->setBody("blah\r\nblah!");
+ }
+
+ public function testBodyIsClearedFromCacheIfNewEncoderSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $cache = $this->_createCache(false);
+ $otherEncoder = $this->_createEncoder();
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $cache
+ );
+
+ $entity->setBody("blah\r\nblah!");
+ $entity->toString();
+
+ // We set the expectation at this point because we only care what happens when calling setEncoder()
+ $cache->shouldReceive('clearKey')
+ ->once()
+ ->with(\Mockery::any(), 'body');
+
+ $entity->setEncoder($otherEncoder);
+ }
+
+ public function testBodyIsReadFromCacheWhenUsingToByteStreamIfPresent()
+ {
+ $is = $this->_createInputStream();
+ $cache = $this->_createCache(false);
+ $cache->shouldReceive('hasKey')
+ ->once()
+ ->with(\Mockery::any(), 'body')
+ ->andReturn(true);
+ $cache->shouldReceive('exportToByteStream')
+ ->once()
+ ->with(\Mockery::any(), 'body', $is);
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $cache
+ );
+ $entity->setBody('foo');
+
+ $entity->toByteStream($is);
+ }
+
+ public function testBodyIsAddedToCacheWhenUsingToByteStream()
+ {
+ $is = $this->_createInputStream();
+ $cache = $this->_createCache(false);
+ $cache->shouldReceive('hasKey')
+ ->once()
+ ->with(\Mockery::any(), 'body')
+ ->andReturn(false);
+ $cache->shouldReceive('getInputByteStream')
+ ->once()
+ ->with(\Mockery::any(), 'body');
+
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $cache
+ );
+ $entity->setBody('foo');
+
+ $entity->toByteStream($is);
+ }
+
+ public function testFluidInterface()
+ {
+ $entity = $this->_createEntity($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $this->assertSame($entity,
+ $entity
+ ->setContentType('text/plain')
+ ->setEncoder($this->_createEncoder())
+ ->setId('foo@bar')
+ ->setDescription('my description')
+ ->setMaxLineLength(998)
+ ->setBody('xx')
+ ->setBoundary('xyz')
+ ->setChildren(array())
+ );
+ }
+
+ abstract protected function _createEntity($headers, $encoder, $cache);
+
+ protected function _createChild($level = null, $string = '', $stub = true)
+ {
+ $child = $this->getMockery('Swift_Mime_MimeEntity')->shouldIgnoreMissing();
+ if (isset($level)) {
+ $child->shouldReceive('getNestingLevel')
+ ->zeroOrMoreTimes()
+ ->andReturn($level);
+ }
+ $child->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn($string);
+
+ return $child;
+ }
+
+ protected function _createEncoder($name = 'quoted-printable', $stub = true)
+ {
+ $encoder = $this->getMockBuilder('Swift_Mime_ContentEncoder')->getMock();
+ $encoder->expects($this->any())
+ ->method('getName')
+ ->will($this->returnValue($name));
+ $encoder->expects($this->any())
+ ->method('encodeString')
+ ->will($this->returnCallback(function () {
+ $args = func_get_args();
+
+ return array_shift($args);
+ }));
+
+ return $encoder;
+ }
+
+ protected function _createCache($stub = true)
+ {
+ return $this->getMockery('Swift_KeyCache')->shouldIgnoreMissing();
+ }
+
+ protected function _createHeaderSet($headers = array(), $stub = true)
+ {
+ $set = $this->getMockery('Swift_Mime_HeaderSet')->shouldIgnoreMissing();
+ $set->shouldReceive('get')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function ($key) use ($headers) {
+ return $headers[$key];
+ });
+ $set->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function ($key) use ($headers) {
+ return array_key_exists($key, $headers);
+ });
+
+ return $set;
+ }
+
+ protected function _createHeader($name, $model = null, $params = array(), $stub = true)
+ {
+ $header = $this->getMockery('Swift_Mime_ParameterizedHeader')->shouldIgnoreMissing();
+ $header->shouldReceive('getFieldName')
+ ->zeroOrMoreTimes()
+ ->andReturn($name);
+ $header->shouldReceive('getFieldBodyModel')
+ ->zeroOrMoreTimes()
+ ->andReturn($model);
+ $header->shouldReceive('getParameter')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function ($key) use ($params) {
+ return $params[$key];
+ });
+
+ return $header;
+ }
+
+ protected function _createOutputStream($data = null, $stub = true)
+ {
+ $os = $this->getMockery('Swift_OutputByteStream');
+ if (isset($data)) {
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use ($data) {
+ static $first = true;
+ if (!$first) {
+ return false;
+ }
+
+ $first = false;
+
+ return $data;
+ });
+ $os->shouldReceive('setReadPointer')
+ ->zeroOrMoreTimes();
+ }
+
+ return $os;
+ }
+
+ protected function _createInputStream($stub = true)
+ {
+ return $this->getMockBuilder('Swift_InputByteStream')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php
new file mode 100644
index 0000000..2c1e581
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/AttachmentTest.php
@@ -0,0 +1,318 @@
+<?php
+
+class Swift_Mime_AttachmentTest extends Swift_Mime_AbstractMimeEntityTest
+{
+ public function testNestingLevelIsAttachment()
+ {
+ $attachment = $this->_createAttachment($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(
+ Swift_Mime_MimeEntity::LEVEL_MIXED, $attachment->getNestingLevel()
+ );
+ }
+
+ public function testDispositionIsReturnedFromHeader()
+ {
+ /* -- RFC 2183, 2.1, 2.2.
+ */
+
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment');
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('attachment', $attachment->getDisposition());
+ }
+
+ public function testDispositionIsSetInHeader()
+ {
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array(), false
+ );
+ $disposition->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('inline');
+ $disposition->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $attachment->setDisposition('inline');
+ }
+
+ public function testDispositionIsAddedIfNonePresent()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addParameterizedHeader')
+ ->once()
+ ->with('Content-Disposition', 'inline');
+ $headers->shouldReceive('addParameterizedHeader')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $attachment->setDisposition('inline');
+ }
+
+ public function testDispositionIsAutoDefaultedToAttachment()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addParameterizedHeader')
+ ->once()
+ ->with('Content-Disposition', 'attachment');
+ $headers->shouldReceive('addParameterizedHeader')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ }
+
+ public function testDefaultContentTypeInitializedToOctetStream()
+ {
+ $cType = $this->_createHeader('Content-Type', '',
+ array(), false
+ );
+ $cType->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('application/octet-stream');
+ $cType->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ }
+
+ public function testFilenameIsReturnedFromHeader()
+ {
+ /* -- RFC 2183, 2.3.
+ */
+
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array('filename' => 'foo.txt')
+ );
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('foo.txt', $attachment->getFilename());
+ }
+
+ public function testFilenameIsSetInHeader()
+ {
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array('filename' => 'foo.txt'), false
+ );
+ $disposition->shouldReceive('setParameter')
+ ->once()
+ ->with('filename', 'bar.txt');
+ $disposition->shouldReceive('setParameter')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $attachment->setFilename('bar.txt');
+ }
+
+ public function testSettingFilenameSetsNameInContentType()
+ {
+ /*
+ This is a legacy requirement which isn't covered by up-to-date RFCs.
+ */
+
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array(), false
+ );
+ $cType->shouldReceive('setParameter')
+ ->once()
+ ->with('name', 'bar.txt');
+ $cType->shouldReceive('setParameter')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $attachment->setFilename('bar.txt');
+ }
+
+ public function testSizeIsReturnedFromHeader()
+ {
+ /* -- RFC 2183, 2.7.
+ */
+
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array('size' => 1234)
+ );
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(1234, $attachment->getSize());
+ }
+
+ public function testSizeIsSetInHeader()
+ {
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array(), false
+ );
+ $disposition->shouldReceive('setParameter')
+ ->once()
+ ->with('size', 12345);
+ $disposition->shouldReceive('setParameter')
+ ->zeroOrMoreTimes();
+
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $attachment->setSize(12345);
+ }
+
+ public function testFilnameCanBeReadFromFileStream()
+ {
+ $file = $this->_createFileStream('/bar/file.ext', '');
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array('filename' => 'foo.txt'), false
+ );
+ $disposition->shouldReceive('setParameter')
+ ->once()
+ ->with('filename', 'file.ext');
+
+ $attachment = $this->_createAttachment($this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $attachment->setFile($file);
+ }
+
+ public function testContentTypeCanBeSetViaSetFile()
+ {
+ $file = $this->_createFileStream('/bar/file.ext', '');
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array('filename' => 'foo.txt'), false
+ );
+ $disposition->shouldReceive('setParameter')
+ ->once()
+ ->with('filename', 'file.ext');
+
+ $ctype = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $ctype->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('text/html');
+ $ctype->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $headers = $this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition,
+ 'Content-Type' => $ctype,
+ ));
+
+ $attachment = $this->_createAttachment($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $attachment->setFile($file, 'text/html');
+ }
+
+ public function XtestContentTypeCanBeLookedUpFromCommonListIfNotProvided()
+ {
+ $file = $this->_createFileStream('/bar/file.zip', '');
+ $disposition = $this->_createHeader('Content-Disposition', 'attachment',
+ array('filename' => 'foo.zip'), false
+ );
+ $disposition->shouldReceive('setParameter')
+ ->once()
+ ->with('filename', 'file.zip');
+
+ $ctype = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $ctype->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('application/zip');
+ $ctype->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $headers = $this->_createHeaderSet(array(
+ 'Content-Disposition' => $disposition,
+ 'Content-Type' => $ctype,
+ ));
+
+ $attachment = $this->_createAttachment($headers, $this->_createEncoder(),
+ $this->_createCache(), array('zip' => 'application/zip', 'txt' => 'text/plain')
+ );
+ $attachment->setFile($file);
+ }
+
+ public function testDataCanBeReadFromFile()
+ {
+ $file = $this->_createFileStream('/foo/file.ext', '<some data>');
+ $attachment = $this->_createAttachment($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $attachment->setFile($file);
+ $this->assertEquals('<some data>', $attachment->getBody());
+ }
+
+ public function testFluidInterface()
+ {
+ $attachment = $this->_createAttachment($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertSame($attachment,
+ $attachment
+ ->setContentType('application/pdf')
+ ->setEncoder($this->_createEncoder())
+ ->setId('foo@bar')
+ ->setDescription('my pdf')
+ ->setMaxLineLength(998)
+ ->setBody('xx')
+ ->setBoundary('xyz')
+ ->setChildren(array())
+ ->setDisposition('inline')
+ ->setFilename('afile.txt')
+ ->setSize(123)
+ ->setFile($this->_createFileStream('foo.txt', ''))
+ );
+ }
+
+ protected function _createEntity($headers, $encoder, $cache)
+ {
+ return $this->_createAttachment($headers, $encoder, $cache);
+ }
+
+ protected function _createAttachment($headers, $encoder, $cache, $mimeTypes = array())
+ {
+ return new Swift_Mime_Attachment($headers, $encoder, $cache, new Swift_Mime_Grammar(), $mimeTypes);
+ }
+
+ protected function _createFileStream($path, $data, $stub = true)
+ {
+ $file = $this->getMockery('Swift_FileStream');
+ $file->shouldReceive('getPath')
+ ->zeroOrMoreTimes()
+ ->andReturn($path);
+ $file->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use ($data) {
+ static $first = true;
+ if (!$first) {
+ return false;
+ }
+
+ $first = false;
+
+ return $data;
+ });
+ $file->shouldReceive('setReadPointer')
+ ->zeroOrMoreTimes();
+
+ return $file;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php
new file mode 100644
index 0000000..1571fce
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/Base64ContentEncoderTest.php
@@ -0,0 +1,323 @@
+<?php
+
+class Swift_Mime_ContentEncoder_Base64ContentEncoderTest extends \SwiftMailerTestCase
+{
+ private $_encoder;
+
+ protected function setUp()
+ {
+ $this->_encoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+ }
+
+ public function testNameIsBase64()
+ {
+ $this->assertEquals('base64', $this->_encoder->getName());
+ }
+
+ /*
+ There's really no point in testing the entire base64 encoding to the
+ level QP encoding has been tested. base64_encode() has been in PHP for
+ years.
+ */
+
+ public function testInputOutputRatioIs3to4Bytes()
+ {
+ /*
+ RFC 2045, 6.8
+
+ The encoding process represents 24-bit groups of input bits as output
+ strings of 4 encoded characters. Proceeding from left to right, a
+ 24-bit input group is formed by concatenating 3 8bit input groups.
+ These 24 bits are then treated as 4 concatenated 6-bit groups, each
+ of which is translated into a single digit in the base64 alphabet.
+ */
+
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('123');
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is);
+ $this->assertEquals('MTIz', $collection->content);
+ }
+
+ public function testPadLength()
+ {
+ /*
+ RFC 2045, 6.8
+
+ Special processing is performed if fewer than 24 bits are available
+ at the end of the data being encoded. A full encoding quantum is
+ always completed at the end of a body. When fewer than 24 input bits
+ are available in an input group, zero bits are added (on the right)
+ to form an integral number of 6-bit groups. Padding at the end of
+ the data is performed using the "=" character. Since all base64
+ input is an integral number of octets, only the following cases can
+ arise: (1) the final quantum of encoding input is an integral
+ multiple of 24 bits; here, the final unit of encoded output will be
+ an integral multiple of 4 characters with no "=" padding, (2) the
+ final quantum of encoding input is exactly 8 bits; here, the final
+ unit of encoded output will be two characters followed by two "="
+ padding characters, or (3) the final quantum of encoding input is
+ exactly 16 bits; here, the final unit of encoded output will be three
+ characters followed by one "=" padding character.
+ */
+
+ for ($i = 0; $i < 30; ++$i) {
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn(pack('C', rand(0, 255)));
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is);
+ $this->assertRegExp('~^[a-zA-Z0-9/\+]{2}==$~', $collection->content,
+ '%s: A single byte should have 2 bytes of padding'
+ );
+ }
+
+ for ($i = 0; $i < 30; ++$i) {
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn(pack('C*', rand(0, 255), rand(0, 255)));
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is);
+ $this->assertRegExp('~^[a-zA-Z0-9/\+]{3}=$~', $collection->content,
+ '%s: Two bytes should have 1 byte of padding'
+ );
+ }
+
+ for ($i = 0; $i < 30; ++$i) {
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn(pack('C*', rand(0, 255), rand(0, 255), rand(0, 255)));
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is);
+ $this->assertRegExp('~^[a-zA-Z0-9/\+]{4}$~', $collection->content,
+ '%s: Three bytes should have no padding'
+ );
+ }
+ }
+
+ public function testMaximumLineLengthIs76Characters()
+ {
+ /*
+ The encoded output stream must be represented in lines of no more
+ than 76 characters each. All line breaks or other characters not
+ found in Table 1 must be ignored by decoding software.
+ */
+
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //12
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('mnopqrstuvwx'); //24
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('yzabc1234567'); //36
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('890ABCDEFGHI'); //48
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('JKLMNOPQRSTU'); //60
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('VWXYZ1234567'); //72
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //84
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is);
+ $this->assertEquals(
+ "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3ODkwQUJDREVGR0hJSktMTU5PUFFS\r\n".
+ 'U1RVVldYWVoxMjM0NTY3YWJjZGVmZ2hpamts',
+ $collection->content
+ );
+ }
+
+ public function testMaximumLineLengthCanBeDifferent()
+ {
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //12
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('mnopqrstuvwx'); //24
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('yzabc1234567'); //36
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('890ABCDEFGHI'); //48
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('JKLMNOPQRSTU'); //60
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('VWXYZ1234567'); //72
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //84
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is, 0, 50);
+ $this->assertEquals(
+ "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3OD\r\n".
+ "kwQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3YWJj\r\n".
+ 'ZGVmZ2hpamts',
+ $collection->content
+ );
+ }
+
+ public function testMaximumLineLengthIsNeverMoreThan76Chars()
+ {
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //12
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('mnopqrstuvwx'); //24
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('yzabc1234567'); //36
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('890ABCDEFGHI'); //48
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('JKLMNOPQRSTU'); //60
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('VWXYZ1234567'); //72
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //84
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is, 0, 100);
+ $this->assertEquals(
+ "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3ODkwQUJDREVGR0hJSktMTU5PUFFS\r\n".
+ 'U1RVVldYWVoxMjM0NTY3YWJjZGVmZ2hpamts',
+ $collection->content
+ );
+ }
+
+ public function testFirstLineLengthCanBeDifferent()
+ {
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //12
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('mnopqrstuvwx'); //24
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('yzabc1234567'); //36
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('890ABCDEFGHI'); //48
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('JKLMNOPQRSTU'); //60
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('VWXYZ1234567'); //72
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('abcdefghijkl'); //84
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_encoder->encodeByteStream($os, $is, 19);
+ $this->assertEquals(
+ "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMxMjM0NTY3ODkwQUJDR\r\n".
+ 'EVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3YWJjZGVmZ2hpamts',
+ $collection->content
+ );
+ }
+
+ private function _createOutputByteStream($stub = false)
+ {
+ return $this->getMockery('Swift_OutputByteStream')->shouldIgnoreMissing();
+ }
+
+ private function _createInputByteStream($stub = false)
+ {
+ return $this->getMockery('Swift_InputByteStream')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php
new file mode 100644
index 0000000..ca44e11
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/PlainContentEncoderTest.php
@@ -0,0 +1,171 @@
+<?php
+
+class Swift_Mime_ContentEncoder_PlainContentEncoderTest extends \SwiftMailerTestCase
+{
+ public function testNameCanBeSpecifiedInConstructor()
+ {
+ $encoder = $this->_getEncoder('7bit');
+ $this->assertEquals('7bit', $encoder->getName());
+
+ $encoder = $this->_getEncoder('8bit');
+ $this->assertEquals('8bit', $encoder->getName());
+ }
+
+ public function testNoOctetsAreModifiedInString()
+ {
+ $encoder = $this->_getEncoder('7bit');
+ foreach (range(0x00, 0xFF) as $octet) {
+ $byte = pack('C', $octet);
+ $this->assertIdenticalBinary($byte, $encoder->encodeString($byte));
+ }
+ }
+
+ public function testNoOctetsAreModifiedInByteStream()
+ {
+ $encoder = $this->_getEncoder('7bit');
+ foreach (range(0x00, 0xFF) as $octet) {
+ $byte = pack('C', $octet);
+
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn($byte);
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder->encodeByteStream($os, $is);
+ $this->assertIdenticalBinary($byte, $collection->content);
+ }
+ }
+
+ public function testLineLengthCanBeSpecified()
+ {
+ $encoder = $this->_getEncoder('7bit');
+
+ $chars = array();
+ for ($i = 0; $i < 50; ++$i) {
+ $chars[] = 'a';
+ }
+ $input = implode(' ', $chars); //99 chars long
+
+ $this->assertEquals(
+ 'a a a a a a a a a a a a a a a a a a a a a a a a a '."\r\n".//50 *
+ 'a a a a a a a a a a a a a a a a a a a a a a a a a', //99
+ $encoder->encodeString($input, 0, 50),
+ '%s: Lines should be wrapped at 50 chars'
+ );
+ }
+
+ public function testLineLengthCanBeSpecifiedInByteStream()
+ {
+ $encoder = $this->_getEncoder('7bit');
+
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+
+ for ($i = 0; $i < 50; ++$i) {
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('a ');
+ }
+
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder->encodeByteStream($os, $is, 0, 50);
+ $this->assertEquals(
+ str_repeat('a ', 25)."\r\n".str_repeat('a ', 25),
+ $collection->content
+ );
+ }
+
+ public function testencodeStringGeneratesCorrectCrlf()
+ {
+ $encoder = $this->_getEncoder('7bit', true);
+ $this->assertEquals("a\r\nb", $encoder->encodeString("a\rb"),
+ '%s: Line endings should be standardized'
+ );
+ $this->assertEquals("a\r\nb", $encoder->encodeString("a\nb"),
+ '%s: Line endings should be standardized'
+ );
+ $this->assertEquals("a\r\n\r\nb", $encoder->encodeString("a\n\rb"),
+ '%s: Line endings should be standardized'
+ );
+ $this->assertEquals("a\r\n\r\nb", $encoder->encodeString("a\r\rb"),
+ '%s: Line endings should be standardized'
+ );
+ $this->assertEquals("a\r\n\r\nb", $encoder->encodeString("a\n\nb"),
+ '%s: Line endings should be standardized'
+ );
+ }
+
+ public function crlfProvider()
+ {
+ return array(
+ array("\r", "a\r\nb"),
+ array("\n", "a\r\nb"),
+ array("\n\r", "a\r\n\r\nb"),
+ array("\n\n", "a\r\n\r\nb"),
+ array("\r\r", "a\r\n\r\nb"),
+ );
+ }
+
+ /**
+ * @dataProvider crlfProvider
+ */
+ public function testCanonicEncodeByteStreamGeneratesCorrectCrlf($test, $expected)
+ {
+ $encoder = $this->_getEncoder('7bit', true);
+
+ $os = $this->_createOutputByteStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('a');
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn($test);
+ $os->shouldReceive('read')
+ ->once()
+ ->andReturn('b');
+ $os->shouldReceive('read')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder->encodeByteStream($os, $is);
+ $this->assertEquals($expected, $collection->content);
+ }
+
+ private function _getEncoder($name, $canonical = false)
+ {
+ return new Swift_Mime_ContentEncoder_PlainContentEncoder($name, $canonical);
+ }
+
+ private function _createOutputByteStream($stub = false)
+ {
+ return $this->getMockery('Swift_OutputByteStream')->shouldIgnoreMissing();
+ }
+
+ private function _createInputByteStream($stub = false)
+ {
+ return $this->getMockery('Swift_InputByteStream')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php
new file mode 100644
index 0000000..7762bbe
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/ContentEncoder/QpContentEncoderTest.php
@@ -0,0 +1,516 @@
+<?php
+
+class Swift_Mime_ContentEncoder_QpContentEncoderTest extends \SwiftMailerTestCase
+{
+ public function testNameIsQuotedPrintable()
+ {
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder(
+ $this->_createCharacterStream(true)
+ );
+ $this->assertEquals('quoted-printable', $encoder->getName());
+ }
+
+ /* -- RFC 2045, 6.7 --
+ (1) (General 8bit representation) Any octet, except a CR or
+ LF that is part of a CRLF line break of the canonical
+ (standard) form of the data being encoded, may be
+ represented by an "=" followed by a two digit
+ hexadecimal representation of the octet's value. The
+ digits of the hexadecimal alphabet, for this purpose,
+ are "0123456789ABCDEF". Uppercase letters must be
+ used; lowercase letters are not allowed. Thus, for
+ example, the decimal value 12 (US-ASCII form feed) can
+ be represented by "=0C", and the decimal value 61 (US-
+ ASCII EQUAL SIGN) can be represented by "=3D". This
+ rule must be followed except when the following rules
+ allow an alternative encoding.
+ */
+
+ public function testPermittedCharactersAreNotEncoded()
+ {
+ /* -- RFC 2045, 6.7 --
+ (2) (Literal representation) Octets with decimal values of
+ 33 through 60 inclusive, and 62 through 126, inclusive,
+ MAY be represented as the US-ASCII characters which
+ correspond to those octets (EXCLAMATION POINT through
+ LESS THAN, and GREATER THAN through TILDE,
+ respectively).
+ */
+
+ foreach (array_merge(range(33, 60), range(62, 126)) as $ordinal) {
+ $char = chr($ordinal);
+
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($ordinal));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+ $this->assertIdenticalBinary($char, $collection->content);
+ }
+ }
+
+ public function testLinearWhiteSpaceAtLineEndingIsEncoded()
+ {
+ /* -- RFC 2045, 6.7 --
+ (3) (White Space) Octets with values of 9 and 32 MAY be
+ represented as US-ASCII TAB (HT) and SPACE characters,
+ respectively, but MUST NOT be so represented at the end
+ of an encoded line. Any TAB (HT) or SPACE characters
+ on an encoded line MUST thus be followed on that line
+ by a printable character. In particular, an "=" at the
+ end of an encoded line, indicating a soft line break
+ (see rule #5) may follow one or more TAB (HT) or SPACE
+ characters. It follows that an octet with decimal
+ value 9 or 32 appearing at the end of an encoded line
+ must be represented according to Rule #1. This rule is
+ necessary because some MTAs (Message Transport Agents,
+ programs which transport messages from one user to
+ another, or perform a portion of such transfers) are
+ known to pad lines of text with SPACEs, and others are
+ known to remove "white space" characters from the end
+ of a line. Therefore, when decoding a Quoted-Printable
+ body, any trailing white space on a line must be
+ deleted, as it will necessarily have been added by
+ intermediate transport agents.
+ */
+
+ $HT = chr(0x09); //9
+ $SPACE = chr(0x20); //32
+
+ //HT
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x09));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x09));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+
+ $this->assertEquals("a\t=09\r\nb", $collection->content);
+
+ //SPACE
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x20));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x20));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+
+ $this->assertEquals("a =20\r\nb", $collection->content);
+ }
+
+ public function testCRLFIsLeftAlone()
+ {
+ /*
+ (4) (Line Breaks) A line break in a text body, represented
+ as a CRLF sequence in the text canonical form, must be
+ represented by a (RFC 822) line break, which is also a
+ CRLF sequence, in the Quoted-Printable encoding. Since
+ the canonical representation of media types other than
+ text do not generally include the representation of
+ line breaks as CRLF sequences, no hard line breaks
+ (i.e. line breaks that are intended to be meaningful
+ and to be displayed to the user) can occur in the
+ quoted-printable encoding of such types. Sequences
+ like "=0D", "=0A", "=0A=0D" and "=0D=0A" will routinely
+ appear in non-text data represented in quoted-
+ printable, of course.
+
+ Note that many implementations may elect to encode the
+ local representation of various content types directly
+ rather than converting to canonical form first,
+ encoding, and then converting back to local
+ representation. In particular, this may apply to plain
+ text material on systems that use newline conventions
+ other than a CRLF terminator sequence. Such an
+ implementation optimization is permissible, but only
+ when the combined canonicalization-encoding step is
+ equivalent to performing the three steps separately.
+ */
+
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('c')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0D));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x0A));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+ $this->assertEquals("a\r\nb\r\nc\r\n", $collection->content);
+ }
+
+ public function testLinesLongerThan76CharactersAreSoftBroken()
+ {
+ /*
+ (5) (Soft Line Breaks) The Quoted-Printable encoding
+ REQUIRES that encoded lines be no more than 76
+ characters long. If longer lines are to be encoded
+ with the Quoted-Printable encoding, "soft" line breaks
+ must be used. An equal sign as the last character on a
+ encoded line indicates such a non-significant ("soft")
+ line break in the encoded text.
+ */
+
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+
+ for ($seq = 0; $seq <= 140; ++$seq) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ }
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+ $this->assertEquals(str_repeat('a', 75)."=\r\n".str_repeat('a', 66), $collection->content);
+ }
+
+ public function testMaxLineLengthCanBeSpecified()
+ {
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+
+ for ($seq = 0; $seq <= 100; ++$seq) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ }
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is, 0, 54);
+ $this->assertEquals(str_repeat('a', 53)."=\r\n".str_repeat('a', 48), $collection->content);
+ }
+
+ public function testBytesBelowPermittedRangeAreEncoded()
+ {
+ /*
+ According to Rule (1 & 2)
+ */
+
+ foreach (range(0, 32) as $ordinal) {
+ $char = chr($ordinal);
+
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($ordinal));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+ $this->assertEquals(sprintf('=%02X', $ordinal), $collection->content);
+ }
+ }
+
+ public function testDecimalByte61IsEncoded()
+ {
+ /*
+ According to Rule (1 & 2)
+ */
+
+ $char = chr(61);
+
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(61));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+ $this->assertEquals(sprintf('=%02X', 61), $collection->content);
+ }
+
+ public function testBytesAbovePermittedRangeAreEncoded()
+ {
+ /*
+ According to Rule (1 & 2)
+ */
+
+ foreach (range(127, 255) as $ordinal) {
+ $char = chr($ordinal);
+
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($ordinal));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is);
+ $this->assertEquals(sprintf('=%02X', $ordinal), $collection->content);
+ }
+ }
+
+ public function testFirstLineLengthCanBeDifferent()
+ {
+ $os = $this->_createOutputByteStream(true);
+ $charStream = $this->_createCharacterStream();
+ $is = $this->_createInputByteStream();
+ $collection = new Swift_StreamCollector();
+
+ $is->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing($collection);
+ $charStream->shouldReceive('flushContents')
+ ->once();
+ $charStream->shouldReceive('importByteStream')
+ ->once()
+ ->with($os);
+
+ for ($seq = 0; $seq <= 140; ++$seq) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ }
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ $encoder->encodeByteStream($os, $is, 22);
+ $this->assertEquals(
+ str_repeat('a', 53)."=\r\n".str_repeat('a', 75)."=\r\n".str_repeat('a', 13),
+ $collection->content
+ );
+ }
+
+ public function testObserverInterfaceCanChangeCharset()
+ {
+ $stream = $this->_createCharacterStream();
+ $stream->shouldReceive('setCharacterSet')
+ ->once()
+ ->with('windows-1252');
+
+ $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($stream);
+ $encoder->charsetChanged('windows-1252');
+ }
+
+ public function testTextIsPreWrapped()
+ {
+ $encoder = $this->createEncoder();
+
+ $input = str_repeat('a', 70)."\r\n".
+ str_repeat('a', 70)."\r\n".
+ str_repeat('a', 70);
+
+ $os = new Swift_ByteStream_ArrayByteStream();
+ $is = new Swift_ByteStream_ArrayByteStream();
+ $is->write($input);
+
+ $encoder->encodeByteStream($is, $os);
+
+ $this->assertEquals(
+ $input, $os->read(PHP_INT_MAX)
+ );
+ }
+
+ private function _createCharacterStream($stub = false)
+ {
+ return $this->getMockery('Swift_CharacterStream')->shouldIgnoreMissing();
+ }
+
+ private function createEncoder()
+ {
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $charStream = new Swift_CharacterStream_NgCharacterStream($factory, 'utf-8');
+
+ return new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
+ }
+
+ private function _createOutputByteStream($stub = false)
+ {
+ return $this->getMockery('Swift_OutputByteStream')->shouldIgnoreMissing();
+ }
+
+ private function _createInputByteStream($stub = false)
+ {
+ return $this->getMockery('Swift_InputByteStream')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php
new file mode 100644
index 0000000..3a1fc51
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/EmbeddedFileTest.php
@@ -0,0 +1,55 @@
+<?php
+
+class Swift_Mime_EmbeddedFileTest extends Swift_Mime_AttachmentTest
+{
+ public function testNestingLevelIsAttachment()
+ {
+ //Overridden
+ }
+
+ public function testNestingLevelIsEmbedded()
+ {
+ $file = $this->_createEmbeddedFile($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(
+ Swift_Mime_MimeEntity::LEVEL_RELATED, $file->getNestingLevel()
+ );
+ }
+
+ public function testIdIsAutoGenerated()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addIdHeader')
+ ->once()
+ ->with('Content-ID', '/^.*?@.*?$/D');
+
+ $file = $this->_createEmbeddedFile($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ }
+
+ public function testDefaultDispositionIsInline()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addParameterizedHeader')
+ ->once()
+ ->with('Content-Disposition', 'inline');
+ $headers->shouldReceive('addParameterizedHeader')
+ ->zeroOrMoreTimes();
+
+ $file = $this->_createEmbeddedFile($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ }
+
+ protected function _createAttachment($headers, $encoder, $cache, $mimeTypes = array())
+ {
+ return $this->_createEmbeddedFile($headers, $encoder, $cache, $mimeTypes);
+ }
+
+ private function _createEmbeddedFile($headers, $encoder, $cache)
+ {
+ return new Swift_Mime_EmbeddedFile($headers, $encoder, $cache, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php
new file mode 100644
index 0000000..3580155
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/Base64HeaderEncoderTest.php
@@ -0,0 +1,13 @@
+<?php
+
+class Swift_Mime_HeaderEncoder_Base64HeaderEncoderTest extends \PHPUnit_Framework_TestCase
+{
+ //Most tests are already covered in Base64EncoderTest since this subclass only
+ // adds a getName() method
+
+ public function testNameIsB()
+ {
+ $encoder = new Swift_Mime_HeaderEncoder_Base64HeaderEncoder();
+ $this->assertEquals('B', $encoder->getName());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php
new file mode 100644
index 0000000..b5a10fe
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/HeaderEncoder/QpHeaderEncoderTest.php
@@ -0,0 +1,221 @@
+<?php
+
+class Swift_Mime_HeaderEncoder_QpHeaderEncoderTest extends \SwiftMailerTestCase
+{
+ //Most tests are already covered in QpEncoderTest since this subclass only
+ // adds a getName() method
+
+ public function testNameIsQ()
+ {
+ $encoder = $this->_createEncoder(
+ $this->_createCharacterStream(true)
+ );
+ $this->assertEquals('Q', $encoder->getName());
+ }
+
+ public function testSpaceAndTabNeverAppear()
+ {
+ /* -- RFC 2047, 4.
+ Only a subset of the printable ASCII characters may be used in
+ 'encoded-text'. Space and tab characters are not allowed, so that
+ the beginning and end of an 'encoded-word' are obvious.
+ */
+
+ $charStream = $this->_createCharacterStream();
+ $charStream->shouldReceive('readBytes')
+ ->atLeast()->times(6)
+ ->andReturn(array(ord('a')), array(0x20), array(0x09), array(0x20), array(ord('b')), false);
+
+ $encoder = $this->_createEncoder($charStream);
+ $this->assertNotRegExp('~[ \t]~', $encoder->encodeString("a \t b"),
+ '%s: encoded-words in headers cannot contain LWSP as per RFC 2047.'
+ );
+ }
+
+ public function testSpaceIsRepresentedByUnderscore()
+ {
+ /* -- RFC 2047, 4.2.
+ (2) The 8-bit hexadecimal value 20 (e.g., ISO-8859-1 SPACE) may be
+ represented as "_" (underscore, ASCII 95.). (This character may
+ not pass through some internetwork mail gateways, but its use
+ will greatly enhance readability of "Q" encoded data with mail
+ readers that do not support this encoding.) Note that the "_"
+ always represents hexadecimal 20, even if the SPACE character
+ occupies a different code position in the character set in use.
+ */
+ $charStream = $this->_createCharacterStream();
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(0x20));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('b')));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = $this->_createEncoder($charStream);
+ $this->assertEquals('a_b', $encoder->encodeString('a b'),
+ '%s: Spaces can be represented by more readable underscores as per RFC 2047.'
+ );
+ }
+
+ public function testEqualsAndQuestionAndUnderscoreAreEncoded()
+ {
+ /* -- RFC 2047, 4.2.
+ (3) 8-bit values which correspond to printable ASCII characters other
+ than "=", "?", and "_" (underscore), MAY be represented as those
+ characters. (But see section 5 for restrictions.) In
+ particular, SPACE and TAB MUST NOT be represented as themselves
+ within encoded words.
+ */
+ $charStream = $this->_createCharacterStream();
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('=')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('?')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('_')));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = $this->_createEncoder($charStream);
+ $this->assertEquals('=3D=3F=5F', $encoder->encodeString('=?_'),
+ '%s: Chars =, ? and _ (underscore) may not appear as per RFC 2047.'
+ );
+ }
+
+ public function testParensAndQuotesAreEncoded()
+ {
+ /* -- RFC 2047, 5 (2).
+ A "Q"-encoded 'encoded-word' which appears in a 'comment' MUST NOT
+ contain the characters "(", ")" or "
+ */
+
+ $charStream = $this->_createCharacterStream();
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('(')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('"')));
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord(')')));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = $this->_createEncoder($charStream);
+ $this->assertEquals('=28=22=29', $encoder->encodeString('(")'),
+ '%s: Chars (, " (DQUOTE) and ) may not appear as per RFC 2047.'
+ );
+ }
+
+ public function testOnlyCharactersAllowedInPhrasesAreUsed()
+ {
+ /* -- RFC 2047, 5.
+ (3) As a replacement for a 'word' entity within a 'phrase', for example,
+ one that precedes an address in a From, To, or Cc header. The ABNF
+ definition for 'phrase' from RFC 822 thus becomes:
+
+ phrase = 1*( encoded-word / word )
+
+ In this case the set of characters that may be used in a "Q"-encoded
+ 'encoded-word' is restricted to: <upper and lower case ASCII
+ letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_"
+ (underscore, ASCII 95.)>. An 'encoded-word' that appears within a
+ 'phrase' MUST be separated from any adjacent 'word', 'text' or
+ 'special' by 'linear-white-space'.
+ */
+
+ $allowedBytes = array_merge(
+ range(ord('a'), ord('z')), range(ord('A'), ord('Z')),
+ range(ord('0'), ord('9')),
+ array(ord('!'), ord('*'), ord('+'), ord('-'), ord('/'))
+ );
+
+ foreach (range(0x00, 0xFF) as $byte) {
+ $char = pack('C', $byte);
+
+ $charStream = $this->_createCharacterStream();
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array($byte));
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = $this->_createEncoder($charStream);
+ $encodedChar = $encoder->encodeString($char);
+
+ if (in_array($byte, $allowedBytes)) {
+ $this->assertEquals($char, $encodedChar,
+ '%s: Character '.$char.' should not be encoded.'
+ );
+ } elseif (0x20 == $byte) {
+ //Special case
+ $this->assertEquals('_', $encodedChar,
+ '%s: Space character should be replaced.'
+ );
+ } else {
+ $this->assertEquals(sprintf('=%02X', $byte), $encodedChar,
+ '%s: Byte '.$byte.' should be encoded.'
+ );
+ }
+ }
+ }
+
+ public function testEqualsNeverAppearsAtEndOfLine()
+ {
+ /* -- RFC 2047, 5 (3).
+ The 'encoded-text' in an 'encoded-word' must be self-contained;
+ 'encoded-text' MUST NOT be continued from one 'encoded-word' to
+ another. This implies that the 'encoded-text' portion of a "B"
+ 'encoded-word' will be a multiple of 4 characters long; for a "Q"
+ 'encoded-word', any "=" character that appears in the 'encoded-text'
+ portion will be followed by two hexadecimal characters.
+ */
+
+ $input = str_repeat('a', 140);
+
+ $charStream = $this->_createCharacterStream();
+
+ $output = '';
+ $seq = 0;
+ for (; $seq < 140; ++$seq) {
+ $charStream->shouldReceive('readBytes')
+ ->once()
+ ->andReturn(array(ord('a')));
+
+ if (75 == $seq) {
+ $output .= "\r\n"; // =\r\n
+ }
+ $output .= 'a';
+ }
+
+ $charStream->shouldReceive('readBytes')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $encoder = $this->_createEncoder($charStream);
+ $this->assertEquals($output, $encoder->encodeString($input));
+ }
+
+ private function _createEncoder($charStream)
+ {
+ return new Swift_Mime_HeaderEncoder_QpHeaderEncoder($charStream);
+ }
+
+ private function _createCharacterStream($stub = false)
+ {
+ return $this->getMockery('Swift_CharacterStream')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php
new file mode 100644
index 0000000..1822ea6
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/DateHeaderTest.php
@@ -0,0 +1,69 @@
+<?php
+
+class Swift_Mime_Headers_DateHeaderTest extends \PHPUnit_Framework_TestCase
+{
+ /* --
+ The following tests refer to RFC 2822, section 3.6.1 and 3.3.
+ */
+
+ public function testTypeIsDateHeader()
+ {
+ $header = $this->_getHeader('Date');
+ $this->assertEquals(Swift_Mime_Header::TYPE_DATE, $header->getFieldType());
+ }
+
+ public function testGetTimestamp()
+ {
+ $timestamp = time();
+ $header = $this->_getHeader('Date');
+ $header->setTimestamp($timestamp);
+ $this->assertSame($timestamp, $header->getTimestamp());
+ }
+
+ public function testTimestampCanBeSetBySetter()
+ {
+ $timestamp = time();
+ $header = $this->_getHeader('Date');
+ $header->setTimestamp($timestamp);
+ $this->assertSame($timestamp, $header->getTimestamp());
+ }
+
+ public function testIntegerTimestampIsConvertedToRfc2822Date()
+ {
+ $timestamp = time();
+ $header = $this->_getHeader('Date');
+ $header->setTimestamp($timestamp);
+ $this->assertEquals(date('r', $timestamp), $header->getFieldBody());
+ }
+
+ public function testSetBodyModel()
+ {
+ $timestamp = time();
+ $header = $this->_getHeader('Date');
+ $header->setFieldBodyModel($timestamp);
+ $this->assertEquals(date('r', $timestamp), $header->getFieldBody());
+ }
+
+ public function testGetBodyModel()
+ {
+ $timestamp = time();
+ $header = $this->_getHeader('Date');
+ $header->setTimestamp($timestamp);
+ $this->assertEquals($timestamp, $header->getFieldBodyModel());
+ }
+
+ public function testToString()
+ {
+ $timestamp = time();
+ $header = $this->_getHeader('Date');
+ $header->setTimestamp($timestamp);
+ $this->assertEquals('Date: '.date('r', $timestamp)."\r\n",
+ $header->toString()
+ );
+ }
+
+ private function _getHeader($name)
+ {
+ return new Swift_Mime_Headers_DateHeader($name, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php
new file mode 100644
index 0000000..93b3f60
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/IdentificationHeaderTest.php
@@ -0,0 +1,189 @@
+<?php
+
+class Swift_Mime_Headers_IdentificationHeaderTest extends \PHPUnit_Framework_TestCase
+{
+ public function testTypeIsIdHeader()
+ {
+ $header = $this->_getHeader('Message-ID');
+ $this->assertEquals(Swift_Mime_Header::TYPE_ID, $header->getFieldType());
+ }
+
+ public function testValueMatchesMsgIdSpec()
+ {
+ /* -- RFC 2822, 3.6.4.
+ message-id = "Message-ID:" msg-id CRLF
+
+ in-reply-to = "In-Reply-To:" 1*msg-id CRLF
+
+ references = "References:" 1*msg-id CRLF
+
+ msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
+
+ id-left = dot-atom-text / no-fold-quote / obs-id-left
+
+ id-right = dot-atom-text / no-fold-literal / obs-id-right
+
+ no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE
+
+ no-fold-literal = "[" *(dtext / quoted-pair) "]"
+ */
+
+ $header = $this->_getHeader('Message-ID');
+ $header->setId('id-left@id-right');
+ $this->assertEquals('<id-left@id-right>', $header->getFieldBody());
+ }
+
+ public function testIdCanBeRetrievedVerbatim()
+ {
+ $header = $this->_getHeader('Message-ID');
+ $header->setId('id-left@id-right');
+ $this->assertEquals('id-left@id-right', $header->getId());
+ }
+
+ public function testMultipleIdsCanBeSet()
+ {
+ $header = $this->_getHeader('References');
+ $header->setIds(array('a@b', 'x@y'));
+ $this->assertEquals(array('a@b', 'x@y'), $header->getIds());
+ }
+
+ public function testSettingMultipleIdsProducesAListValue()
+ {
+ /* -- RFC 2822, 3.6.4.
+ The "References:" and "In-Reply-To:" field each contain one or more
+ unique message identifiers, optionally separated by CFWS.
+
+ .. SNIP ..
+
+ in-reply-to = "In-Reply-To:" 1*msg-id CRLF
+
+ references = "References:" 1*msg-id CRLF
+ */
+
+ $header = $this->_getHeader('References');
+ $header->setIds(array('a@b', 'x@y'));
+ $this->assertEquals('<a@b> <x@y>', $header->getFieldBody());
+ }
+
+ public function testIdLeftCanBeQuoted()
+ {
+ /* -- RFC 2822, 3.6.4.
+ id-left = dot-atom-text / no-fold-quote / obs-id-left
+ */
+
+ $header = $this->_getHeader('References');
+ $header->setId('"ab"@c');
+ $this->assertEquals('"ab"@c', $header->getId());
+ $this->assertEquals('<"ab"@c>', $header->getFieldBody());
+ }
+
+ public function testIdLeftCanContainAnglesAsQuotedPairs()
+ {
+ /* -- RFC 2822, 3.6.4.
+ no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE
+ */
+
+ $header = $this->_getHeader('References');
+ $header->setId('"a\\<\\>b"@c');
+ $this->assertEquals('"a\\<\\>b"@c', $header->getId());
+ $this->assertEquals('<"a\\<\\>b"@c>', $header->getFieldBody());
+ }
+
+ public function testIdLeftCanBeDotAtom()
+ {
+ $header = $this->_getHeader('References');
+ $header->setId('a.b+&%$.c@d');
+ $this->assertEquals('a.b+&%$.c@d', $header->getId());
+ $this->assertEquals('<a.b+&%$.c@d>', $header->getFieldBody());
+ }
+
+ public function testInvalidIdLeftThrowsException()
+ {
+ try {
+ $header = $this->_getHeader('References');
+ $header->setId('a b c@d');
+ $this->fail(
+ 'Exception should be thrown since "a b c" is not valid id-left.'
+ );
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testIdRightCanBeDotAtom()
+ {
+ /* -- RFC 2822, 3.6.4.
+ id-right = dot-atom-text / no-fold-literal / obs-id-right
+ */
+
+ $header = $this->_getHeader('References');
+ $header->setId('a@b.c+&%$.d');
+ $this->assertEquals('a@b.c+&%$.d', $header->getId());
+ $this->assertEquals('<a@b.c+&%$.d>', $header->getFieldBody());
+ }
+
+ public function testIdRightCanBeLiteral()
+ {
+ /* -- RFC 2822, 3.6.4.
+ no-fold-literal = "[" *(dtext / quoted-pair) "]"
+ */
+
+ $header = $this->_getHeader('References');
+ $header->setId('a@[1.2.3.4]');
+ $this->assertEquals('a@[1.2.3.4]', $header->getId());
+ $this->assertEquals('<a@[1.2.3.4]>', $header->getFieldBody());
+ }
+
+ public function testInvalidIdRightThrowsException()
+ {
+ try {
+ $header = $this->_getHeader('References');
+ $header->setId('a@b c d');
+ $this->fail(
+ 'Exception should be thrown since "b c d" is not valid id-right.'
+ );
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testMissingAtSignThrowsException()
+ {
+ /* -- RFC 2822, 3.6.4.
+ msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
+ */
+
+ try {
+ $header = $this->_getHeader('References');
+ $header->setId('abc');
+ $this->fail(
+ 'Exception should be thrown since "abc" is does not contain @.'
+ );
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testSetBodyModel()
+ {
+ $header = $this->_getHeader('Message-ID');
+ $header->setFieldBodyModel('a@b');
+ $this->assertEquals(array('a@b'), $header->getIds());
+ }
+
+ public function testGetBodyModel()
+ {
+ $header = $this->_getHeader('Message-ID');
+ $header->setId('a@b');
+ $this->assertEquals(array('a@b'), $header->getFieldBodyModel());
+ }
+
+ public function testStringValue()
+ {
+ $header = $this->_getHeader('References');
+ $header->setIds(array('a@b', 'x@y'));
+ $this->assertEquals('References: <a@b> <x@y>'."\r\n", $header->toString());
+ }
+
+ private function _getHeader($name)
+ {
+ return new Swift_Mime_Headers_IdentificationHeader($name, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php
new file mode 100644
index 0000000..0713ff4
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/MailboxHeaderTest.php
@@ -0,0 +1,327 @@
+<?php
+
+class Swift_Mime_Headers_MailboxHeaderTest extends \SwiftMailerTestCase
+{
+ /* -- RFC 2822, 3.6.2 for all tests.
+ */
+
+ private $_charset = 'utf-8';
+
+ public function testTypeIsMailboxHeader()
+ {
+ $header = $this->_getHeader('To', $this->_getEncoder('Q', true));
+ $this->assertEquals(Swift_Mime_Header::TYPE_MAILBOX, $header->getFieldType());
+ }
+
+ public function testMailboxIsSetForAddress()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setAddresses('chris@swiftmailer.org');
+ $this->assertEquals(array('chris@swiftmailer.org'),
+ $header->getNameAddressStrings()
+ );
+ }
+
+ public function testMailboxIsRenderedForNameAddress()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array('chris@swiftmailer.org' => 'Chris Corbyn'));
+ $this->assertEquals(
+ array('Chris Corbyn <chris@swiftmailer.org>'), $header->getNameAddressStrings()
+ );
+ }
+
+ public function testAddressCanBeReturnedForAddress()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setAddresses('chris@swiftmailer.org');
+ $this->assertEquals(array('chris@swiftmailer.org'), $header->getAddresses());
+ }
+
+ public function testAddressCanBeReturnedForNameAddress()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array('chris@swiftmailer.org' => 'Chris Corbyn'));
+ $this->assertEquals(array('chris@swiftmailer.org'), $header->getAddresses());
+ }
+
+ public function testQuotesInNameAreQuoted()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn, "DHE"',
+ ));
+ $this->assertEquals(
+ array('"Chris Corbyn, \"DHE\"" <chris@swiftmailer.org>'),
+ $header->getNameAddressStrings()
+ );
+ }
+
+ public function testEscapeCharsInNameAreQuoted()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn, \\escaped\\',
+ ));
+ $this->assertEquals(
+ array('"Chris Corbyn, \\\\escaped\\\\" <chris@swiftmailer.org>'),
+ $header->getNameAddressStrings()
+ );
+ }
+
+ public function testGetMailboxesReturnsNameValuePairs()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn, DHE',
+ ));
+ $this->assertEquals(
+ array('chris@swiftmailer.org' => 'Chris Corbyn, DHE'), $header->getNameAddresses()
+ );
+ }
+
+ public function testMultipleAddressesCanBeSetAndFetched()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setAddresses(array(
+ 'chris@swiftmailer.org', 'mark@swiftmailer.org',
+ ));
+ $this->assertEquals(
+ array('chris@swiftmailer.org', 'mark@swiftmailer.org'),
+ $header->getAddresses()
+ );
+ }
+
+ public function testMultipleAddressesAsMailboxes()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setAddresses(array(
+ 'chris@swiftmailer.org', 'mark@swiftmailer.org',
+ ));
+ $this->assertEquals(
+ array('chris@swiftmailer.org' => null, 'mark@swiftmailer.org' => null),
+ $header->getNameAddresses()
+ );
+ }
+
+ public function testMultipleAddressesAsMailboxStrings()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setAddresses(array(
+ 'chris@swiftmailer.org', 'mark@swiftmailer.org',
+ ));
+ $this->assertEquals(
+ array('chris@swiftmailer.org', 'mark@swiftmailer.org'),
+ $header->getNameAddressStrings()
+ );
+ }
+
+ public function testMultipleNamedMailboxesReturnsMultipleAddresses()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $this->assertEquals(
+ array('chris@swiftmailer.org', 'mark@swiftmailer.org'),
+ $header->getAddresses()
+ );
+ }
+
+ public function testMultipleNamedMailboxesReturnsMultipleMailboxes()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $this->assertEquals(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ),
+ $header->getNameAddresses()
+ );
+ }
+
+ public function testMultipleMailboxesProducesMultipleMailboxStrings()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $this->assertEquals(array(
+ 'Chris Corbyn <chris@swiftmailer.org>',
+ 'Mark Corbyn <mark@swiftmailer.org>',
+ ),
+ $header->getNameAddressStrings()
+ );
+ }
+
+ public function testSetAddressesOverwritesAnyMailboxes()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $this->assertEquals(
+ array('chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn', ),
+ $header->getNameAddresses()
+ );
+ $this->assertEquals(
+ array('chris@swiftmailer.org', 'mark@swiftmailer.org'),
+ $header->getAddresses()
+ );
+
+ $header->setAddresses(array('chris@swiftmailer.org', 'mark@swiftmailer.org'));
+
+ $this->assertEquals(
+ array('chris@swiftmailer.org' => null, 'mark@swiftmailer.org' => null),
+ $header->getNameAddresses()
+ );
+ $this->assertEquals(
+ array('chris@swiftmailer.org', 'mark@swiftmailer.org'),
+ $header->getAddresses()
+ );
+ }
+
+ public function testNameIsEncodedIfNonAscii()
+ {
+ $name = 'C'.pack('C', 0x8F).'rbyn';
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($name, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('C=8Frbyn');
+
+ $header = $this->_getHeader('From', $encoder);
+ $header->setNameAddresses(array('chris@swiftmailer.org' => 'Chris '.$name));
+
+ $addresses = $header->getNameAddressStrings();
+ $this->assertEquals(
+ 'Chris =?'.$this->_charset.'?Q?C=8Frbyn?= <chris@swiftmailer.org>',
+ array_shift($addresses)
+ );
+ }
+
+ public function testEncodingLineLengthCalculations()
+ {
+ /* -- RFC 2047, 2.
+ An 'encoded-word' may not be more than 75 characters long, including
+ 'charset', 'encoding', 'encoded-text', and delimiters.
+ */
+
+ $name = 'C'.pack('C', 0x8F).'rbyn';
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($name, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('C=8Frbyn');
+
+ $header = $this->_getHeader('From', $encoder);
+ $header->setNameAddresses(array('chris@swiftmailer.org' => 'Chris '.$name));
+
+ $header->getNameAddressStrings();
+ }
+
+ public function testGetValueReturnsMailboxStringValue()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ ));
+ $this->assertEquals(
+ 'Chris Corbyn <chris@swiftmailer.org>', $header->getFieldBody()
+ );
+ }
+
+ public function testGetValueReturnsMailboxStringValueForMultipleMailboxes()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $this->assertEquals(
+ 'Chris Corbyn <chris@swiftmailer.org>, Mark Corbyn <mark@swiftmailer.org>',
+ $header->getFieldBody()
+ );
+ }
+
+ public function testRemoveAddressesWithSingleValue()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $header->removeAddresses('chris@swiftmailer.org');
+ $this->assertEquals(array('mark@swiftmailer.org'),
+ $header->getAddresses()
+ );
+ }
+
+ public function testRemoveAddressesWithList()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $header->removeAddresses(
+ array('chris@swiftmailer.org', 'mark@swiftmailer.org')
+ );
+ $this->assertEquals(array(), $header->getAddresses());
+ }
+
+ public function testSetBodyModel()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setFieldBodyModel('chris@swiftmailer.org');
+ $this->assertEquals(array('chris@swiftmailer.org' => null), $header->getNameAddresses());
+ }
+
+ public function testGetBodyModel()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setAddresses(array('chris@swiftmailer.org'));
+ $this->assertEquals(array('chris@swiftmailer.org' => null), $header->getFieldBodyModel());
+ }
+
+ public function testToString()
+ {
+ $header = $this->_getHeader('From', $this->_getEncoder('Q', true));
+ $header->setNameAddresses(array(
+ 'chris@swiftmailer.org' => 'Chris Corbyn',
+ 'mark@swiftmailer.org' => 'Mark Corbyn',
+ ));
+ $this->assertEquals(
+ 'From: Chris Corbyn <chris@swiftmailer.org>, '.
+ 'Mark Corbyn <mark@swiftmailer.org>'."\r\n",
+ $header->toString()
+ );
+ }
+
+ private function _getHeader($name, $encoder)
+ {
+ $header = new Swift_Mime_Headers_MailboxHeader($name, $encoder, new Swift_Mime_Grammar());
+ $header->setCharset($this->_charset);
+
+ return $header;
+ }
+
+ private function _getEncoder($type, $stub = false)
+ {
+ $encoder = $this->getMockery('Swift_Mime_HeaderEncoder')->shouldIgnoreMissing();
+ $encoder->shouldReceive('getName')
+ ->zeroOrMoreTimes()
+ ->andReturn($type);
+
+ return $encoder;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php
new file mode 100644
index 0000000..cd027cc
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/ParameterizedHeaderTest.php
@@ -0,0 +1,398 @@
+<?php
+
+class Swift_Mime_Headers_ParameterizedHeaderTest extends \SwiftMailerTestCase
+{
+ private $_charset = 'utf-8';
+ private $_lang = 'en-us';
+
+ public function testTypeIsParameterizedHeader()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $this->assertEquals(Swift_Mime_Header::TYPE_PARAMETERIZED, $header->getFieldType());
+ }
+
+ public function testValueIsReturnedVerbatim()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setValue('text/plain');
+ $this->assertEquals('text/plain', $header->getValue());
+ }
+
+ public function testParametersAreAppended()
+ {
+ /* -- RFC 2045, 5.1
+ parameter := attribute "=" value
+
+ attribute := token
+ ; Matching of attributes
+ ; is ALWAYS case-insensitive.
+
+ value := token / quoted-string
+
+ token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
+ or tspecials>
+
+ tspecials := "(" / ")" / "<" / ">" / "@" /
+ "," / ";" / ":" / "\" / <">
+ "/" / "[" / "]" / "?" / "="
+ ; Must be in quoted-string,
+ ; to use within parameter values
+ */
+
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setValue('text/plain');
+ $header->setParameters(array('charset' => 'utf-8'));
+ $this->assertEquals('text/plain; charset=utf-8', $header->getFieldBody());
+ }
+
+ public function testSpaceInParamResultsInQuotedString()
+ {
+ $header = $this->_getHeader('Content-Disposition',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setValue('attachment');
+ $header->setParameters(array('filename' => 'my file.txt'));
+ $this->assertEquals('attachment; filename="my file.txt"',
+ $header->getFieldBody()
+ );
+ }
+
+ public function testLongParamsAreBrokenIntoMultipleAttributeStrings()
+ {
+ /* -- RFC 2231, 3.
+ The asterisk character ("*") followed
+ by a decimal count is employed to indicate that multiple parameters
+ are being used to encapsulate a single parameter value. The count
+ starts at 0 and increments by 1 for each subsequent section of the
+ parameter value. Decimal values are used and neither leading zeroes
+ nor gaps in the sequence are allowed.
+
+ The original parameter value is recovered by concatenating the
+ various sections of the parameter, in order. For example, the
+ content-type field
+
+ Content-Type: message/external-body; access-type=URL;
+ URL*0="ftp://";
+ URL*1="cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
+
+ is semantically identical to
+
+ Content-Type: message/external-body; access-type=URL;
+ URL="ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
+
+ Note that quotes around parameter values are part of the value
+ syntax; they are NOT part of the value itself. Furthermore, it is
+ explicitly permitted to have a mixture of quoted and unquoted
+ continuation fields.
+ */
+
+ $value = str_repeat('a', 180);
+
+ $encoder = $this->_getParameterEncoder();
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), 63, \Mockery::any())
+ ->andReturn(str_repeat('a', 63)."\r\n".
+ str_repeat('a', 63)."\r\n".str_repeat('a', 54));
+
+ $header = $this->_getHeader('Content-Disposition',
+ $this->_getHeaderEncoder('Q', true), $encoder
+ );
+ $header->setValue('attachment');
+ $header->setParameters(array('filename' => $value));
+ $header->setMaxLineLength(78);
+ $this->assertEquals(
+ 'attachment; '.
+ 'filename*0*=utf-8\'\''.str_repeat('a', 63).";\r\n ".
+ 'filename*1*='.str_repeat('a', 63).";\r\n ".
+ 'filename*2*='.str_repeat('a', 54),
+ $header->getFieldBody()
+ );
+ }
+
+ public function testEncodedParamDataIncludesCharsetAndLanguage()
+ {
+ /* -- RFC 2231, 4.
+ Asterisks ("*") are reused to provide the indicator that language and
+ character set information is present and encoding is being used. A
+ single quote ("'") is used to delimit the character set and language
+ information at the beginning of the parameter value. Percent signs
+ ("%") are used as the encoding flag, which agrees with RFC 2047.
+
+ Specifically, an asterisk at the end of a parameter name acts as an
+ indicator that character set and language information may appear at
+ the beginning of the parameter value. A single quote is used to
+ separate the character set, language, and actual value information in
+ the parameter value string, and an percent sign is used to flag
+ octets encoded in hexadecimal. For example:
+
+ Content-Type: application/x-stuff;
+ title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A
+
+ Note that it is perfectly permissible to leave either the character
+ set or language field blank. Note also that the single quote
+ delimiters MUST be present even when one of the field values is
+ omitted.
+ */
+
+ $value = str_repeat('a', 20).pack('C', 0x8F).str_repeat('a', 10);
+
+ $encoder = $this->_getParameterEncoder();
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, 12, 62, \Mockery::any())
+ ->andReturn(str_repeat('a', 20).'%8F'.str_repeat('a', 10));
+
+ $header = $this->_getHeader('Content-Disposition',
+ $this->_getHeaderEncoder('Q', true), $encoder
+ );
+ $header->setValue('attachment');
+ $header->setParameters(array('filename' => $value));
+ $header->setMaxLineLength(78);
+ $header->setLanguage($this->_lang);
+ $this->assertEquals(
+ 'attachment; filename*='.$this->_charset."'".$this->_lang."'".
+ str_repeat('a', 20).'%8F'.str_repeat('a', 10),
+ $header->getFieldBody()
+ );
+ }
+
+ public function testMultipleEncodedParamLinesAreFormattedCorrectly()
+ {
+ /* -- RFC 2231, 4.1.
+ Character set and language information may be combined with the
+ parameter continuation mechanism. For example:
+
+ Content-Type: application/x-stuff
+ title*0*=us-ascii'en'This%20is%20even%20more%20
+ title*1*=%2A%2A%2Afun%2A%2A%2A%20
+ title*2="isn't it!"
+
+ Note that:
+
+ (1) Language and character set information only appear at
+ the beginning of a given parameter value.
+
+ (2) Continuations do not provide a facility for using more
+ than one character set or language in the same
+ parameter value.
+
+ (3) A value presented using multiple continuations may
+ contain a mixture of encoded and unencoded segments.
+
+ (4) The first segment of a continuation MUST be encoded if
+ language and character set information are given.
+
+ (5) If the first segment of a continued parameter value is
+ encoded the language and character set field delimiters
+ MUST be present even when the fields are left blank.
+ */
+
+ $value = str_repeat('a', 20).pack('C', 0x8F).str_repeat('a', 60);
+
+ $encoder = $this->_getParameterEncoder();
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, 12, 62, \Mockery::any())
+ ->andReturn(str_repeat('a', 20).'%8F'.str_repeat('a', 28)."\r\n".
+ str_repeat('a', 32));
+
+ $header = $this->_getHeader('Content-Disposition',
+ $this->_getHeaderEncoder('Q', true), $encoder
+ );
+ $header->setValue('attachment');
+ $header->setParameters(array('filename' => $value));
+ $header->setMaxLineLength(78);
+ $header->setLanguage($this->_lang);
+ $this->assertEquals(
+ 'attachment; filename*0*='.$this->_charset."'".$this->_lang."'".
+ str_repeat('a', 20).'%8F'.str_repeat('a', 28).";\r\n ".
+ 'filename*1*='.str_repeat('a', 32),
+ $header->getFieldBody()
+ );
+ }
+
+ public function testToString()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setValue('text/html');
+ $header->setParameters(array('charset' => 'utf-8'));
+ $this->assertEquals('Content-Type: text/html; charset=utf-8'."\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testValueCanBeEncodedIfNonAscii()
+ {
+ $value = 'fo'.pack('C', 0x8F).'bar';
+
+ $encoder = $this->_getHeaderEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo=8Fbar');
+
+ $header = $this->_getHeader('X-Foo', $encoder, $this->_getParameterEncoder(true));
+ $header->setValue($value);
+ $header->setParameters(array('lookslike' => 'foobar'));
+ $this->assertEquals('X-Foo: =?utf-8?Q?fo=8Fbar?=; lookslike=foobar'."\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testValueAndParamCanBeEncodedIfNonAscii()
+ {
+ $value = 'fo'.pack('C', 0x8F).'bar';
+
+ $encoder = $this->_getHeaderEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo=8Fbar');
+
+ $paramEncoder = $this->_getParameterEncoder();
+ $paramEncoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo%8Fbar');
+
+ $header = $this->_getHeader('X-Foo', $encoder, $paramEncoder);
+ $header->setValue($value);
+ $header->setParameters(array('says' => $value));
+ $this->assertEquals("X-Foo: =?utf-8?Q?fo=8Fbar?=; says*=utf-8''fo%8Fbar\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testParamsAreEncodedWithEncodedWordsIfNoParamEncoderSet()
+ {
+ $value = 'fo'.pack('C', 0x8F).'bar';
+
+ $encoder = $this->_getHeaderEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo=8Fbar');
+
+ $header = $this->_getHeader('X-Foo', $encoder, null);
+ $header->setValue('bar');
+ $header->setParameters(array('says' => $value));
+ $this->assertEquals("X-Foo: bar; says=\"=?utf-8?Q?fo=8Fbar?=\"\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testLanguageInformationAppearsInEncodedWords()
+ {
+ /* -- RFC 2231, 5.
+ 5. Language specification in Encoded Words
+
+ RFC 2047 provides support for non-US-ASCII character sets in RFC 822
+ message header comments, phrases, and any unstructured text field.
+ This is done by defining an encoded word construct which can appear
+ in any of these places. Given that these are fields intended for
+ display, it is sometimes necessary to associate language information
+ with encoded words as well as just the character set. This
+ specification extends the definition of an encoded word to allow the
+ inclusion of such information. This is simply done by suffixing the
+ character set specification with an asterisk followed by the language
+ tag. For example:
+
+ From: =?US-ASCII*EN?Q?Keith_Moore?= <moore@cs.utk.edu>
+ */
+
+ $value = 'fo'.pack('C', 0x8F).'bar';
+
+ $encoder = $this->_getHeaderEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo=8Fbar');
+
+ $paramEncoder = $this->_getParameterEncoder();
+ $paramEncoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo%8Fbar');
+
+ $header = $this->_getHeader('X-Foo', $encoder, $paramEncoder);
+ $header->setLanguage('en');
+ $header->setValue($value);
+ $header->setParameters(array('says' => $value));
+ $this->assertEquals("X-Foo: =?utf-8*en?Q?fo=8Fbar?=; says*=utf-8'en'fo%8Fbar\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testSetBodyModel()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setFieldBodyModel('text/html');
+ $this->assertEquals('text/html', $header->getValue());
+ }
+
+ public function testGetBodyModel()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setValue('text/plain');
+ $this->assertEquals('text/plain', $header->getFieldBodyModel());
+ }
+
+ public function testSetParameter()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setParameters(array('charset' => 'utf-8', 'delsp' => 'yes'));
+ $header->setParameter('delsp', 'no');
+ $this->assertEquals(array('charset' => 'utf-8', 'delsp' => 'no'),
+ $header->getParameters()
+ );
+ }
+
+ public function testGetParameter()
+ {
+ $header = $this->_getHeader('Content-Type',
+ $this->_getHeaderEncoder('Q', true), $this->_getParameterEncoder(true)
+ );
+ $header->setParameters(array('charset' => 'utf-8', 'delsp' => 'yes'));
+ $this->assertEquals('utf-8', $header->getParameter('charset'));
+ }
+
+ private function _getHeader($name, $encoder, $paramEncoder)
+ {
+ $header = new Swift_Mime_Headers_ParameterizedHeader($name, $encoder,
+ $paramEncoder, new Swift_Mime_Grammar()
+ );
+ $header->setCharset($this->_charset);
+
+ return $header;
+ }
+
+ private function _getHeaderEncoder($type, $stub = false)
+ {
+ $encoder = $this->getMockery('Swift_Mime_HeaderEncoder')->shouldIgnoreMissing();
+ $encoder->shouldReceive('getName')
+ ->zeroOrMoreTimes()
+ ->andReturn($type);
+
+ return $encoder;
+ }
+
+ private function _getParameterEncoder($stub = false)
+ {
+ return $this->getMockery('Swift_Encoder')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php
new file mode 100644
index 0000000..a9f35e9
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/PathHeaderTest.php
@@ -0,0 +1,77 @@
+<?php
+
+class Swift_Mime_Headers_PathHeaderTest extends \PHPUnit_Framework_TestCase
+{
+ public function testTypeIsPathHeader()
+ {
+ $header = $this->_getHeader('Return-Path');
+ $this->assertEquals(Swift_Mime_Header::TYPE_PATH, $header->getFieldType());
+ }
+
+ public function testSingleAddressCanBeSetAndFetched()
+ {
+ $header = $this->_getHeader('Return-Path');
+ $header->setAddress('chris@swiftmailer.org');
+ $this->assertEquals('chris@swiftmailer.org', $header->getAddress());
+ }
+
+ public function testAddressMustComplyWithRfc2822()
+ {
+ try {
+ $header = $this->_getHeader('Return-Path');
+ $header->setAddress('chr is@swiftmailer.org');
+ $this->fail('Addresses not valid according to RFC 2822 addr-spec grammar must be rejected.');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testValueIsAngleAddrWithValidAddress()
+ {
+ /* -- RFC 2822, 3.6.7.
+
+ return = "Return-Path:" path CRLF
+
+ path = ([CFWS] "<" ([CFWS] / addr-spec) ">" [CFWS]) /
+ obs-path
+ */
+
+ $header = $this->_getHeader('Return-Path');
+ $header->setAddress('chris@swiftmailer.org');
+ $this->assertEquals('<chris@swiftmailer.org>', $header->getFieldBody());
+ }
+
+ public function testValueIsEmptyAngleBracketsIfEmptyAddressSet()
+ {
+ $header = $this->_getHeader('Return-Path');
+ $header->setAddress('');
+ $this->assertEquals('<>', $header->getFieldBody());
+ }
+
+ public function testSetBodyModel()
+ {
+ $header = $this->_getHeader('Return-Path');
+ $header->setFieldBodyModel('foo@bar.tld');
+ $this->assertEquals('foo@bar.tld', $header->getAddress());
+ }
+
+ public function testGetBodyModel()
+ {
+ $header = $this->_getHeader('Return-Path');
+ $header->setAddress('foo@bar.tld');
+ $this->assertEquals('foo@bar.tld', $header->getFieldBodyModel());
+ }
+
+ public function testToString()
+ {
+ $header = $this->_getHeader('Return-Path');
+ $header->setAddress('chris@swiftmailer.org');
+ $this->assertEquals('Return-Path: <chris@swiftmailer.org>'."\r\n",
+ $header->toString()
+ );
+ }
+
+ private function _getHeader($name)
+ {
+ return new Swift_Mime_Headers_PathHeader($name, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php
new file mode 100644
index 0000000..2e1dc8c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/Headers/UnstructuredHeaderTest.php
@@ -0,0 +1,355 @@
+<?php
+
+class Swift_Mime_Headers_UnstructuredHeaderTest extends \SwiftMailerTestCase
+{
+ private $_charset = 'utf-8';
+
+ public function testTypeIsTextHeader()
+ {
+ $header = $this->_getHeader('Subject', $this->_getEncoder('Q', true));
+ $this->assertEquals(Swift_Mime_Header::TYPE_TEXT, $header->getFieldType());
+ }
+
+ public function testGetNameReturnsNameVerbatim()
+ {
+ $header = $this->_getHeader('Subject', $this->_getEncoder('Q', true));
+ $this->assertEquals('Subject', $header->getFieldName());
+ }
+
+ public function testGetValueReturnsValueVerbatim()
+ {
+ $header = $this->_getHeader('Subject', $this->_getEncoder('Q', true));
+ $header->setValue('Test');
+ $this->assertEquals('Test', $header->getValue());
+ }
+
+ public function testBasicStructureIsKeyValuePair()
+ {
+ /* -- RFC 2822, 2.2
+ Header fields are lines composed of a field name, followed by a colon
+ (":"), followed by a field body, and terminated by CRLF.
+ */
+ $header = $this->_getHeader('Subject', $this->_getEncoder('Q', true));
+ $header->setValue('Test');
+ $this->assertEquals('Subject: Test'."\r\n", $header->toString());
+ }
+
+ public function testLongHeadersAreFoldedAtWordBoundary()
+ {
+ /* -- RFC 2822, 2.2.3
+ Each header field is logically a single line of characters comprising
+ the field name, the colon, and the field body. For convenience
+ however, and to deal with the 998/78 character limitations per line,
+ the field body portion of a header field can be split into a multiple
+ line representation; this is called "folding". The general rule is
+ that wherever this standard allows for folding white space (not
+ simply WSP characters), a CRLF may be inserted before any WSP.
+ */
+
+ $value = 'The quick brown fox jumped over the fence, he was a very very '.
+ 'scary brown fox with a bushy tail';
+ $header = $this->_getHeader('X-Custom-Header',
+ $this->_getEncoder('Q', true)
+ );
+ $header->setValue($value);
+ $header->setMaxLineLength(78); //A safe [RFC 2822, 2.2.3] default
+ /*
+ X-Custom-Header: The quick brown fox jumped over the fence, he was a very very
+ scary brown fox with a bushy tail
+ */
+ $this->assertEquals(
+ 'X-Custom-Header: The quick brown fox jumped over the fence, he was a'.
+ ' very very'."\r\n".//Folding
+ ' scary brown fox with a bushy tail'."\r\n",
+ $header->toString(), '%s: The header should have been folded at 78th char'
+ );
+ }
+
+ public function testPrintableAsciiOnlyAppearsInHeaders()
+ {
+ /* -- RFC 2822, 2.2.
+ A field name MUST be composed of printable US-ASCII characters (i.e.,
+ characters that have values between 33 and 126, inclusive), except
+ colon. A field body may be composed of any US-ASCII characters,
+ except for CR and LF.
+ */
+
+ $nonAsciiChar = pack('C', 0x8F);
+ $header = $this->_getHeader('X-Test', $this->_getEncoder('Q', true));
+ $header->setValue($nonAsciiChar);
+ $this->assertRegExp(
+ '~^[^:\x00-\x20\x80-\xFF]+: [^\x80-\xFF\r\n]+\r\n$~s',
+ $header->toString()
+ );
+ }
+
+ public function testEncodedWordsFollowGeneralStructure()
+ {
+ /* -- RFC 2047, 1.
+ Generally, an "encoded-word" is a sequence of printable ASCII
+ characters that begins with "=?", ends with "?=", and has two "?"s in
+ between.
+ */
+
+ $nonAsciiChar = pack('C', 0x8F);
+ $header = $this->_getHeader('X-Test', $this->_getEncoder('Q', true));
+ $header->setValue($nonAsciiChar);
+ $this->assertRegExp(
+ '~^X-Test: \=?.*?\?.*?\?.*?\?=\r\n$~s',
+ $header->toString()
+ );
+ }
+
+ public function testEncodedWordIncludesCharsetAndEncodingMethodAndText()
+ {
+ /* -- RFC 2047, 2.
+ An 'encoded-word' is defined by the following ABNF grammar. The
+ notation of RFC 822 is used, with the exception that white space
+ characters MUST NOT appear between components of an 'encoded-word'.
+
+ encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
+ */
+
+ $nonAsciiChar = pack('C', 0x8F);
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($nonAsciiChar, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('=8F');
+
+ $header = $this->_getHeader('X-Test', $encoder);
+ $header->setValue($nonAsciiChar);
+ $this->assertEquals(
+ 'X-Test: =?'.$this->_charset.'?Q?=8F?='."\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testEncodedWordsAreUsedToEncodedNonPrintableAscii()
+ {
+ //SPACE and TAB permitted
+ $nonPrintableBytes = array_merge(
+ range(0x00, 0x08), range(0x10, 0x19), array(0x7F)
+ );
+
+ foreach ($nonPrintableBytes as $byte) {
+ $char = pack('C', $byte);
+ $encodedChar = sprintf('=%02X', $byte);
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($char, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn($encodedChar);
+
+ $header = $this->_getHeader('X-A', $encoder);
+ $header->setValue($char);
+
+ $this->assertEquals(
+ 'X-A: =?'.$this->_charset.'?Q?'.$encodedChar.'?='."\r\n",
+ $header->toString(), '%s: Non-printable ascii should be encoded'
+ );
+ }
+ }
+
+ public function testEncodedWordsAreUsedToEncode8BitOctets()
+ {
+ $_8BitBytes = range(0x80, 0xFF);
+
+ foreach ($_8BitBytes as $byte) {
+ $char = pack('C', $byte);
+ $encodedChar = sprintf('=%02X', $byte);
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($char, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn($encodedChar);
+
+ $header = $this->_getHeader('X-A', $encoder);
+ $header->setValue($char);
+
+ $this->assertEquals(
+ 'X-A: =?'.$this->_charset.'?Q?'.$encodedChar.'?='."\r\n",
+ $header->toString(), '%s: 8-bit octets should be encoded'
+ );
+ }
+ }
+
+ public function testEncodedWordsAreNoMoreThan75CharsPerLine()
+ {
+ /* -- RFC 2047, 2.
+ An 'encoded-word' may not be more than 75 characters long, including
+ 'charset', 'encoding', 'encoded-text', and delimiters.
+
+ ... SNIP ...
+
+ While there is no limit to the length of a multiple-line header
+ field, each line of a header field that contains one or more
+ 'encoded-word's is limited to 76 characters.
+ */
+
+ $nonAsciiChar = pack('C', 0x8F);
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($nonAsciiChar, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('=8F');
+ //Note that multi-line headers begin with LWSP which makes 75 + 1 = 76
+ //Note also that =?utf-8?q??= is 12 chars which makes 75 - 12 = 63
+
+ //* X-Test: is 8 chars
+ $header = $this->_getHeader('X-Test', $encoder);
+ $header->setValue($nonAsciiChar);
+
+ $this->assertEquals(
+ 'X-Test: =?'.$this->_charset.'?Q?=8F?='."\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testFWSPIsUsedWhenEncoderReturnsMultipleLines()
+ {
+ /* --RFC 2047, 2.
+ If it is desirable to encode more text than will fit in an 'encoded-word' of
+ 75 characters, multiple 'encoded-word's (separated by CRLF SPACE) may
+ be used.
+ */
+
+ //Note the Mock does NOT return 8F encoded, the 8F merely triggers
+ // encoding for the sake of testing
+ $nonAsciiChar = pack('C', 0x8F);
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($nonAsciiChar, 8, 63, \Mockery::any())
+ ->andReturn('line_one_here'."\r\n".'line_two_here');
+
+ //Note that multi-line headers begin with LWSP which makes 75 + 1 = 76
+ //Note also that =?utf-8?q??= is 12 chars which makes 75 - 12 = 63
+
+ //* X-Test: is 8 chars
+ $header = $this->_getHeader('X-Test', $encoder);
+ $header->setValue($nonAsciiChar);
+
+ $this->assertEquals(
+ 'X-Test: =?'.$this->_charset.'?Q?line_one_here?='."\r\n".
+ ' =?'.$this->_charset.'?Q?line_two_here?='."\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testAdjacentWordsAreEncodedTogether()
+ {
+ /* -- RFC 2047, 5 (1)
+ Ordinary ASCII text and 'encoded-word's may appear together in the
+ same header field. However, an 'encoded-word' that appears in a
+ header field defined as '*text' MUST be separated from any adjacent
+ 'encoded-word' or 'text' by 'linear-white-space'.
+
+ -- RFC 2047, 2.
+ IMPORTANT: 'encoded-word's are designed to be recognized as 'atom's
+ by an RFC 822 parser. As a consequence, unencoded white space
+ characters (such as SPACE and HTAB) are FORBIDDEN within an
+ 'encoded-word'.
+ */
+
+ //It would be valid to encode all words needed, however it's probably
+ // easiest to encode the longest amount required at a time
+
+ $word = 'w'.pack('C', 0x8F).'rd';
+ $text = 'start '.$word.' '.$word.' then end '.$word;
+ // 'start', ' word word', ' and end', ' word'
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($word.' '.$word, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('w=8Frd_w=8Frd');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($word, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('w=8Frd');
+
+ $header = $this->_getHeader('X-Test', $encoder);
+ $header->setValue($text);
+
+ $headerString = $header->toString();
+
+ $this->assertEquals('X-Test: start =?'.$this->_charset.'?Q?'.
+ 'w=8Frd_w=8Frd?= then end =?'.$this->_charset.'?Q?'.
+ 'w=8Frd?='."\r\n", $headerString,
+ '%s: Adjacent encoded words should appear grouped with WSP encoded'
+ );
+ }
+
+ public function testLanguageInformationAppearsInEncodedWords()
+ {
+ /* -- RFC 2231, 5.
+ 5. Language specification in Encoded Words
+
+ RFC 2047 provides support for non-US-ASCII character sets in RFC 822
+ message header comments, phrases, and any unstructured text field.
+ This is done by defining an encoded word construct which can appear
+ in any of these places. Given that these are fields intended for
+ display, it is sometimes necessary to associate language information
+ with encoded words as well as just the character set. This
+ specification extends the definition of an encoded word to allow the
+ inclusion of such information. This is simply done by suffixing the
+ character set specification with an asterisk followed by the language
+ tag. For example:
+
+ From: =?US-ASCII*EN?Q?Keith_Moore?= <moore@cs.utk.edu>
+ */
+
+ $value = 'fo'.pack('C', 0x8F).'bar';
+
+ $encoder = $this->_getEncoder('Q');
+ $encoder->shouldReceive('encodeString')
+ ->once()
+ ->with($value, \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn('fo=8Fbar');
+
+ $header = $this->_getHeader('Subject', $encoder);
+ $header->setLanguage('en');
+ $header->setValue($value);
+ $this->assertEquals("Subject: =?utf-8*en?Q?fo=8Fbar?=\r\n",
+ $header->toString()
+ );
+ }
+
+ public function testSetBodyModel()
+ {
+ $header = $this->_getHeader('Subject', $this->_getEncoder('Q', true));
+ $header->setFieldBodyModel('test');
+ $this->assertEquals('test', $header->getValue());
+ }
+
+ public function testGetBodyModel()
+ {
+ $header = $this->_getHeader('Subject', $this->_getEncoder('Q', true));
+ $header->setValue('test');
+ $this->assertEquals('test', $header->getFieldBodyModel());
+ }
+
+ private function _getHeader($name, $encoder)
+ {
+ $header = new Swift_Mime_Headers_UnstructuredHeader($name, $encoder, new Swift_Mime_Grammar());
+ $header->setCharset($this->_charset);
+
+ return $header;
+ }
+
+ private function _getEncoder($type, $stub = false)
+ {
+ $encoder = $this->getMockery('Swift_Mime_HeaderEncoder')->shouldIgnoreMissing();
+ $encoder->shouldReceive('getName')
+ ->zeroOrMoreTimes()
+ ->andReturn($type);
+
+ return $encoder;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php
new file mode 100644
index 0000000..738ac68
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/MimePartTest.php
@@ -0,0 +1,231 @@
+<?php
+
+class Swift_Mime_MimePartTest extends Swift_Mime_AbstractMimeEntityTest
+{
+ public function testNestingLevelIsSubpart()
+ {
+ $part = $this->_createMimePart($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(
+ Swift_Mime_MimeEntity::LEVEL_ALTERNATIVE, $part->getNestingLevel()
+ );
+ }
+
+ public function testCharsetIsReturnedFromHeader()
+ {
+ /* -- RFC 2046, 4.1.2.
+ A critical parameter that may be specified in the Content-Type field
+ for "text/plain" data is the character set. This is specified with a
+ "charset" parameter, as in:
+
+ Content-type: text/plain; charset=iso-8859-1
+
+ Unlike some other parameter values, the values of the charset
+ parameter are NOT case sensitive. The default character set, which
+ must be assumed in the absence of a charset parameter, is US-ASCII.
+ */
+
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array('charset' => 'iso-8859-1')
+ );
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('iso-8859-1', $part->getCharset());
+ }
+
+ public function testCharsetIsSetInHeader()
+ {
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array('charset' => 'iso-8859-1'), false
+ );
+ $cType->shouldReceive('setParameter')->once()->with('charset', 'utf-8');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $part->setCharset('utf-8');
+ }
+
+ public function testCharsetIsSetInHeaderIfPassedToSetBody()
+ {
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array('charset' => 'iso-8859-1'), false
+ );
+ $cType->shouldReceive('setParameter')->once()->with('charset', 'utf-8');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $part->setBody('', 'text/plian', 'utf-8');
+ }
+
+ public function testSettingCharsetNotifiesEncoder()
+ {
+ $encoder = $this->_createEncoder('quoted-printable', false);
+ $encoder->expects($this->once())
+ ->method('charsetChanged')
+ ->with('utf-8');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(),
+ $encoder, $this->_createCache()
+ );
+ $part->setCharset('utf-8');
+ }
+
+ public function testSettingCharsetNotifiesHeaders()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('charsetChanged')
+ ->zeroOrMoreTimes()
+ ->with('utf-8');
+
+ $part = $this->_createMimePart($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $part->setCharset('utf-8');
+ }
+
+ public function testSettingCharsetNotifiesChildren()
+ {
+ $child = $this->_createChild(0, '', false);
+ $child->shouldReceive('charsetChanged')
+ ->once()
+ ->with('windows-874');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $part->setChildren(array($child));
+ $part->setCharset('windows-874');
+ }
+
+ public function testCharsetChangeUpdatesCharset()
+ {
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array('charset' => 'iso-8859-1'), false
+ );
+ $cType->shouldReceive('setParameter')->once()->with('charset', 'utf-8');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $part->charsetChanged('utf-8');
+ }
+
+ public function testSettingCharsetClearsCache()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn("Content-Type: text/plain; charset=utf-8\r\n");
+
+ $cache = $this->_createCache(false);
+
+ $entity = $this->_createEntity($headers, $this->_createEncoder(),
+ $cache
+ );
+
+ $entity->setBody("blah\r\nblah!");
+ $entity->toString();
+
+ // Initialize the expectation here because we only care about what happens in setCharset()
+ $cache->shouldReceive('clearKey')
+ ->once()
+ ->with(\Mockery::any(), 'body');
+
+ $entity->setCharset('iso-2022');
+ }
+
+ public function testFormatIsReturnedFromHeader()
+ {
+ /* -- RFC 3676.
+ */
+
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array('format' => 'flowed')
+ );
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('flowed', $part->getFormat());
+ }
+
+ public function testFormatIsSetInHeader()
+ {
+ $cType = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $cType->shouldReceive('setParameter')->once()->with('format', 'fixed');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $part->setFormat('fixed');
+ }
+
+ public function testDelSpIsReturnedFromHeader()
+ {
+ /* -- RFC 3676.
+ */
+
+ $cType = $this->_createHeader('Content-Type', 'text/plain',
+ array('delsp' => 'no')
+ );
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertFalse($part->getDelSp());
+ }
+
+ public function testDelSpIsSetInHeader()
+ {
+ $cType = $this->_createHeader('Content-Type', 'text/plain', array(), false);
+ $cType->shouldReceive('setParameter')->once()->with('delsp', 'yes');
+
+ $part = $this->_createMimePart($this->_createHeaderSet(array(
+ 'Content-Type' => $cType, )),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $part->setDelSp(true);
+ }
+
+ public function testFluidInterface()
+ {
+ $part = $this->_createMimePart($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $this->assertSame($part,
+ $part
+ ->setContentType('text/plain')
+ ->setEncoder($this->_createEncoder())
+ ->setId('foo@bar')
+ ->setDescription('my description')
+ ->setMaxLineLength(998)
+ ->setBody('xx')
+ ->setBoundary('xyz')
+ ->setChildren(array())
+ ->setCharset('utf-8')
+ ->setFormat('flowed')
+ ->setDelSp(true)
+ );
+ }
+
+ //abstract
+ protected function _createEntity($headers, $encoder, $cache)
+ {
+ return $this->_createMimePart($headers, $encoder, $cache);
+ }
+
+ protected function _createMimePart($headers, $encoder, $cache)
+ {
+ return new Swift_Mime_MimePart($headers, $encoder, $cache, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php
new file mode 100644
index 0000000..6a87abf
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderFactoryTest.php
@@ -0,0 +1,166 @@
+<?php
+
+class Swift_Mime_SimpleHeaderFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ private $_factory;
+
+ protected function setUp()
+ {
+ $this->_factory = $this->_createFactory();
+ }
+
+ public function testMailboxHeaderIsCorrectType()
+ {
+ $header = $this->_factory->createMailboxHeader('X-Foo');
+ $this->assertInstanceOf('Swift_Mime_Headers_MailboxHeader', $header);
+ }
+
+ public function testMailboxHeaderHasCorrectName()
+ {
+ $header = $this->_factory->createMailboxHeader('X-Foo');
+ $this->assertEquals('X-Foo', $header->getFieldName());
+ }
+
+ public function testMailboxHeaderHasCorrectModel()
+ {
+ $header = $this->_factory->createMailboxHeader('X-Foo',
+ array('foo@bar' => 'FooBar')
+ );
+ $this->assertEquals(array('foo@bar' => 'FooBar'), $header->getFieldBodyModel());
+ }
+
+ public function testDateHeaderHasCorrectType()
+ {
+ $header = $this->_factory->createDateHeader('X-Date');
+ $this->assertInstanceOf('Swift_Mime_Headers_DateHeader', $header);
+ }
+
+ public function testDateHeaderHasCorrectName()
+ {
+ $header = $this->_factory->createDateHeader('X-Date');
+ $this->assertEquals('X-Date', $header->getFieldName());
+ }
+
+ public function testDateHeaderHasCorrectModel()
+ {
+ $header = $this->_factory->createDateHeader('X-Date', 123);
+ $this->assertEquals(123, $header->getFieldBodyModel());
+ }
+
+ public function testTextHeaderHasCorrectType()
+ {
+ $header = $this->_factory->createTextHeader('X-Foo');
+ $this->assertInstanceOf('Swift_Mime_Headers_UnstructuredHeader', $header);
+ }
+
+ public function testTextHeaderHasCorrectName()
+ {
+ $header = $this->_factory->createTextHeader('X-Foo');
+ $this->assertEquals('X-Foo', $header->getFieldName());
+ }
+
+ public function testTextHeaderHasCorrectModel()
+ {
+ $header = $this->_factory->createTextHeader('X-Foo', 'bar');
+ $this->assertEquals('bar', $header->getFieldBodyModel());
+ }
+
+ public function testParameterizedHeaderHasCorrectType()
+ {
+ $header = $this->_factory->createParameterizedHeader('X-Foo');
+ $this->assertInstanceOf('Swift_Mime_Headers_ParameterizedHeader', $header);
+ }
+
+ public function testParameterizedHeaderHasCorrectName()
+ {
+ $header = $this->_factory->createParameterizedHeader('X-Foo');
+ $this->assertEquals('X-Foo', $header->getFieldName());
+ }
+
+ public function testParameterizedHeaderHasCorrectModel()
+ {
+ $header = $this->_factory->createParameterizedHeader('X-Foo', 'bar');
+ $this->assertEquals('bar', $header->getFieldBodyModel());
+ }
+
+ public function testParameterizedHeaderHasCorrectParams()
+ {
+ $header = $this->_factory->createParameterizedHeader('X-Foo', 'bar',
+ array('zip' => 'button')
+ );
+ $this->assertEquals(array('zip' => 'button'), $header->getParameters());
+ }
+
+ public function testIdHeaderHasCorrectType()
+ {
+ $header = $this->_factory->createIdHeader('X-ID');
+ $this->assertInstanceOf('Swift_Mime_Headers_IdentificationHeader', $header);
+ }
+
+ public function testIdHeaderHasCorrectName()
+ {
+ $header = $this->_factory->createIdHeader('X-ID');
+ $this->assertEquals('X-ID', $header->getFieldName());
+ }
+
+ public function testIdHeaderHasCorrectModel()
+ {
+ $header = $this->_factory->createIdHeader('X-ID', 'xyz@abc');
+ $this->assertEquals(array('xyz@abc'), $header->getFieldBodyModel());
+ }
+
+ public function testPathHeaderHasCorrectType()
+ {
+ $header = $this->_factory->createPathHeader('X-Path');
+ $this->assertInstanceOf('Swift_Mime_Headers_PathHeader', $header);
+ }
+
+ public function testPathHeaderHasCorrectName()
+ {
+ $header = $this->_factory->createPathHeader('X-Path');
+ $this->assertEquals('X-Path', $header->getFieldName());
+ }
+
+ public function testPathHeaderHasCorrectModel()
+ {
+ $header = $this->_factory->createPathHeader('X-Path', 'foo@bar');
+ $this->assertEquals('foo@bar', $header->getFieldBodyModel());
+ }
+
+ public function testCharsetChangeNotificationNotifiesEncoders()
+ {
+ $encoder = $this->_createHeaderEncoder();
+ $encoder->expects($this->once())
+ ->method('charsetChanged')
+ ->with('utf-8');
+ $paramEncoder = $this->_createParamEncoder();
+ $paramEncoder->expects($this->once())
+ ->method('charsetChanged')
+ ->with('utf-8');
+
+ $factory = $this->_createFactory($encoder, $paramEncoder);
+
+ $factory->charsetChanged('utf-8');
+ }
+
+ private function _createFactory($encoder = null, $paramEncoder = null)
+ {
+ return new Swift_Mime_SimpleHeaderFactory(
+ $encoder
+ ? $encoder : $this->_createHeaderEncoder(),
+ $paramEncoder
+ ? $paramEncoder : $this->_createParamEncoder(),
+ new Swift_Mime_Grammar()
+ );
+ }
+
+ private function _createHeaderEncoder()
+ {
+ return $this->getMockBuilder('Swift_Mime_HeaderEncoder')->getMock();
+ }
+
+ private function _createParamEncoder()
+ {
+ return $this->getMockBuilder('Swift_Encoder')->getMock();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php
new file mode 100644
index 0000000..bed1c13
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleHeaderSetTest.php
@@ -0,0 +1,737 @@
+<?php
+
+class Swift_Mime_SimpleHeaderSetTest extends \PHPUnit_Framework_TestCase
+{
+ public function testAddMailboxHeaderDelegatesToFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createMailboxHeader')
+ ->with('From', array('person@domain' => 'Person'))
+ ->will($this->returnValue($this->_createHeader('From')));
+
+ $set = $this->_createSet($factory);
+ $set->addMailboxHeader('From', array('person@domain' => 'Person'));
+ }
+
+ public function testAddDateHeaderDelegatesToFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createDateHeader')
+ ->with('Date', 1234)
+ ->will($this->returnValue($this->_createHeader('Date')));
+
+ $set = $this->_createSet($factory);
+ $set->addDateHeader('Date', 1234);
+ }
+
+ public function testAddTextHeaderDelegatesToFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createTextHeader')
+ ->with('Subject', 'some text')
+ ->will($this->returnValue($this->_createHeader('Subject')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Subject', 'some text');
+ }
+
+ public function testAddParameterizedHeaderDelegatesToFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createParameterizedHeader')
+ ->with('Content-Type', 'text/plain', array('charset' => 'utf-8'))
+ ->will($this->returnValue($this->_createHeader('Content-Type')));
+
+ $set = $this->_createSet($factory);
+ $set->addParameterizedHeader('Content-Type', 'text/plain',
+ array('charset' => 'utf-8')
+ );
+ }
+
+ public function testAddIdHeaderDelegatesToFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($this->_createHeader('Message-ID')));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ }
+
+ public function testAddPathHeaderDelegatesToFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createPathHeader')
+ ->with('Return-Path', 'some@path')
+ ->will($this->returnValue($this->_createHeader('Return-Path')));
+
+ $set = $this->_createSet($factory);
+ $set->addPathHeader('Return-Path', 'some@path');
+ }
+
+ public function testHasReturnsFalseWhenNoHeaders()
+ {
+ $set = $this->_createSet($this->_createFactory());
+ $this->assertFalse($set->has('Some-Header'));
+ }
+
+ public function testAddedMailboxHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createMailboxHeader')
+ ->with('From', array('person@domain' => 'Person'))
+ ->will($this->returnValue($this->_createHeader('From')));
+
+ $set = $this->_createSet($factory);
+ $set->addMailboxHeader('From', array('person@domain' => 'Person'));
+ $this->assertTrue($set->has('From'));
+ }
+
+ public function testAddedDateHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createDateHeader')
+ ->with('Date', 1234)
+ ->will($this->returnValue($this->_createHeader('Date')));
+
+ $set = $this->_createSet($factory);
+ $set->addDateHeader('Date', 1234);
+ $this->assertTrue($set->has('Date'));
+ }
+
+ public function testAddedTextHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createTextHeader')
+ ->with('Subject', 'some text')
+ ->will($this->returnValue($this->_createHeader('Subject')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Subject', 'some text');
+ $this->assertTrue($set->has('Subject'));
+ }
+
+ public function testAddedParameterizedHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createParameterizedHeader')
+ ->with('Content-Type', 'text/plain', array('charset' => 'utf-8'))
+ ->will($this->returnValue($this->_createHeader('Content-Type')));
+
+ $set = $this->_createSet($factory);
+ $set->addParameterizedHeader('Content-Type', 'text/plain',
+ array('charset' => 'utf-8')
+ );
+ $this->assertTrue($set->has('Content-Type'));
+ }
+
+ public function testAddedIdHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($this->_createHeader('Message-ID')));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertTrue($set->has('Message-ID'));
+ }
+
+ public function testAddedPathHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createPathHeader')
+ ->with('Return-Path', 'some@path')
+ ->will($this->returnValue($this->_createHeader('Return-Path')));
+
+ $set = $this->_createSet($factory);
+ $set->addPathHeader('Return-Path', 'some@path');
+ $this->assertTrue($set->has('Return-Path'));
+ }
+
+ public function testNewlySetHeaderIsSeenByHas()
+ {
+ $factory = $this->_createFactory();
+ $header = $this->_createHeader('X-Foo', 'bar');
+ $set = $this->_createSet($factory);
+ $set->set($header);
+ $this->assertTrue($set->has('X-Foo'));
+ }
+
+ public function testHasCanAcceptOffset()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($this->_createHeader('Message-ID')));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertTrue($set->has('Message-ID', 0));
+ }
+
+ public function testHasWithIllegalOffsetReturnsFalse()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($this->_createHeader('Message-ID')));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertFalse($set->has('Message-ID', 1));
+ }
+
+ public function testHasCanDistinguishMultipleHeaders()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($this->_createHeader('Message-ID')));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'other@id')
+ ->will($this->returnValue($this->_createHeader('Message-ID')));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Message-ID', 'other@id');
+ $this->assertTrue($set->has('Message-ID', 1));
+ }
+
+ public function testGetWithUnspecifiedOffset()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertSame($header, $set->get('Message-ID'));
+ }
+
+ public function testGetWithSpeiciedOffset()
+ {
+ $header0 = $this->_createHeader('Message-ID');
+ $header1 = $this->_createHeader('Message-ID');
+ $header2 = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header0));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'other@id')
+ ->will($this->returnValue($header1));
+ $factory->expects($this->at(2))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'more@id')
+ ->will($this->returnValue($header2));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Message-ID', 'other@id');
+ $set->addIdHeader('Message-ID', 'more@id');
+ $this->assertSame($header1, $set->get('Message-ID', 1));
+ }
+
+ public function testGetReturnsNullIfHeaderNotSet()
+ {
+ $set = $this->_createSet($this->_createFactory());
+ $this->assertNull($set->get('Message-ID', 99));
+ }
+
+ public function testGetAllReturnsAllHeadersMatchingName()
+ {
+ $header0 = $this->_createHeader('Message-ID');
+ $header1 = $this->_createHeader('Message-ID');
+ $header2 = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header0));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'other@id')
+ ->will($this->returnValue($header1));
+ $factory->expects($this->at(2))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'more@id')
+ ->will($this->returnValue($header2));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Message-ID', 'other@id');
+ $set->addIdHeader('Message-ID', 'more@id');
+
+ $this->assertEquals(array($header0, $header1, $header2),
+ $set->getAll('Message-ID')
+ );
+ }
+
+ public function testGetAllReturnsAllHeadersIfNoArguments()
+ {
+ $header0 = $this->_createHeader('Message-ID');
+ $header1 = $this->_createHeader('Subject');
+ $header2 = $this->_createHeader('To');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header0));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Subject', 'thing')
+ ->will($this->returnValue($header1));
+ $factory->expects($this->at(2))
+ ->method('createIdHeader')
+ ->with('To', 'person@example.org')
+ ->will($this->returnValue($header2));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Subject', 'thing');
+ $set->addIdHeader('To', 'person@example.org');
+
+ $this->assertEquals(array($header0, $header1, $header2),
+ $set->getAll()
+ );
+ }
+
+ public function testGetAllReturnsEmptyArrayIfNoneSet()
+ {
+ $set = $this->_createSet($this->_createFactory());
+ $this->assertEquals(array(), $set->getAll('Received'));
+ }
+
+ public function testRemoveWithUnspecifiedOffset()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->remove('Message-ID');
+ $this->assertFalse($set->has('Message-ID'));
+ }
+
+ public function testRemoveWithSpecifiedIndexRemovesHeader()
+ {
+ $header0 = $this->_createHeader('Message-ID');
+ $header1 = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header0));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'other@id')
+ ->will($this->returnValue($header1));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Message-ID', 'other@id');
+ $set->remove('Message-ID', 0);
+ $this->assertFalse($set->has('Message-ID', 0));
+ $this->assertTrue($set->has('Message-ID', 1));
+ $this->assertTrue($set->has('Message-ID'));
+ $set->remove('Message-ID', 1);
+ $this->assertFalse($set->has('Message-ID', 1));
+ $this->assertFalse($set->has('Message-ID'));
+ }
+
+ public function testRemoveWithSpecifiedIndexLeavesOtherHeaders()
+ {
+ $header0 = $this->_createHeader('Message-ID');
+ $header1 = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header0));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'other@id')
+ ->will($this->returnValue($header1));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Message-ID', 'other@id');
+ $set->remove('Message-ID', 1);
+ $this->assertTrue($set->has('Message-ID', 0));
+ }
+
+ public function testRemoveWithInvalidOffsetDoesNothing()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->remove('Message-ID', 50);
+ $this->assertTrue($set->has('Message-ID'));
+ }
+
+ public function testRemoveAllRemovesAllHeadersWithName()
+ {
+ $header0 = $this->_createHeader('Message-ID');
+ $header1 = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header0));
+ $factory->expects($this->at(1))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'other@id')
+ ->will($this->returnValue($header1));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->addIdHeader('Message-ID', 'other@id');
+ $set->removeAll('Message-ID');
+ $this->assertFalse($set->has('Message-ID', 0));
+ $this->assertFalse($set->has('Message-ID', 1));
+ }
+
+ public function testHasIsNotCaseSensitive()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertTrue($set->has('message-id'));
+ }
+
+ public function testGetIsNotCaseSensitive()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertSame($header, $set->get('message-id'));
+ }
+
+ public function testGetAllIsNotCaseSensitive()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $this->assertEquals(array($header), $set->getAll('message-id'));
+ }
+
+ public function testRemoveIsNotCaseSensitive()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->remove('message-id');
+ $this->assertFalse($set->has('Message-ID'));
+ }
+
+ public function testRemoveAllIsNotCaseSensitive()
+ {
+ $header = $this->_createHeader('Message-ID');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createIdHeader')
+ ->with('Message-ID', 'some@id')
+ ->will($this->returnValue($header));
+
+ $set = $this->_createSet($factory);
+ $set->addIdHeader('Message-ID', 'some@id');
+ $set->removeAll('message-id');
+ $this->assertFalse($set->has('Message-ID'));
+ }
+
+ public function testNewInstance()
+ {
+ $set = $this->_createSet($this->_createFactory());
+ $instance = $set->newInstance();
+ $this->assertInstanceOf('Swift_Mime_HeaderSet', $instance);
+ }
+
+ public function testToStringJoinsHeadersTogether()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Foo', 'bar')
+ ->will($this->returnValue($this->_createHeader('Foo', 'bar')));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('Zip', 'buttons')
+ ->will($this->returnValue($this->_createHeader('Zip', 'buttons')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Foo', 'bar');
+ $set->addTextHeader('Zip', 'buttons');
+ $this->assertEquals(
+ "Foo: bar\r\n".
+ "Zip: buttons\r\n",
+ $set->toString()
+ );
+ }
+
+ public function testHeadersWithoutBodiesAreNotDisplayed()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Foo', 'bar')
+ ->will($this->returnValue($this->_createHeader('Foo', 'bar')));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('Zip', '')
+ ->will($this->returnValue($this->_createHeader('Zip', '')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Foo', 'bar');
+ $set->addTextHeader('Zip', '');
+ $this->assertEquals(
+ "Foo: bar\r\n",
+ $set->toString()
+ );
+ }
+
+ public function testHeadersWithoutBodiesCanBeForcedToDisplay()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Foo', '')
+ ->will($this->returnValue($this->_createHeader('Foo', '')));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('Zip', '')
+ ->will($this->returnValue($this->_createHeader('Zip', '')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Foo', '');
+ $set->addTextHeader('Zip', '');
+ $set->setAlwaysDisplayed(array('Foo', 'Zip'));
+ $this->assertEquals(
+ "Foo: \r\n".
+ "Zip: \r\n",
+ $set->toString()
+ );
+ }
+
+ public function testHeaderSequencesCanBeSpecified()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Third', 'three')
+ ->will($this->returnValue($this->_createHeader('Third', 'three')));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('First', 'one')
+ ->will($this->returnValue($this->_createHeader('First', 'one')));
+ $factory->expects($this->at(2))
+ ->method('createTextHeader')
+ ->with('Second', 'two')
+ ->will($this->returnValue($this->_createHeader('Second', 'two')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Third', 'three');
+ $set->addTextHeader('First', 'one');
+ $set->addTextHeader('Second', 'two');
+
+ $set->defineOrdering(array('First', 'Second', 'Third'));
+
+ $this->assertEquals(
+ "First: one\r\n".
+ "Second: two\r\n".
+ "Third: three\r\n",
+ $set->toString()
+ );
+ }
+
+ public function testUnsortedHeadersAppearAtEnd()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Fourth', 'four')
+ ->will($this->returnValue($this->_createHeader('Fourth', 'four')));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('Fifth', 'five')
+ ->will($this->returnValue($this->_createHeader('Fifth', 'five')));
+ $factory->expects($this->at(2))
+ ->method('createTextHeader')
+ ->with('Third', 'three')
+ ->will($this->returnValue($this->_createHeader('Third', 'three')));
+ $factory->expects($this->at(3))
+ ->method('createTextHeader')
+ ->with('First', 'one')
+ ->will($this->returnValue($this->_createHeader('First', 'one')));
+ $factory->expects($this->at(4))
+ ->method('createTextHeader')
+ ->with('Second', 'two')
+ ->will($this->returnValue($this->_createHeader('Second', 'two')));
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Fourth', 'four');
+ $set->addTextHeader('Fifth', 'five');
+ $set->addTextHeader('Third', 'three');
+ $set->addTextHeader('First', 'one');
+ $set->addTextHeader('Second', 'two');
+
+ $set->defineOrdering(array('First', 'Second', 'Third'));
+
+ $this->assertEquals(
+ "First: one\r\n".
+ "Second: two\r\n".
+ "Third: three\r\n".
+ "Fourth: four\r\n".
+ "Fifth: five\r\n",
+ $set->toString()
+ );
+ }
+
+ public function testSettingCharsetNotifiesAlreadyExistingHeaders()
+ {
+ $subject = $this->_createHeader('Subject', 'some text');
+ $xHeader = $this->_createHeader('X-Header', 'some text');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Subject', 'some text')
+ ->will($this->returnValue($subject));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('X-Header', 'some text')
+ ->will($this->returnValue($xHeader));
+ $subject->expects($this->once())
+ ->method('setCharset')
+ ->with('utf-8');
+ $xHeader->expects($this->once())
+ ->method('setCharset')
+ ->with('utf-8');
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Subject', 'some text');
+ $set->addTextHeader('X-Header', 'some text');
+
+ $set->setCharset('utf-8');
+ }
+
+ public function testCharsetChangeNotifiesAlreadyExistingHeaders()
+ {
+ $subject = $this->_createHeader('Subject', 'some text');
+ $xHeader = $this->_createHeader('X-Header', 'some text');
+ $factory = $this->_createFactory();
+ $factory->expects($this->at(0))
+ ->method('createTextHeader')
+ ->with('Subject', 'some text')
+ ->will($this->returnValue($subject));
+ $factory->expects($this->at(1))
+ ->method('createTextHeader')
+ ->with('X-Header', 'some text')
+ ->will($this->returnValue($xHeader));
+ $subject->expects($this->once())
+ ->method('setCharset')
+ ->with('utf-8');
+ $xHeader->expects($this->once())
+ ->method('setCharset')
+ ->with('utf-8');
+
+ $set = $this->_createSet($factory);
+ $set->addTextHeader('Subject', 'some text');
+ $set->addTextHeader('X-Header', 'some text');
+
+ $set->charsetChanged('utf-8');
+ }
+
+ public function testCharsetChangeNotifiesFactory()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('charsetChanged')
+ ->with('utf-8');
+
+ $set = $this->_createSet($factory);
+
+ $set->setCharset('utf-8');
+ }
+
+ private function _createSet($factory)
+ {
+ return new Swift_Mime_SimpleHeaderSet($factory);
+ }
+
+ private function _createFactory()
+ {
+ return $this->getMockBuilder('Swift_Mime_HeaderFactory')->getMock();
+ }
+
+ private function _createHeader($name, $body = '')
+ {
+ $header = $this->getMockBuilder('Swift_Mime_Header')->getMock();
+ $header->expects($this->any())
+ ->method('getFieldName')
+ ->will($this->returnValue($name));
+ $header->expects($this->any())
+ ->method('toString')
+ ->will($this->returnValue(sprintf("%s: %s\r\n", $name, $body)));
+ $header->expects($this->any())
+ ->method('getFieldBody')
+ ->will($this->returnValue($body));
+
+ return $header;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php
new file mode 100644
index 0000000..e5d225c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMessageTest.php
@@ -0,0 +1,827 @@
+<?php
+
+class Swift_Mime_SimpleMessageTest extends Swift_Mime_MimePartTest
+{
+ public function testNestingLevelIsSubpart()
+ {
+ //Overridden
+ }
+
+ public function testNestingLevelIsTop()
+ {
+ $message = $this->_createMessage($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(
+ Swift_Mime_MimeEntity::LEVEL_TOP, $message->getNestingLevel()
+ );
+ }
+
+ public function testDateIsReturnedFromHeader()
+ {
+ $date = $this->_createHeader('Date', 123);
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Date' => $date)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(123, $message->getDate());
+ }
+
+ public function testDateIsSetInHeader()
+ {
+ $date = $this->_createHeader('Date', 123, array(), false);
+ $date->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(1234);
+ $date->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Date' => $date)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setDate(1234);
+ }
+
+ public function testDateHeaderIsCreatedIfNonePresent()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addDateHeader')
+ ->once()
+ ->with('Date', 1234);
+ $headers->shouldReceive('addDateHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setDate(1234);
+ }
+
+ public function testDateHeaderIsAddedDuringConstruction()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addDateHeader')
+ ->once()
+ ->with('Date', '/^[0-9]+$/D');
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ }
+
+ public function testIdIsReturnedFromHeader()
+ {
+ /* -- RFC 2045, 7.
+ In constructing a high-level user agent, it may be desirable to allow
+ one body to make reference to another. Accordingly, bodies may be
+ labelled using the "Content-ID" header field, which is syntactically
+ identical to the "Message-ID" header field
+ */
+
+ $messageId = $this->_createHeader('Message-ID', 'a@b');
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Message-ID' => $messageId)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('a@b', $message->getId());
+ }
+
+ public function testIdIsSetInHeader()
+ {
+ $messageId = $this->_createHeader('Message-ID', 'a@b', array(), false);
+ $messageId->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('x@y');
+ $messageId->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Message-ID' => $messageId)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setId('x@y');
+ }
+
+ public function testIdIsAutoGenerated()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addIdHeader')
+ ->once()
+ ->with('Message-ID', '/^.*?@.*?$/D');
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ }
+
+ public function testSubjectIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.5.
+ */
+
+ $subject = $this->_createHeader('Subject', 'example subject');
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Subject' => $subject)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('example subject', $message->getSubject());
+ }
+
+ public function testSubjectIsSetInHeader()
+ {
+ $subject = $this->_createHeader('Subject', '', array(), false);
+ $subject->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('foo');
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Subject' => $subject)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setSubject('foo');
+ }
+
+ public function testSubjectHeaderIsCreatedIfNotPresent()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addTextHeader')
+ ->once()
+ ->with('Subject', 'example subject');
+ $headers->shouldReceive('addTextHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setSubject('example subject');
+ }
+
+ public function testReturnPathIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.7.
+ */
+
+ $path = $this->_createHeader('Return-Path', 'bounces@domain');
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Return-Path' => $path)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals('bounces@domain', $message->getReturnPath());
+ }
+
+ public function testReturnPathIsSetInHeader()
+ {
+ $path = $this->_createHeader('Return-Path', '', array(), false);
+ $path->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('bounces@domain');
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Return-Path' => $path)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setReturnPath('bounces@domain');
+ }
+
+ public function testReturnPathHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addPathHeader')
+ ->once()
+ ->with('Return-Path', 'bounces@domain');
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setReturnPath('bounces@domain');
+ }
+
+ public function testSenderIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.2.
+ */
+
+ $sender = $this->_createHeader('Sender', array('sender@domain' => 'Name'));
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Sender' => $sender)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('sender@domain' => 'Name'), $message->getSender());
+ }
+
+ public function testSenderIsSetInHeader()
+ {
+ $sender = $this->_createHeader('Sender', array('sender@domain' => 'Name'),
+ array(), false
+ );
+ $sender->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Sender' => $sender)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setSender(array('other@domain' => 'Other'));
+ }
+
+ public function testSenderHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Sender', (array) 'sender@domain');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setSender('sender@domain');
+ }
+
+ public function testNameCanBeUsedInSenderHeader()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Sender', array('sender@domain' => 'Name'));
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setSender('sender@domain', 'Name');
+ }
+
+ public function testFromIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.2.
+ */
+
+ $from = $this->_createHeader('From', array('from@domain' => 'Name'));
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('From' => $from)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('from@domain' => 'Name'), $message->getFrom());
+ }
+
+ public function testFromIsSetInHeader()
+ {
+ $from = $this->_createHeader('From', array('from@domain' => 'Name'),
+ array(), false
+ );
+ $from->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('From' => $from)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setFrom(array('other@domain' => 'Other'));
+ }
+
+ public function testFromIsAddedToHeadersDuringAddFrom()
+ {
+ $from = $this->_createHeader('From', array('from@domain' => 'Name'),
+ array(), false
+ );
+ $from->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('from@domain' => 'Name', 'other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('From' => $from)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->addFrom('other@domain', 'Other');
+ }
+
+ public function testFromHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('From', (array) 'from@domain');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setFrom('from@domain');
+ }
+
+ public function testPersonalNameCanBeUsedInFromAddress()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('From', array('from@domain' => 'Name'));
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setFrom('from@domain', 'Name');
+ }
+
+ public function testReplyToIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.2.
+ */
+
+ $reply = $this->_createHeader('Reply-To', array('reply@domain' => 'Name'));
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Reply-To' => $reply)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('reply@domain' => 'Name'), $message->getReplyTo());
+ }
+
+ public function testReplyToIsSetInHeader()
+ {
+ $reply = $this->_createHeader('Reply-To', array('reply@domain' => 'Name'),
+ array(), false
+ );
+ $reply->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Reply-To' => $reply)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setReplyTo(array('other@domain' => 'Other'));
+ }
+
+ public function testReplyToIsAddedToHeadersDuringAddReplyTo()
+ {
+ $replyTo = $this->_createHeader('Reply-To', array('from@domain' => 'Name'),
+ array(), false
+ );
+ $replyTo->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('from@domain' => 'Name', 'other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Reply-To' => $replyTo)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->addReplyTo('other@domain', 'Other');
+ }
+
+ public function testReplyToHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Reply-To', (array) 'reply@domain');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setReplyTo('reply@domain');
+ }
+
+ public function testNameCanBeUsedInReplyTo()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Reply-To', array('reply@domain' => 'Name'));
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setReplyTo('reply@domain', 'Name');
+ }
+
+ public function testToIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.3.
+ */
+
+ $to = $this->_createHeader('To', array('to@domain' => 'Name'));
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('To' => $to)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('to@domain' => 'Name'), $message->getTo());
+ }
+
+ public function testToIsSetInHeader()
+ {
+ $to = $this->_createHeader('To', array('to@domain' => 'Name'),
+ array(), false
+ );
+ $to->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('To' => $to)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setTo(array('other@domain' => 'Other'));
+ }
+
+ public function testToIsAddedToHeadersDuringAddTo()
+ {
+ $to = $this->_createHeader('To', array('from@domain' => 'Name'),
+ array(), false
+ );
+ $to->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('from@domain' => 'Name', 'other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('To' => $to)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->addTo('other@domain', 'Other');
+ }
+
+ public function testToHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('To', (array) 'to@domain');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setTo('to@domain');
+ }
+
+ public function testNameCanBeUsedInToHeader()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('To', array('to@domain' => 'Name'));
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setTo('to@domain', 'Name');
+ }
+
+ public function testCcIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.3.
+ */
+
+ $cc = $this->_createHeader('Cc', array('cc@domain' => 'Name'));
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Cc' => $cc)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('cc@domain' => 'Name'), $message->getCc());
+ }
+
+ public function testCcIsSetInHeader()
+ {
+ $cc = $this->_createHeader('Cc', array('cc@domain' => 'Name'),
+ array(), false
+ );
+ $cc->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Cc' => $cc)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setCc(array('other@domain' => 'Other'));
+ }
+
+ public function testCcIsAddedToHeadersDuringAddCc()
+ {
+ $cc = $this->_createHeader('Cc', array('from@domain' => 'Name'),
+ array(), false
+ );
+ $cc->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('from@domain' => 'Name', 'other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Cc' => $cc)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->addCc('other@domain', 'Other');
+ }
+
+ public function testCcHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Cc', (array) 'cc@domain');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setCc('cc@domain');
+ }
+
+ public function testNameCanBeUsedInCcHeader()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Cc', array('cc@domain' => 'Name'));
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setCc('cc@domain', 'Name');
+ }
+
+ public function testBccIsReturnedFromHeader()
+ {
+ /* -- RFC 2822, 3.6.3.
+ */
+
+ $bcc = $this->_createHeader('Bcc', array('bcc@domain' => 'Name'));
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Bcc' => $bcc)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('bcc@domain' => 'Name'), $message->getBcc());
+ }
+
+ public function testBccIsSetInHeader()
+ {
+ $bcc = $this->_createHeader('Bcc', array('bcc@domain' => 'Name'),
+ array(), false
+ );
+ $bcc->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Bcc' => $bcc)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setBcc(array('other@domain' => 'Other'));
+ }
+
+ public function testBccIsAddedToHeadersDuringAddBcc()
+ {
+ $bcc = $this->_createHeader('Bcc', array('from@domain' => 'Name'),
+ array(), false
+ );
+ $bcc->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with(array('from@domain' => 'Name', 'other@domain' => 'Other'));
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Bcc' => $bcc)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->addBcc('other@domain', 'Other');
+ }
+
+ public function testBccHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Bcc', (array) 'bcc@domain');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setBcc('bcc@domain');
+ }
+
+ public function testNameCanBeUsedInBcc()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Bcc', array('bcc@domain' => 'Name'));
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setBcc('bcc@domain', 'Name');
+ }
+
+ public function testPriorityIsReadFromHeader()
+ {
+ $prio = $this->_createHeader('X-Priority', '2 (High)');
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('X-Priority' => $prio)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(2, $message->getPriority());
+ }
+
+ public function testPriorityIsSetInHeader()
+ {
+ $prio = $this->_createHeader('X-Priority', '2 (High)', array(), false);
+ $prio->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('5 (Lowest)');
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('X-Priority' => $prio)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setPriority($message::PRIORITY_LOWEST);
+ }
+
+ public function testPriorityHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addTextHeader')
+ ->once()
+ ->with('X-Priority', '4 (Low)');
+ $headers->shouldReceive('addTextHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setPriority($message::PRIORITY_LOW);
+ }
+
+ public function testReadReceiptAddressReadFromHeader()
+ {
+ $rcpt = $this->_createHeader('Disposition-Notification-To',
+ array('chris@swiftmailer.org' => 'Chris')
+ );
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Disposition-Notification-To' => $rcpt)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertEquals(array('chris@swiftmailer.org' => 'Chris'),
+ $message->getReadReceiptTo()
+ );
+ }
+
+ public function testReadReceiptIsSetInHeader()
+ {
+ $rcpt = $this->_createHeader('Disposition-Notification-To', array(), array(), false);
+ $rcpt->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('mark@swiftmailer.org');
+
+ $message = $this->_createMessage(
+ $this->_createHeaderSet(array('Disposition-Notification-To' => $rcpt)),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $message->setReadReceiptTo('mark@swiftmailer.org');
+ }
+
+ public function testReadReceiptHeaderIsAddedIfNoneSet()
+ {
+ $headers = $this->_createHeaderSet(array(), false);
+ $headers->shouldReceive('addMailboxHeader')
+ ->once()
+ ->with('Disposition-Notification-To', 'mark@swiftmailer.org');
+ $headers->shouldReceive('addMailboxHeader')
+ ->zeroOrMoreTimes();
+
+ $message = $this->_createMessage($headers, $this->_createEncoder(),
+ $this->_createCache()
+ );
+ $message->setReadReceiptTo('mark@swiftmailer.org');
+ }
+
+ public function testChildrenCanBeAttached()
+ {
+ $child1 = $this->_createChild();
+ $child2 = $this->_createChild();
+
+ $message = $this->_createMessage($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $message->attach($child1);
+ $message->attach($child2);
+
+ $this->assertEquals(array($child1, $child2), $message->getChildren());
+ }
+
+ public function testChildrenCanBeDetached()
+ {
+ $child1 = $this->_createChild();
+ $child2 = $this->_createChild();
+
+ $message = $this->_createMessage($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $message->attach($child1);
+ $message->attach($child2);
+
+ $message->detach($child1);
+
+ $this->assertEquals(array($child2), $message->getChildren());
+ }
+
+ public function testEmbedAttachesChild()
+ {
+ $child = $this->_createChild();
+
+ $message = $this->_createMessage($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $message->embed($child);
+
+ $this->assertEquals(array($child), $message->getChildren());
+ }
+
+ public function testEmbedReturnsValidCid()
+ {
+ $child = $this->_createChild(Swift_Mime_MimeEntity::LEVEL_RELATED, '',
+ false
+ );
+ $child->shouldReceive('getId')
+ ->zeroOrMoreTimes()
+ ->andReturn('foo@bar');
+
+ $message = $this->_createMessage($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+
+ $this->assertEquals('cid:foo@bar', $message->embed($child));
+ }
+
+ public function testFluidInterface()
+ {
+ $child = $this->_createChild();
+ $message = $this->_createMessage($this->_createHeaderSet(),
+ $this->_createEncoder(), $this->_createCache()
+ );
+ $this->assertSame($message,
+ $message
+ ->setContentType('text/plain')
+ ->setEncoder($this->_createEncoder())
+ ->setId('foo@bar')
+ ->setDescription('my description')
+ ->setMaxLineLength(998)
+ ->setBody('xx')
+ ->setBoundary('xyz')
+ ->setChildren(array())
+ ->setCharset('iso-8859-1')
+ ->setFormat('flowed')
+ ->setDelSp(false)
+ ->setSubject('subj')
+ ->setDate(123)
+ ->setReturnPath('foo@bar')
+ ->setSender('foo@bar')
+ ->setFrom(array('x@y' => 'XY'))
+ ->setReplyTo(array('ab@cd' => 'ABCD'))
+ ->setTo(array('chris@site.tld', 'mark@site.tld'))
+ ->setCc('john@somewhere.tld')
+ ->setBcc(array('one@site', 'two@site' => 'Two'))
+ ->setPriority($message::PRIORITY_LOW)
+ ->setReadReceiptTo('a@b')
+ ->attach($child)
+ ->detach($child)
+ );
+ }
+
+ //abstract
+ protected function _createEntity($headers, $encoder, $cache)
+ {
+ return $this->_createMessage($headers, $encoder, $cache);
+ }
+
+ protected function _createMimePart($headers, $encoder, $cache)
+ {
+ return $this->_createMessage($headers, $encoder, $cache);
+ }
+
+ private function _createMessage($headers, $encoder, $cache)
+ {
+ return new Swift_Mime_SimpleMessage($headers, $encoder, $cache, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php
new file mode 100644
index 0000000..fa2a8d4
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Mime/SimpleMimeEntityTest.php
@@ -0,0 +1,9 @@
+<?php
+
+class Swift_Mime_SimpleMimeEntityTest extends Swift_Mime_AbstractMimeEntityTest
+{
+ protected function _createEntity($headerFactory, $encoder, $cache)
+ {
+ return new Swift_Mime_SimpleMimeEntity($headerFactory, $encoder, $cache, new Swift_Mime_Grammar());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/AntiFloodPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/AntiFloodPluginTest.php
new file mode 100644
index 0000000..463e4eb
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/AntiFloodPluginTest.php
@@ -0,0 +1,93 @@
+<?php
+
+class Swift_Plugins_AntiFloodPluginTest extends \PHPUnit_Framework_TestCase
+{
+ public function testThresholdCanBeSetAndFetched()
+ {
+ $plugin = new Swift_Plugins_AntiFloodPlugin(10);
+ $this->assertEquals(10, $plugin->getThreshold());
+ $plugin->setThreshold(100);
+ $this->assertEquals(100, $plugin->getThreshold());
+ }
+
+ public function testSleepTimeCanBeSetAndFetched()
+ {
+ $plugin = new Swift_Plugins_AntiFloodPlugin(10, 5);
+ $this->assertEquals(5, $plugin->getSleepTime());
+ $plugin->setSleepTime(1);
+ $this->assertEquals(1, $plugin->getSleepTime());
+ }
+
+ public function testPluginStopsConnectionAfterThreshold()
+ {
+ $transport = $this->_createTransport();
+ $transport->expects($this->once())
+ ->method('start');
+ $transport->expects($this->once())
+ ->method('stop');
+
+ $evt = $this->_createSendEvent($transport);
+
+ $plugin = new Swift_Plugins_AntiFloodPlugin(10);
+ for ($i = 0; $i < 12; ++$i) {
+ $plugin->sendPerformed($evt);
+ }
+ }
+
+ public function testPluginCanStopAndStartMultipleTimes()
+ {
+ $transport = $this->_createTransport();
+ $transport->expects($this->exactly(5))
+ ->method('start');
+ $transport->expects($this->exactly(5))
+ ->method('stop');
+
+ $evt = $this->_createSendEvent($transport);
+
+ $plugin = new Swift_Plugins_AntiFloodPlugin(2);
+ for ($i = 0; $i < 11; ++$i) {
+ $plugin->sendPerformed($evt);
+ }
+ }
+
+ public function testPluginCanSleepDuringRestart()
+ {
+ $sleeper = $this->getMockBuilder('Swift_Plugins_Sleeper')->getMock();
+ $sleeper->expects($this->once())
+ ->method('sleep')
+ ->with(10);
+
+ $transport = $this->_createTransport();
+ $transport->expects($this->once())
+ ->method('start');
+ $transport->expects($this->once())
+ ->method('stop');
+
+ $evt = $this->_createSendEvent($transport);
+
+ $plugin = new Swift_Plugins_AntiFloodPlugin(99, 10, $sleeper);
+ for ($i = 0; $i < 101; ++$i) {
+ $plugin->sendPerformed($evt);
+ }
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+
+ private function _createSendEvent($transport)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_SendEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getSource')
+ ->will($this->returnValue($transport));
+ $evt->expects($this->any())
+ ->method('getTransport')
+ ->will($this->returnValue($transport));
+
+ return $evt;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php
new file mode 100644
index 0000000..869cfc8
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/BandwidthMonitorPluginTest.php
@@ -0,0 +1,128 @@
+<?php
+
+class Swift_Plugins_BandwidthMonitorPluginTest extends \PHPUnit_Framework_TestCase
+{
+ private $_monitor;
+
+ private $_bytes = 0;
+
+ protected function setUp()
+ {
+ $this->_monitor = new Swift_Plugins_BandwidthMonitorPlugin();
+ }
+
+ public function testBytesOutIncreasesWhenCommandsSent()
+ {
+ $evt = $this->_createCommandEvent("RCPT TO:<foo@bar.com>\r\n");
+
+ $this->assertEquals(0, $this->_monitor->getBytesOut());
+ $this->_monitor->commandSent($evt);
+ $this->assertEquals(23, $this->_monitor->getBytesOut());
+ $this->_monitor->commandSent($evt);
+ $this->assertEquals(46, $this->_monitor->getBytesOut());
+ }
+
+ public function testBytesInIncreasesWhenResponsesReceived()
+ {
+ $evt = $this->_createResponseEvent("250 Ok\r\n");
+
+ $this->assertEquals(0, $this->_monitor->getBytesIn());
+ $this->_monitor->responseReceived($evt);
+ $this->assertEquals(8, $this->_monitor->getBytesIn());
+ $this->_monitor->responseReceived($evt);
+ $this->assertEquals(16, $this->_monitor->getBytesIn());
+ }
+
+ public function testCountersCanBeReset()
+ {
+ $evt = $this->_createResponseEvent("250 Ok\r\n");
+
+ $this->assertEquals(0, $this->_monitor->getBytesIn());
+ $this->_monitor->responseReceived($evt);
+ $this->assertEquals(8, $this->_monitor->getBytesIn());
+ $this->_monitor->responseReceived($evt);
+ $this->assertEquals(16, $this->_monitor->getBytesIn());
+
+ $evt = $this->_createCommandEvent("RCPT TO:<foo@bar.com>\r\n");
+
+ $this->assertEquals(0, $this->_monitor->getBytesOut());
+ $this->_monitor->commandSent($evt);
+ $this->assertEquals(23, $this->_monitor->getBytesOut());
+ $this->_monitor->commandSent($evt);
+ $this->assertEquals(46, $this->_monitor->getBytesOut());
+
+ $this->_monitor->reset();
+
+ $this->assertEquals(0, $this->_monitor->getBytesOut());
+ $this->assertEquals(0, $this->_monitor->getBytesIn());
+ }
+
+ public function testBytesOutIncreasesAccordingToMessageLength()
+ {
+ $message = $this->_createMessageWithByteCount(6);
+ $evt = $this->_createSendEvent($message);
+
+ $this->assertEquals(0, $this->_monitor->getBytesOut());
+ $this->_monitor->sendPerformed($evt);
+ $this->assertEquals(6, $this->_monitor->getBytesOut());
+ $this->_monitor->sendPerformed($evt);
+ $this->assertEquals(12, $this->_monitor->getBytesOut());
+ }
+
+ private function _createSendEvent($message)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_SendEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getMessage')
+ ->will($this->returnValue($message));
+
+ return $evt;
+ }
+
+ private function _createCommandEvent($command)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_CommandEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getCommand')
+ ->will($this->returnValue($command));
+
+ return $evt;
+ }
+
+ private function _createResponseEvent($response)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_ResponseEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getResponse')
+ ->will($this->returnValue($response));
+
+ return $evt;
+ }
+
+ private function _createMessageWithByteCount($bytes)
+ {
+ $this->_bytes = $bytes;
+ $msg = $this->getMockBuilder('Swift_Mime_Message')->getMock();
+ $msg->expects($this->any())
+ ->method('toByteStream')
+ ->will($this->returnCallback(array($this, '_write')));
+ /* $this->_checking(Expectations::create()
+ -> ignoring($msg)->toByteStream(any()) -> calls(array($this, '_write'))
+ ); */
+
+ return $msg;
+ }
+
+ public function _write($is)
+ {
+ for ($i = 0; $i < $this->_bytes; ++$i) {
+ $is->write('x');
+ }
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php
new file mode 100644
index 0000000..8019dfb
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/DecoratorPluginTest.php
@@ -0,0 +1,267 @@
+<?php
+
+class Swift_Plugins_DecoratorPluginTest extends \SwiftMailerTestCase
+{
+ public function testMessageBodyReceivesReplacements()
+ {
+ $message = $this->_createMessage(
+ $this->_createHeaders(),
+ array('zip@button.tld' => 'Zipathon'),
+ array('chris.corbyn@swiftmailer.org' => 'Chris'),
+ 'Subject',
+ 'Hello {name}, you are customer #{id}'
+ );
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Hello Zip, you are customer #456');
+ $message->shouldReceive('setBody')
+ ->zeroOrMoreTimes();
+
+ $plugin = $this->_createPlugin(
+ array('zip@button.tld' => array('{name}' => 'Zip', '{id}' => '456'))
+ );
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReplacementsCanBeAppliedToSameMessageMultipleTimes()
+ {
+ $message = $this->_createMessage(
+ $this->_createHeaders(),
+ array('zip@button.tld' => 'Zipathon', 'foo@bar.tld' => 'Foo'),
+ array('chris.corbyn@swiftmailer.org' => 'Chris'),
+ 'Subject',
+ 'Hello {name}, you are customer #{id}'
+ );
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Hello Zip, you are customer #456');
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Hello {name}, you are customer #{id}');
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Hello Foo, you are customer #123');
+ $message->shouldReceive('setBody')
+ ->zeroOrMoreTimes();
+
+ $plugin = $this->_createPlugin(
+ array(
+ 'foo@bar.tld' => array('{name}' => 'Foo', '{id}' => '123'),
+ 'zip@button.tld' => array('{name}' => 'Zip', '{id}' => '456'),
+ )
+ );
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReplacementsCanBeMadeInHeaders()
+ {
+ $headers = $this->_createHeaders(array(
+ $returnPathHeader = $this->_createHeader('Return-Path', 'foo-{id}@swiftmailer.org'),
+ $toHeader = $this->_createHeader('Subject', 'A message for {name}!'),
+ ));
+
+ $message = $this->_createMessage(
+ $headers,
+ array('zip@button.tld' => 'Zipathon'),
+ array('chris.corbyn@swiftmailer.org' => 'Chris'),
+ 'A message for {name}!',
+ 'Hello {name}, you are customer #{id}'
+ );
+
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Hello Zip, you are customer #456');
+ $toHeader->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('A message for Zip!');
+ $returnPathHeader->shouldReceive('setFieldBodyModel')
+ ->once()
+ ->with('foo-456@swiftmailer.org');
+ $message->shouldReceive('setBody')
+ ->zeroOrMoreTimes();
+ $toHeader->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+ $returnPathHeader->shouldReceive('setFieldBodyModel')
+ ->zeroOrMoreTimes();
+
+ $plugin = $this->_createPlugin(
+ array('zip@button.tld' => array('{name}' => 'Zip', '{id}' => '456'))
+ );
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReplacementsAreMadeOnSubparts()
+ {
+ $part1 = $this->_createPart('text/plain', 'Your name is {name}?', '1@x');
+ $part2 = $this->_createPart('text/html', 'Your <em>name</em> is {name}?', '2@x');
+ $message = $this->_createMessage(
+ $this->_createHeaders(),
+ array('zip@button.tld' => 'Zipathon'),
+ array('chris.corbyn@swiftmailer.org' => 'Chris'),
+ 'A message for {name}!',
+ 'Subject'
+ );
+ $message->shouldReceive('getChildren')
+ ->zeroOrMoreTimes()
+ ->andReturn(array($part1, $part2));
+ $part1->shouldReceive('setBody')
+ ->once()
+ ->with('Your name is Zip?');
+ $part2->shouldReceive('setBody')
+ ->once()
+ ->with('Your <em>name</em> is Zip?');
+ $part1->shouldReceive('setBody')
+ ->zeroOrMoreTimes();
+ $part2->shouldReceive('setBody')
+ ->zeroOrMoreTimes();
+
+ $plugin = $this->_createPlugin(
+ array('zip@button.tld' => array('{name}' => 'Zip', '{id}' => '456'))
+ );
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReplacementsCanBeTakenFromCustomReplacementsObject()
+ {
+ $message = $this->_createMessage(
+ $this->_createHeaders(),
+ array('foo@bar' => 'Foobar', 'zip@zap' => 'Zip zap'),
+ array('chris.corbyn@swiftmailer.org' => 'Chris'),
+ 'Subject',
+ 'Something {a}'
+ );
+
+ $replacements = $this->_createReplacements();
+
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Something b');
+ $message->shouldReceive('setBody')
+ ->once()
+ ->with('Something c');
+ $message->shouldReceive('setBody')
+ ->zeroOrMoreTimes();
+ $replacements->shouldReceive('getReplacementsFor')
+ ->once()
+ ->with('foo@bar')
+ ->andReturn(array('{a}' => 'b'));
+ $replacements->shouldReceive('getReplacementsFor')
+ ->once()
+ ->with('zip@zap')
+ ->andReturn(array('{a}' => 'c'));
+
+ $plugin = $this->_createPlugin($replacements);
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+
+ private function _createMessage($headers, $to = array(), $from = null, $subject = null,
+ $body = null)
+ {
+ $message = $this->getMockery('Swift_Mime_Message')->shouldIgnoreMissing();
+ foreach ($to as $addr => $name) {
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array($addr => $name));
+ }
+ $message->shouldReceive('getHeaders')
+ ->zeroOrMoreTimes()
+ ->andReturn($headers);
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn($from);
+ $message->shouldReceive('getSubject')
+ ->zeroOrMoreTimes()
+ ->andReturn($subject);
+ $message->shouldReceive('getBody')
+ ->zeroOrMoreTimes()
+ ->andReturn($body);
+
+ return $message;
+ }
+
+ private function _createPlugin($replacements)
+ {
+ return new Swift_Plugins_DecoratorPlugin($replacements);
+ }
+
+ private function _createReplacements()
+ {
+ return $this->getMockery('Swift_Plugins_Decorator_Replacements')->shouldIgnoreMissing();
+ }
+
+ private function _createSendEvent(Swift_Mime_Message $message)
+ {
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ $evt->shouldReceive('getMessage')
+ ->zeroOrMoreTimes()
+ ->andReturn($message);
+
+ return $evt;
+ }
+
+ private function _createPart($type, $body, $id)
+ {
+ $part = $this->getMockery('Swift_Mime_MimeEntity')->shouldIgnoreMissing();
+ $part->shouldReceive('getContentType')
+ ->zeroOrMoreTimes()
+ ->andReturn($type);
+ $part->shouldReceive('getBody')
+ ->zeroOrMoreTimes()
+ ->andReturn($body);
+ $part->shouldReceive('getId')
+ ->zeroOrMoreTimes()
+ ->andReturn($id);
+
+ return $part;
+ }
+
+ private function _createHeaders($headers = array())
+ {
+ $set = $this->getMockery('Swift_Mime_HeaderSet')->shouldIgnoreMissing();
+ $set->shouldReceive('getAll')
+ ->zeroOrMoreTimes()
+ ->andReturn($headers);
+
+ foreach ($headers as $header) {
+ $set->set($header);
+ }
+
+ return $set;
+ }
+
+ private function _createHeader($name, $body = '')
+ {
+ $header = $this->getMockery('Swift_Mime_Header')->shouldIgnoreMissing();
+ $header->shouldReceive('getFieldName')
+ ->zeroOrMoreTimes()
+ ->andReturn($name);
+ $header->shouldReceive('getFieldBodyModel')
+ ->zeroOrMoreTimes()
+ ->andReturn($body);
+
+ return $header;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php
new file mode 100644
index 0000000..bfe4cb7
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/LoggerPluginTest.php
@@ -0,0 +1,188 @@
+<?php
+
+class Swift_Plugins_LoggerPluginTest extends \SwiftMailerTestCase
+{
+ public function testLoggerDelegatesAddingEntries()
+ {
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with('foo');
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->add('foo');
+ }
+
+ public function testLoggerDelegatesDumpingEntries()
+ {
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('dump')
+ ->will($this->returnValue('foobar'));
+
+ $plugin = $this->_createPlugin($logger);
+ $this->assertEquals('foobar', $plugin->dump());
+ }
+
+ public function testLoggerDelegatesClearingEntries()
+ {
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('clear');
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->clear();
+ }
+
+ public function testCommandIsSentToLogger()
+ {
+ $evt = $this->_createCommandEvent("foo\r\n");
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->regExp('~foo\r\n~'));
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->commandSent($evt);
+ }
+
+ public function testResponseIsSentToLogger()
+ {
+ $evt = $this->_createResponseEvent("354 Go ahead\r\n");
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->regExp('~354 Go ahead\r\n~'));
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->responseReceived($evt);
+ }
+
+ public function testTransportBeforeStartChangeIsSentToLogger()
+ {
+ $evt = $this->_createTransportChangeEvent();
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->anything());
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->beforeTransportStarted($evt);
+ }
+
+ public function testTransportStartChangeIsSentToLogger()
+ {
+ $evt = $this->_createTransportChangeEvent();
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->anything());
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->transportStarted($evt);
+ }
+
+ public function testTransportStopChangeIsSentToLogger()
+ {
+ $evt = $this->_createTransportChangeEvent();
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->anything());
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->transportStopped($evt);
+ }
+
+ public function testTransportBeforeStopChangeIsSentToLogger()
+ {
+ $evt = $this->_createTransportChangeEvent();
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->anything());
+
+ $plugin = $this->_createPlugin($logger);
+ $plugin->beforeTransportStopped($evt);
+ }
+
+ public function testExceptionsArePassedToDelegateAndLeftToBubbleUp()
+ {
+ $transport = $this->_createTransport();
+ $evt = $this->_createTransportExceptionEvent();
+ $logger = $this->_createLogger();
+ $logger->expects($this->once())
+ ->method('add')
+ ->with($this->anything());
+
+ $plugin = $this->_createPlugin($logger);
+ try {
+ $plugin->exceptionThrown($evt);
+ $this->fail('Exception should bubble up.');
+ } catch (Swift_TransportException $ex) {
+ }
+ }
+
+ private function _createLogger()
+ {
+ return $this->getMockBuilder('Swift_Plugins_Logger')->getMock();
+ }
+
+ private function _createPlugin($logger)
+ {
+ return new Swift_Plugins_LoggerPlugin($logger);
+ }
+
+ private function _createCommandEvent($command)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_CommandEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getCommand')
+ ->will($this->returnValue($command));
+
+ return $evt;
+ }
+
+ private function _createResponseEvent($response)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_ResponseEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getResponse')
+ ->will($this->returnValue($response));
+
+ return $evt;
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+
+ private function _createTransportChangeEvent()
+ {
+ $evt = $this->getMockBuilder('Swift_Events_TransportChangeEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getSource')
+ ->will($this->returnValue($this->_createTransport()));
+
+ return $evt;
+ }
+
+ public function _createTransportExceptionEvent()
+ {
+ $evt = $this->getMockBuilder('Swift_Events_TransportExceptionEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getException')
+ ->will($this->returnValue(new Swift_TransportException('')));
+
+ return $evt;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php
new file mode 100644
index 0000000..880bb32
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/ArrayLoggerTest.php
@@ -0,0 +1,65 @@
+<?php
+
+class Swift_Plugins_Loggers_ArrayLoggerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testAddingSingleEntryDumpsSingleLine()
+ {
+ $logger = new Swift_Plugins_Loggers_ArrayLogger();
+ $logger->add(">> Foo\r\n");
+ $this->assertEquals(">> Foo\r\n", $logger->dump());
+ }
+
+ public function testAddingMultipleEntriesDumpsMultipleLines()
+ {
+ $logger = new Swift_Plugins_Loggers_ArrayLogger();
+ $logger->add(">> FOO\r\n");
+ $logger->add("<< 502 That makes no sense\r\n");
+ $logger->add(">> RSET\r\n");
+ $logger->add("<< 250 OK\r\n");
+
+ $this->assertEquals(
+ ">> FOO\r\n".PHP_EOL.
+ "<< 502 That makes no sense\r\n".PHP_EOL.
+ ">> RSET\r\n".PHP_EOL.
+ "<< 250 OK\r\n",
+ $logger->dump()
+ );
+ }
+
+ public function testLogCanBeCleared()
+ {
+ $logger = new Swift_Plugins_Loggers_ArrayLogger();
+ $logger->add(">> FOO\r\n");
+ $logger->add("<< 502 That makes no sense\r\n");
+ $logger->add(">> RSET\r\n");
+ $logger->add("<< 250 OK\r\n");
+
+ $this->assertEquals(
+ ">> FOO\r\n".PHP_EOL.
+ "<< 502 That makes no sense\r\n".PHP_EOL.
+ ">> RSET\r\n".PHP_EOL.
+ "<< 250 OK\r\n",
+ $logger->dump()
+ );
+
+ $logger->clear();
+
+ $this->assertEquals('', $logger->dump());
+ }
+
+ public function testLengthCanBeTruncated()
+ {
+ $logger = new Swift_Plugins_Loggers_ArrayLogger(2);
+ $logger->add(">> FOO\r\n");
+ $logger->add("<< 502 That makes no sense\r\n");
+ $logger->add(">> RSET\r\n");
+ $logger->add("<< 250 OK\r\n");
+
+ $this->assertEquals(
+ ">> RSET\r\n".PHP_EOL.
+ "<< 250 OK\r\n",
+ $logger->dump(),
+ '%s: Log should be truncated to last 2 entries'
+ );
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php
new file mode 100644
index 0000000..6134fe6
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Loggers/EchoLoggerTest.php
@@ -0,0 +1,24 @@
+<?php
+
+class Swift_Plugins_Loggers_EchoLoggerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testAddingEntryDumpsSingleLineWithoutHtml()
+ {
+ $logger = new Swift_Plugins_Loggers_EchoLogger(false);
+ ob_start();
+ $logger->add('>> Foo');
+ $data = ob_get_clean();
+
+ $this->assertEquals('>> Foo'.PHP_EOL, $data);
+ }
+
+ public function testAddingEntryDumpsEscapedLineWithHtml()
+ {
+ $logger = new Swift_Plugins_Loggers_EchoLogger(true);
+ ob_start();
+ $logger->add('>> Foo');
+ $data = ob_get_clean();
+
+ $this->assertEquals('&gt;&gt; Foo<br />'.PHP_EOL, $data);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php
new file mode 100644
index 0000000..cbd368f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/PopBeforeSmtpPluginTest.php
@@ -0,0 +1,101 @@
+<?php
+
+class Swift_Plugins_PopBeforeSmtpPluginTest extends \PHPUnit_Framework_TestCase
+{
+ public function testPluginConnectsToPop3HostBeforeTransportStarts()
+ {
+ $connection = $this->_createConnection();
+ $connection->expects($this->once())
+ ->method('connect');
+
+ $plugin = $this->_createPlugin('pop.host.tld', 110);
+ $plugin->setConnection($connection);
+
+ $transport = $this->_createTransport();
+ $evt = $this->_createTransportChangeEvent($transport);
+
+ $plugin->beforeTransportStarted($evt);
+ }
+
+ public function testPluginDisconnectsFromPop3HostBeforeTransportStarts()
+ {
+ $connection = $this->_createConnection();
+ $connection->expects($this->once())
+ ->method('disconnect');
+
+ $plugin = $this->_createPlugin('pop.host.tld', 110);
+ $plugin->setConnection($connection);
+
+ $transport = $this->_createTransport();
+ $evt = $this->_createTransportChangeEvent($transport);
+
+ $plugin->beforeTransportStarted($evt);
+ }
+
+ public function testPluginDoesNotConnectToSmtpIfBoundToDifferentTransport()
+ {
+ $connection = $this->_createConnection();
+ $connection->expects($this->never())
+ ->method('disconnect');
+ $connection->expects($this->never())
+ ->method('connect');
+
+ $smtp = $this->_createTransport();
+
+ $plugin = $this->_createPlugin('pop.host.tld', 110);
+ $plugin->setConnection($connection);
+ $plugin->bindSmtp($smtp);
+
+ $transport = $this->_createTransport();
+ $evt = $this->_createTransportChangeEvent($transport);
+
+ $plugin->beforeTransportStarted($evt);
+ }
+
+ public function testPluginCanBindToSpecificTransport()
+ {
+ $connection = $this->_createConnection();
+ $connection->expects($this->once())
+ ->method('connect');
+
+ $smtp = $this->_createTransport();
+
+ $plugin = $this->_createPlugin('pop.host.tld', 110);
+ $plugin->setConnection($connection);
+ $plugin->bindSmtp($smtp);
+
+ $evt = $this->_createTransportChangeEvent($smtp);
+
+ $plugin->beforeTransportStarted($evt);
+ }
+
+ private function _createTransport()
+ {
+ return $this->getMockBuilder('Swift_Transport')->getMock();
+ }
+
+ private function _createTransportChangeEvent($transport)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_TransportChangeEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getSource')
+ ->will($this->returnValue($transport));
+ $evt->expects($this->any())
+ ->method('getTransport')
+ ->will($this->returnValue($transport));
+
+ return $evt;
+ }
+
+ public function _createConnection()
+ {
+ return $this->getMockBuilder('Swift_Plugins_Pop_Pop3Connection')->getMock();
+ }
+
+ public function _createPlugin($host, $port, $crypto = null)
+ {
+ return new Swift_Plugins_PopBeforeSmtpPlugin($host, $port, $crypto);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php
new file mode 100644
index 0000000..bfd5669
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/RedirectingPluginTest.php
@@ -0,0 +1,183 @@
+<?php
+
+class Swift_Plugins_RedirectingPluginTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRecipientCanBeSetAndFetched()
+ {
+ $plugin = new Swift_Plugins_RedirectingPlugin('fabien@example.com');
+ $this->assertEquals('fabien@example.com', $plugin->getRecipient());
+ $plugin->setRecipient('chris@example.com');
+ $this->assertEquals('chris@example.com', $plugin->getRecipient());
+ }
+
+ public function testPluginChangesRecipients()
+ {
+ $message = Swift_Message::newInstance()
+ ->setSubject('...')
+ ->setFrom(array('john@example.com' => 'John Doe'))
+ ->setTo($to = array(
+ 'fabien-to@example.com' => 'Fabien (To)',
+ 'chris-to@example.com' => 'Chris (To)',
+ ))
+ ->setCc($cc = array(
+ 'fabien-cc@example.com' => 'Fabien (Cc)',
+ 'chris-cc@example.com' => 'Chris (Cc)',
+ ))
+ ->setBcc($bcc = array(
+ 'fabien-bcc@example.com' => 'Fabien (Bcc)',
+ 'chris-bcc@example.com' => 'Chris (Bcc)',
+ ))
+ ->setBody('...')
+ ;
+
+ $plugin = new Swift_Plugins_RedirectingPlugin('god@example.com');
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+
+ $this->assertEquals($message->getTo(), array('god@example.com' => ''));
+ $this->assertEquals($message->getCc(), array());
+ $this->assertEquals($message->getBcc(), array());
+
+ $plugin->sendPerformed($evt);
+
+ $this->assertEquals($message->getTo(), $to);
+ $this->assertEquals($message->getCc(), $cc);
+ $this->assertEquals($message->getBcc(), $bcc);
+ }
+
+ public function testPluginRespectsUnsetToList()
+ {
+ $message = Swift_Message::newInstance()
+ ->setSubject('...')
+ ->setFrom(array('john@example.com' => 'John Doe'))
+ ->setCc($cc = array(
+ 'fabien-cc@example.com' => 'Fabien (Cc)',
+ 'chris-cc@example.com' => 'Chris (Cc)',
+ ))
+ ->setBcc($bcc = array(
+ 'fabien-bcc@example.com' => 'Fabien (Bcc)',
+ 'chris-bcc@example.com' => 'Chris (Bcc)',
+ ))
+ ->setBody('...')
+ ;
+
+ $plugin = new Swift_Plugins_RedirectingPlugin('god@example.com');
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+
+ $this->assertEquals($message->getTo(), array('god@example.com' => ''));
+ $this->assertEquals($message->getCc(), array());
+ $this->assertEquals($message->getBcc(), array());
+
+ $plugin->sendPerformed($evt);
+
+ $this->assertEquals($message->getTo(), array());
+ $this->assertEquals($message->getCc(), $cc);
+ $this->assertEquals($message->getBcc(), $bcc);
+ }
+
+ public function testPluginRespectsAWhitelistOfPatterns()
+ {
+ $message = Swift_Message::newInstance()
+ ->setSubject('...')
+ ->setFrom(array('john@example.com' => 'John Doe'))
+ ->setTo($to = array(
+ 'fabien-to@example.com' => 'Fabien (To)',
+ 'chris-to@example.com' => 'Chris (To)',
+ 'lars-to@internal.com' => 'Lars (To)',
+ ))
+ ->setCc($cc = array(
+ 'fabien-cc@example.com' => 'Fabien (Cc)',
+ 'chris-cc@example.com' => 'Chris (Cc)',
+ 'lars-cc@internal.org' => 'Lars (Cc)',
+ ))
+ ->setBcc($bcc = array(
+ 'fabien-bcc@example.com' => 'Fabien (Bcc)',
+ 'chris-bcc@example.com' => 'Chris (Bcc)',
+ 'john-bcc@example.org' => 'John (Bcc)',
+ ))
+ ->setBody('...')
+ ;
+
+ $recipient = 'god@example.com';
+ $patterns = array('/^.*@internal.[a-z]+$/', '/^john-.*$/');
+
+ $plugin = new Swift_Plugins_RedirectingPlugin($recipient, $patterns);
+
+ $this->assertEquals($recipient, $plugin->getRecipient());
+ $this->assertEquals($plugin->getWhitelist(), $patterns);
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+
+ $this->assertEquals($message->getTo(), array('lars-to@internal.com' => 'Lars (To)', 'god@example.com' => null));
+ $this->assertEquals($message->getCc(), array('lars-cc@internal.org' => 'Lars (Cc)'));
+ $this->assertEquals($message->getBcc(), array('john-bcc@example.org' => 'John (Bcc)'));
+
+ $plugin->sendPerformed($evt);
+
+ $this->assertEquals($message->getTo(), $to);
+ $this->assertEquals($message->getCc(), $cc);
+ $this->assertEquals($message->getBcc(), $bcc);
+ }
+
+ public function testArrayOfRecipientsCanBeExplicitlyDefined()
+ {
+ $message = Swift_Message::newInstance()
+ ->setSubject('...')
+ ->setFrom(array('john@example.com' => 'John Doe'))
+ ->setTo(array(
+ 'fabien@example.com' => 'Fabien',
+ 'chris@example.com' => 'Chris (To)',
+ 'lars-to@internal.com' => 'Lars (To)',
+ ))
+ ->setCc(array(
+ 'fabien@example.com' => 'Fabien',
+ 'chris-cc@example.com' => 'Chris (Cc)',
+ 'lars-cc@internal.org' => 'Lars (Cc)',
+ ))
+ ->setBcc(array(
+ 'fabien@example.com' => 'Fabien',
+ 'chris-bcc@example.com' => 'Chris (Bcc)',
+ 'john-bcc@example.org' => 'John (Bcc)',
+ ))
+ ->setBody('...')
+ ;
+
+ $recipients = array('god@example.com', 'fabien@example.com');
+ $patterns = array('/^.*@internal.[a-z]+$/');
+
+ $plugin = new Swift_Plugins_RedirectingPlugin($recipients, $patterns);
+
+ $evt = $this->_createSendEvent($message);
+
+ $plugin->beforeSendPerformed($evt);
+
+ $this->assertEquals(
+ $message->getTo(),
+ array('fabien@example.com' => 'Fabien', 'lars-to@internal.com' => 'Lars (To)', 'god@example.com' => null)
+ );
+ $this->assertEquals(
+ $message->getCc(),
+ array('fabien@example.com' => 'Fabien', 'lars-cc@internal.org' => 'Lars (Cc)')
+ );
+ $this->assertEquals($message->getBcc(), array('fabien@example.com' => 'Fabien'));
+ }
+
+ private function _createSendEvent(Swift_Mime_Message $message)
+ {
+ $evt = $this->getMockBuilder('Swift_Events_SendEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $evt->expects($this->any())
+ ->method('getMessage')
+ ->will($this->returnValue($message));
+
+ return $evt;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php
new file mode 100644
index 0000000..5ba5d5c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ReporterPluginTest.php
@@ -0,0 +1,86 @@
+<?php
+
+class Swift_Plugins_ReporterPluginTest extends \SwiftMailerTestCase
+{
+ public function testReportingPasses()
+ {
+ $message = $this->_createMessage();
+ $evt = $this->_createSendEvent();
+ $reporter = $this->_createReporter();
+
+ $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(array('foo@bar.tld' => 'Foo'));
+ $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message);
+ $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(array());
+ $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS);
+
+ $plugin = new Swift_Plugins_ReporterPlugin($reporter);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReportingFailedTo()
+ {
+ $message = $this->_createMessage();
+ $evt = $this->_createSendEvent();
+ $reporter = $this->_createReporter();
+
+ $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(array('foo@bar.tld' => 'Foo', 'zip@button' => 'Zip'));
+ $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message);
+ $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(array('zip@button'));
+ $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS);
+ $reporter->shouldReceive('notify')->once()->with($message, 'zip@button', Swift_Plugins_Reporter::RESULT_FAIL);
+
+ $plugin = new Swift_Plugins_ReporterPlugin($reporter);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReportingFailedCc()
+ {
+ $message = $this->_createMessage();
+ $evt = $this->_createSendEvent();
+ $reporter = $this->_createReporter();
+
+ $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(array('foo@bar.tld' => 'Foo'));
+ $message->shouldReceive('getCc')->zeroOrMoreTimes()->andReturn(array('zip@button' => 'Zip', 'test@test.com' => 'Test'));
+ $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message);
+ $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(array('zip@button'));
+ $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS);
+ $reporter->shouldReceive('notify')->once()->with($message, 'zip@button', Swift_Plugins_Reporter::RESULT_FAIL);
+ $reporter->shouldReceive('notify')->once()->with($message, 'test@test.com', Swift_Plugins_Reporter::RESULT_PASS);
+
+ $plugin = new Swift_Plugins_ReporterPlugin($reporter);
+ $plugin->sendPerformed($evt);
+ }
+
+ public function testReportingFailedBcc()
+ {
+ $message = $this->_createMessage();
+ $evt = $this->_createSendEvent();
+ $reporter = $this->_createReporter();
+
+ $message->shouldReceive('getTo')->zeroOrMoreTimes()->andReturn(array('foo@bar.tld' => 'Foo'));
+ $message->shouldReceive('getBcc')->zeroOrMoreTimes()->andReturn(array('zip@button' => 'Zip', 'test@test.com' => 'Test'));
+ $evt->shouldReceive('getMessage')->zeroOrMoreTimes()->andReturn($message);
+ $evt->shouldReceive('getFailedRecipients')->zeroOrMoreTimes()->andReturn(array('zip@button'));
+ $reporter->shouldReceive('notify')->once()->with($message, 'foo@bar.tld', Swift_Plugins_Reporter::RESULT_PASS);
+ $reporter->shouldReceive('notify')->once()->with($message, 'zip@button', Swift_Plugins_Reporter::RESULT_FAIL);
+ $reporter->shouldReceive('notify')->once()->with($message, 'test@test.com', Swift_Plugins_Reporter::RESULT_PASS);
+
+ $plugin = new Swift_Plugins_ReporterPlugin($reporter);
+ $plugin->sendPerformed($evt);
+ }
+
+ private function _createMessage()
+ {
+ return $this->getMockery('Swift_Mime_Message')->shouldIgnoreMissing();
+ }
+
+ private function _createSendEvent()
+ {
+ return $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ }
+
+ private function _createReporter()
+ {
+ return $this->getMockery('Swift_Plugins_Reporter')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php
new file mode 100644
index 0000000..20aae57
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HitReporterTest.php
@@ -0,0 +1,64 @@
+<?php
+
+class Swift_Plugins_Reporters_HitReporterTest extends \PHPUnit_Framework_TestCase
+{
+ private $_hitReporter;
+ private $_message;
+
+ protected function setUp()
+ {
+ $this->_hitReporter = new Swift_Plugins_Reporters_HitReporter();
+ $this->_message = $this->getMockBuilder('Swift_Mime_Message')->getMock();
+ }
+
+ public function testReportingFail()
+ {
+ $this->_hitReporter->notify($this->_message, 'foo@bar.tld',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $this->assertEquals(array('foo@bar.tld'),
+ $this->_hitReporter->getFailedRecipients()
+ );
+ }
+
+ public function testMultipleReports()
+ {
+ $this->_hitReporter->notify($this->_message, 'foo@bar.tld',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $this->_hitReporter->notify($this->_message, 'zip@button',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $this->assertEquals(array('foo@bar.tld', 'zip@button'),
+ $this->_hitReporter->getFailedRecipients()
+ );
+ }
+
+ public function testReportingPassIsIgnored()
+ {
+ $this->_hitReporter->notify($this->_message, 'foo@bar.tld',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $this->_hitReporter->notify($this->_message, 'zip@button',
+ Swift_Plugins_Reporter::RESULT_PASS
+ );
+ $this->assertEquals(array('foo@bar.tld'),
+ $this->_hitReporter->getFailedRecipients()
+ );
+ }
+
+ public function testBufferCanBeCleared()
+ {
+ $this->_hitReporter->notify($this->_message, 'foo@bar.tld',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $this->_hitReporter->notify($this->_message, 'zip@button',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $this->assertEquals(array('foo@bar.tld', 'zip@button'),
+ $this->_hitReporter->getFailedRecipients()
+ );
+ $this->_hitReporter->clear();
+ $this->assertEquals(array(), $this->_hitReporter->getFailedRecipients());
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php
new file mode 100644
index 0000000..fb0bc97
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/Reporters/HtmlReporterTest.php
@@ -0,0 +1,54 @@
+<?php
+
+class Swift_Plugins_Reporters_HtmlReporterTest extends \PHPUnit_Framework_TestCase
+{
+ private $_html;
+ private $_message;
+
+ protected function setUp()
+ {
+ $this->_html = new Swift_Plugins_Reporters_HtmlReporter();
+ $this->_message = $this->getMockBuilder('Swift_Mime_Message')->getMock();
+ }
+
+ public function testReportingPass()
+ {
+ ob_start();
+ $this->_html->notify($this->_message, 'foo@bar.tld',
+ Swift_Plugins_Reporter::RESULT_PASS
+ );
+ $html = ob_get_clean();
+
+ $this->assertRegExp('~ok|pass~i', $html, '%s: Reporter should indicate pass');
+ $this->assertRegExp('~foo@bar\.tld~', $html, '%s: Reporter should show address');
+ }
+
+ public function testReportingFail()
+ {
+ ob_start();
+ $this->_html->notify($this->_message, 'zip@button',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $html = ob_get_clean();
+
+ $this->assertRegExp('~fail~i', $html, '%s: Reporter should indicate fail');
+ $this->assertRegExp('~zip@button~', $html, '%s: Reporter should show address');
+ }
+
+ public function testMultipleReports()
+ {
+ ob_start();
+ $this->_html->notify($this->_message, 'foo@bar.tld',
+ Swift_Plugins_Reporter::RESULT_PASS
+ );
+ $this->_html->notify($this->_message, 'zip@button',
+ Swift_Plugins_Reporter::RESULT_FAIL
+ );
+ $html = ob_get_clean();
+
+ $this->assertRegExp('~ok|pass~i', $html, '%s: Reporter should indicate pass');
+ $this->assertRegExp('~foo@bar\.tld~', $html, '%s: Reporter should show address');
+ $this->assertRegExp('~fail~i', $html, '%s: Reporter should indicate fail');
+ $this->assertRegExp('~zip@button~', $html, '%s: Reporter should show address');
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php
new file mode 100644
index 0000000..309f506
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Plugins/ThrottlerPluginTest.php
@@ -0,0 +1,102 @@
+<?php
+
+class Swift_Plugins_ThrottlerPluginTest extends \SwiftMailerTestCase
+{
+ public function testBytesPerMinuteThrottling()
+ {
+ $sleeper = $this->_createSleeper();
+ $timer = $this->_createTimer();
+
+ //10MB/min
+ $plugin = new Swift_Plugins_ThrottlerPlugin(
+ 10000000, Swift_Plugins_ThrottlerPlugin::BYTES_PER_MINUTE,
+ $sleeper, $timer
+ );
+
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(0);
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(1); //expected 0.6
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(1); //expected 1.2 (sleep 1)
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 1.8
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 2.4 (sleep 1)
+ $sleeper->shouldReceive('sleep')->twice()->with(1);
+
+ //10,000,000 bytes per minute
+ //100,000 bytes per email
+
+ // .: (10,000,000/100,000)/60 emails per second = 1.667 emais/sec
+
+ $message = $this->_createMessageWithByteCount(100000); //100KB
+
+ $evt = $this->_createSendEvent($message);
+
+ for ($i = 0; $i < 5; ++$i) {
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+ }
+
+ public function testMessagesPerMinuteThrottling()
+ {
+ $sleeper = $this->_createSleeper();
+ $timer = $this->_createTimer();
+
+ //60/min
+ $plugin = new Swift_Plugins_ThrottlerPlugin(
+ 60, Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE,
+ $sleeper, $timer
+ );
+
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(0);
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(0); //expected 1 (sleep 1)
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 2
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(2); //expected 3 (sleep 1)
+ $timer->shouldReceive('getTimestamp')->once()->andReturn(4); //expected 4
+ $sleeper->shouldReceive('sleep')->twice()->with(1);
+
+ //60 messages per minute
+ //1 message per second
+
+ $message = $this->_createMessageWithByteCount(10);
+
+ $evt = $this->_createSendEvent($message);
+
+ for ($i = 0; $i < 5; ++$i) {
+ $plugin->beforeSendPerformed($evt);
+ $plugin->sendPerformed($evt);
+ }
+ }
+
+ private function _createSleeper()
+ {
+ return $this->getMockery('Swift_Plugins_Sleeper');
+ }
+
+ private function _createTimer()
+ {
+ return $this->getMockery('Swift_Plugins_Timer');
+ }
+
+ private function _createMessageWithByteCount($bytes)
+ {
+ $msg = $this->getMockery('Swift_Mime_Message');
+ $msg->shouldReceive('toByteStream')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function ($is) use ($bytes) {
+ for ($i = 0; $i < $bytes; ++$i) {
+ $is->write('x');
+ }
+ });
+
+ return $msg;
+ }
+
+ private function _createSendEvent($message)
+ {
+ $evt = $this->getMockery('Swift_Events_SendEvent');
+ $evt->shouldReceive('getMessage')
+ ->zeroOrMoreTimes()
+ ->andReturn($message);
+
+ return $evt;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php
new file mode 100644
index 0000000..5eda223
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/DKIMSignerTest.php
@@ -0,0 +1,225 @@
+<?php
+
+class Swift_Signers_DKIMSignerTest extends \SwiftMailerTestCase
+{
+ protected function setUp()
+ {
+ if (PHP_VERSION_ID < 50400 && !defined('OPENSSL_ALGO_SHA256')) {
+ $this->markTestSkipped('skipping because of https://bugs.php.net/bug.php?id=61421');
+ }
+ }
+
+ public function testBasicSigningHeaderManipulation()
+ {
+ $headers = $this->_createHeaders();
+ $messageContent = 'Hello World';
+ $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector');
+ /* @var $signer Swift_Signers_HeaderSigner */
+ $altered = $signer->getAlteredHeaders();
+ $signer->reset();
+ // Headers
+ $signer->setHeaders($headers);
+ // Body
+ $signer->startBody();
+ $signer->write($messageContent);
+ $signer->endBody();
+ // Signing
+ $signer->addSignature($headers);
+ }
+
+ // SHA1 Signing
+ public function testSigningSHA1()
+ {
+ $headerSet = $this->_createHeaderSet();
+ $messageContent = 'Hello World';
+ $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector');
+ $signer->setHashAlgorithm('rsa-sha1');
+ $signer->setSignatureTimestamp('1299879181');
+ $altered = $signer->getAlteredHeaders();
+ $this->assertEquals(array('DKIM-Signature'), $altered);
+ $signer->reset();
+ $signer->setHeaders($headerSet);
+ $this->assertFalse($headerSet->has('DKIM-Signature'));
+ $signer->startBody();
+ $signer->write($messageContent);
+ $signer->endBody();
+ $signer->addSignature($headerSet);
+ $this->assertTrue($headerSet->has('DKIM-Signature'));
+ $dkim = $headerSet->getAll('DKIM-Signature');
+ $sig = reset($dkim);
+ $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha1; bh=wlbYcY9O9OPInGJ4D0E/rGsvMLE=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; t=1299879181; b=RMSNelzM2O5MAAnMjT3G3/VF36S3DGJXoPCXR001F1WDReu0prGphWjuzK/m6V1pwqQL8cCNg Hi74mTx2bvyAvmkjvQtJf1VMUOCc9WHGcm1Yec66I3ZWoNMGSWZ1EKAm2CtTzyG0IFw4ml9DI wSkyAFxlgicckDD6FibhqwX4w=');
+ }
+
+ // SHA256 Signing
+ public function testSigning256()
+ {
+ $headerSet = $this->_createHeaderSet();
+ $messageContent = 'Hello World';
+ $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector');
+ $signer->setHashAlgorithm('rsa-sha256');
+ $signer->setSignatureTimestamp('1299879181');
+ $altered = $signer->getAlteredHeaders();
+ $this->assertEquals(array('DKIM-Signature'), $altered);
+ $signer->reset();
+ $signer->setHeaders($headerSet);
+ $this->assertFalse($headerSet->has('DKIM-Signature'));
+ $signer->startBody();
+ $signer->write($messageContent);
+ $signer->endBody();
+ $signer->addSignature($headerSet);
+ $this->assertTrue($headerSet->has('DKIM-Signature'));
+ $dkim = $headerSet->getAll('DKIM-Signature');
+ $sig = reset($dkim);
+ $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; t=1299879181; b=jqPmieHzF5vR9F4mXCAkowuphpO4iJ8IAVuioh1BFZ3VITXZj5jlOFxULJMBiiApm2keJirnh u4mzogj444QkpT3lJg8/TBGAYQPdcvkG3KC0jdyN6QpSgpITBJG2BwWa+keXsv2bkQgLRAzNx qRhP45vpHCKun0Tg9LrwW/KCg=');
+ }
+
+ // Relaxed/Relaxed Hash Signing
+ public function testSigningRelaxedRelaxed256()
+ {
+ $headerSet = $this->_createHeaderSet();
+ $messageContent = 'Hello World';
+ $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector');
+ $signer->setHashAlgorithm('rsa-sha256');
+ $signer->setSignatureTimestamp('1299879181');
+ $signer->setBodyCanon('relaxed');
+ $signer->setHeaderCanon('relaxed');
+ $altered = $signer->getAlteredHeaders();
+ $this->assertEquals(array('DKIM-Signature'), $altered);
+ $signer->reset();
+ $signer->setHeaders($headerSet);
+ $this->assertFalse($headerSet->has('DKIM-Signature'));
+ $signer->startBody();
+ $signer->write($messageContent);
+ $signer->endBody();
+ $signer->addSignature($headerSet);
+ $this->assertTrue($headerSet->has('DKIM-Signature'));
+ $dkim = $headerSet->getAll('DKIM-Signature');
+ $sig = reset($dkim);
+ $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; c=relaxed/relaxed; t=1299879181; b=gzOI+PX6HpZKQFzwwmxzcVJsyirdLXOS+4pgfCpVHQIdqYusKLrhlLeFBTNoz75HrhNvGH6T0 Rt3w5aTqkrWfUuAEYt0Ns14GowLM7JojaFN+pZ4eYnRB3CBBgW6fee4NEMD5WPca3uS09tr1E 10RYh9ILlRtl+84sovhx5id3Y=');
+ }
+
+ // Relaxed/Simple Hash Signing
+ public function testSigningRelaxedSimple256()
+ {
+ $headerSet = $this->_createHeaderSet();
+ $messageContent = 'Hello World';
+ $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector');
+ $signer->setHashAlgorithm('rsa-sha256');
+ $signer->setSignatureTimestamp('1299879181');
+ $signer->setHeaderCanon('relaxed');
+ $altered = $signer->getAlteredHeaders();
+ $this->assertEquals(array('DKIM-Signature'), $altered);
+ $signer->reset();
+ $signer->setHeaders($headerSet);
+ $this->assertFalse($headerSet->has('DKIM-Signature'));
+ $signer->startBody();
+ $signer->write($messageContent);
+ $signer->endBody();
+ $signer->addSignature($headerSet);
+ $this->assertTrue($headerSet->has('DKIM-Signature'));
+ $dkim = $headerSet->getAll('DKIM-Signature');
+ $sig = reset($dkim);
+ $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; c=relaxed; t=1299879181; b=dLPJNec5v81oelyzGOY0qPqTlGnQeNfUNBOrV/JKbStr3NqWGI9jH4JAe2YvO2V32lfPNoby1 4MMzZ6EPkaZkZDDSPa+53YbCPQAlqiD9QZZIUe2UNM33HN8yAMgiWEF5aP7MbQnxeVZMfVLEl 9S8qOImu+K5JZqhQQTL0dgLwA=');
+ }
+
+ // Simple/Relaxed Hash Signing
+ public function testSigningSimpleRelaxed256()
+ {
+ $headerSet = $this->_createHeaderSet();
+ $messageContent = 'Hello World';
+ $signer = new Swift_Signers_DKIMSigner(file_get_contents(dirname(dirname(dirname(__DIR__))).'/_samples/dkim/dkim.test.priv'), 'dummy.nxdomain.be', 'dummySelector');
+ $signer->setHashAlgorithm('rsa-sha256');
+ $signer->setSignatureTimestamp('1299879181');
+ $signer->setBodyCanon('relaxed');
+ $altered = $signer->getAlteredHeaders();
+ $this->assertEquals(array('DKIM-Signature'), $altered);
+ $signer->reset();
+ $signer->setHeaders($headerSet);
+ $this->assertFalse($headerSet->has('DKIM-Signature'));
+ $signer->startBody();
+ $signer->write($messageContent);
+ $signer->endBody();
+ $signer->addSignature($headerSet);
+ $this->assertTrue($headerSet->has('DKIM-Signature'));
+ $dkim = $headerSet->getAll('DKIM-Signature');
+ $sig = reset($dkim);
+ $this->assertEquals($sig->getValue(), 'v=1; a=rsa-sha256; bh=f+W+hu8dIhf2VAni89o8lF6WKTXi7nViA4RrMdpD5/U=; d=dummy.nxdomain.be; h=; i=@dummy.nxdomain.be; s=dummySelector; c=simple/relaxed; t=1299879181; b=M5eomH/zamyzix9kOes+6YLzQZxuJdBP4x3nP9zF2N26eMLG2/cBKbnNyqiOTDhJdYfWPbLIa 1CWnjST0j5p4CpeOkGYuiE+M4TWEZwhRmRWootlPO3Ii6XpbBJKFk1o9zviS7OmXblUUE4aqb yRSIMDhtLdCK5GlaCneFLN7RQ=');
+ }
+
+ private function _createHeaderSet()
+ {
+ $cache = new Swift_KeyCache_ArrayKeyCache(new Swift_KeyCache_SimpleKeyCacheInputStream());
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+
+ $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'));
+ $paramEncoder = new Swift_Encoder_Rfc2231Encoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'));
+ $grammar = new Swift_Mime_Grammar();
+ $headers = new Swift_Mime_SimpleHeaderSet(new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $grammar));
+
+ return $headers;
+ }
+
+ /**
+ * @return Swift_Mime_Headers
+ */
+ private function _createHeaders()
+ {
+ $x = 0;
+ $cache = new Swift_KeyCache_ArrayKeyCache(new Swift_KeyCache_SimpleKeyCacheInputStream());
+ $factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
+ $contentEncoder = new Swift_Mime_ContentEncoder_Base64ContentEncoder();
+
+ $headerEncoder = new Swift_Mime_HeaderEncoder_QpHeaderEncoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'));
+ $paramEncoder = new Swift_Encoder_Rfc2231Encoder(new Swift_CharacterStream_ArrayCharacterStream($factory, 'utf-8'));
+ $grammar = new Swift_Mime_Grammar();
+ $headerFactory = new Swift_Mime_SimpleHeaderFactory($headerEncoder, $paramEncoder, $grammar);
+ $headers = $this->getMockery('Swift_Mime_HeaderSet');
+
+ $headers->shouldReceive('listAll')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('From', 'To', 'Date', 'Subject'));
+ $headers->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->with('From')
+ ->andReturn(true);
+ $headers->shouldReceive('getAll')
+ ->zeroOrMoreTimes()
+ ->with('From')
+ ->andReturn(array($headerFactory->createMailboxHeader('From', 'test@test.test')));
+ $headers->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->with('To')
+ ->andReturn(true);
+ $headers->shouldReceive('getAll')
+ ->zeroOrMoreTimes()
+ ->with('To')
+ ->andReturn(array($headerFactory->createMailboxHeader('To', 'test@test.test')));
+ $headers->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->with('Date')
+ ->andReturn(true);
+ $headers->shouldReceive('getAll')
+ ->zeroOrMoreTimes()
+ ->with('Date')
+ ->andReturn(array($headerFactory->createTextHeader('Date', 'Fri, 11 Mar 2011 20:56:12 +0000 (GMT)')));
+ $headers->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->with('Subject')
+ ->andReturn(true);
+ $headers->shouldReceive('getAll')
+ ->zeroOrMoreTimes()
+ ->with('Subject')
+ ->andReturn(array($headerFactory->createTextHeader('Subject', 'Foo Bar Text Message')));
+ $headers->shouldReceive('addTextHeader')
+ ->zeroOrMoreTimes()
+ ->with('DKIM-Signature', \Mockery::any())
+ ->andReturn(true);
+ $headers->shouldReceive('getAll')
+ ->zeroOrMoreTimes()
+ ->with('DKIM-Signature')
+ ->andReturn(array($headerFactory->createTextHeader('DKIM-Signature', 'Foo Bar Text Message')));
+
+ return $headers;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php
new file mode 100644
index 0000000..ce99bc6
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/OpenDKIMSignerTest.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @todo
+ */
+class Swift_Signers_OpenDKIMSignerTest extends \SwiftMailerTestCase
+{
+ protected function setUp()
+ {
+ if (!extension_loaded('opendkim')) {
+ $this->markTestSkipped(
+ 'Need OpenDKIM extension run these tests.'
+ );
+ }
+ }
+
+ public function testBasicSigningHeaderManipulation()
+ {
+ }
+
+ // Default Signing
+ public function testSigningDefaults()
+ {
+ }
+
+ // SHA256 Signing
+ public function testSigning256()
+ {
+ }
+
+ // Relaxed/Relaxed Hash Signing
+ public function testSigningRelaxedRelaxed256()
+ {
+ }
+
+ // Relaxed/Simple Hash Signing
+ public function testSigningRelaxedSimple256()
+ {
+ }
+
+ // Simple/Relaxed Hash Signing
+ public function testSigningSimpleRelaxed256()
+ {
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php
new file mode 100644
index 0000000..5069c1f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Signers/SMimeSignerTest.php
@@ -0,0 +1,554 @@
+<?php
+
+class Swift_Signers_SMimeSignerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @var Swift_StreamFilters_StringReplacementFilterFactory
+ */
+ protected $replacementFactory;
+
+ protected $samplesDir;
+
+ protected function setUp()
+ {
+ $this->replacementFactory = Swift_DependencyContainer::getInstance()
+ ->lookup('transport.replacementfactory');
+
+ $this->samplesDir = str_replace('\\', '/', realpath(__DIR__.'/../../../_samples/')).'/';
+ }
+
+ public function testUnSingedMessage()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $this->assertEquals('Here is the message itself', $message->getBody());
+ }
+
+ public function testSingedMessage()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key');
+ $message->attachSigner($signer);
+
+ $messageStream = $this->newFilteredStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!($boundary = $this->getBoundary($headers['content-type']))) {
+ return false;
+ }
+
+ $expectedBody = <<<OEL
+This is an S/MIME signed message
+
+--$boundary
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+Here is the message itself
+--$boundary
+Content-Type: application/(x\-)?pkcs7-signature; name="smime\.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime\.p7s"
+
+(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})
+
+--$boundary--
+OEL;
+ $this->assertValidVerify($expectedBody, $messageStream);
+ unset($messageStream);
+ }
+
+ public function testSingedMessageExtraCerts()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setSignCertificate($this->samplesDir.'smime/sign2.crt', $this->samplesDir.'smime/sign2.key', PKCS7_DETACHED, $this->samplesDir.'smime/intermediate.crt');
+ $message->attachSigner($signer);
+
+ $messageStream = $this->newFilteredStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!($boundary = $this->getBoundary($headers['content-type']))) {
+ return false;
+ }
+
+ $expectedBody = <<<OEL
+This is an S/MIME signed message
+
+--$boundary
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+Here is the message itself
+--$boundary
+Content-Type: application/(x\-)?pkcs7-signature; name="smime\.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime\.p7s"
+
+(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})
+
+--$boundary--
+OEL;
+ $this->assertValidVerify($expectedBody, $messageStream);
+ unset($messageStream);
+ }
+
+ public function testSingedMessageBinary()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key', PKCS7_BINARY);
+ $message->attachSigner($signer);
+
+ $messageStream = $this->newFilteredStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=signed\-data;#', $headers['content-type'])) {
+ $this->fail('Content-type does not match.');
+
+ return false;
+ }
+
+ $this->assertEquals($headers['content-transfer-encoding'], 'base64');
+ $this->assertEquals($headers['content-disposition'], 'attachment; filename="smime.p7m"');
+
+ $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})';
+
+ $messageStreamClean = $this->newFilteredStream();
+
+ $this->assertValidVerify($expectedBody, $messageStream);
+ unset($messageStreamClean, $messageStream);
+ }
+
+ public function testSingedMessageWithAttachments()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $message->attach(Swift_Attachment::fromPath($this->samplesDir.'/files/textfile.zip'));
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key');
+ $message->attachSigner($signer);
+
+ $messageStream = $this->newFilteredStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!($boundary = $this->getBoundary($headers['content-type']))) {
+ return false;
+ }
+
+ $expectedBody = <<<OEL
+This is an S/MIME signed message
+
+--$boundary
+Content-Type: multipart/mixed;
+ boundary="([a-z0-9\\'\\(\\)\\+_\\-,\\.\\/:=\\?\\ ]{0,69}[a-z0-9\\'\\(\\)\\+_\\-,\\.\\/:=\\?])"
+
+
+--\\1
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+Here is the message itself
+
+--\\1
+Content-Type: application/zip; name=textfile\\.zip
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename=textfile\\.zip
+
+UEsDBAoAAgAAAMi6VjiOTiKwLgAAAC4AAAAMABUAdGV4dGZpbGUudHh0VVQJAAN3vr5Hd76\\+R1V4
+BAD1AfUBVGhpcyBpcyBwYXJ0IG9mIGEgU3dpZnQgTWFpbGVyIHY0IHNtb2tlIHRlc3QuClBLAQIX
+AwoAAgAAAMi6VjiOTiKwLgAAAC4AAAAMAA0AAAAAAAEAAACkgQAAAAB0ZXh0ZmlsZS50eHRVVAUA
+A3e\\+vkdVeAAAUEsFBgAAAAABAAEARwAAAG0AAAAAAA==
+
+--\\1--
+
+--$boundary
+Content-Type: application/(x\-)?pkcs7-signature; name="smime\\.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime\\.p7s"
+
+(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})
+
+--$boundary--
+OEL;
+
+ $this->assertValidVerify($expectedBody, $messageStream);
+ unset($messageStream);
+ }
+
+ public function testEncryptedMessage()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $originalMessage = $this->cleanMessage($message->toString());
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt');
+ $message->attachSigner($signer);
+
+ $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) {
+ $this->fail('Content-type does not match.');
+
+ return false;
+ }
+
+ $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})';
+
+ $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
+
+ if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', array('file://'.$this->samplesDir.'smime/encrypt.key', 'swift'))) {
+ $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string()));
+ }
+
+ $this->assertEquals($originalMessage, $decryptedMessageStream->getContent());
+ unset($decryptedMessageStream, $messageStream);
+ }
+
+ public function testEncryptedMessageWithMultipleCerts()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $originalMessage = $this->cleanMessage($message->toString());
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setEncryptCertificate(array($this->samplesDir.'smime/encrypt.crt', $this->samplesDir.'smime/encrypt2.crt'));
+ $message->attachSigner($signer);
+
+ $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) {
+ $this->fail('Content-type does not match.');
+
+ return false;
+ }
+
+ $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})';
+
+ $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
+
+ if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', array('file://'.$this->samplesDir.'smime/encrypt.key', 'swift'))) {
+ $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string()));
+ }
+
+ $this->assertEquals($originalMessage, $decryptedMessageStream->getContent());
+ unset($decryptedMessageStream);
+
+ $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
+
+ if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt2.crt', array('file://'.$this->samplesDir.'smime/encrypt2.key', 'swift'))) {
+ $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string()));
+ }
+
+ $this->assertEquals($originalMessage, $decryptedMessageStream->getContent());
+ unset($decryptedMessageStream, $messageStream);
+ }
+
+ public function testSignThenEncryptedMessage()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $signer = new Swift_Signers_SMimeSigner();
+ $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key');
+ $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt');
+ $message->attachSigner($signer);
+
+ $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!preg_match('#^application/(x\-)?pkcs7-mime; smime-type=enveloped\-data;#', $headers['content-type'])) {
+ $this->fail('Content-type does not match.');
+
+ return false;
+ }
+
+ $expectedBody = '(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})';
+
+ $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
+
+ if (!openssl_pkcs7_decrypt($messageStream->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', array('file://'.$this->samplesDir.'smime/encrypt.key', 'swift'))) {
+ $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string()));
+ }
+
+ $entityString = $decryptedMessageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!($boundary = $this->getBoundary($headers['content-type']))) {
+ return false;
+ }
+
+ $expectedBody = <<<OEL
+This is an S/MIME signed message
+
+--$boundary
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: quoted-printable
+
+Here is the message itself
+--$boundary
+Content-Type: application/(x\-)?pkcs7-signature; name="smime\.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime\.p7s"
+
+(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})
+
+--$boundary--
+OEL;
+
+ if (!$this->assertValidVerify($expectedBody, $decryptedMessageStream)) {
+ return false;
+ }
+
+ unset($decryptedMessageStream, $messageStream);
+ }
+
+ public function testEncryptThenSignMessage()
+ {
+ $message = Swift_SignedMessage::newInstance('Wonderful Subject')
+ ->setFrom(array('john@doe.com' => 'John Doe'))
+ ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
+ ->setBody('Here is the message itself');
+
+ $originalMessage = $this->cleanMessage($message->toString());
+
+ $signer = Swift_Signers_SMimeSigner::newInstance();
+ $signer->setSignCertificate($this->samplesDir.'smime/sign.crt', $this->samplesDir.'smime/sign.key');
+ $signer->setEncryptCertificate($this->samplesDir.'smime/encrypt.crt');
+ $signer->setSignThenEncrypt(false);
+ $message->attachSigner($signer);
+
+ $messageStream = $this->newFilteredStream();
+ $message->toByteStream($messageStream);
+ $messageStream->commit();
+
+ $entityString = $messageStream->getContent();
+ $headers = self::getHeadersOfMessage($entityString);
+
+ if (!($boundary = $this->getBoundary($headers['content-type']))) {
+ return false;
+ }
+
+ $expectedBody = <<<OEL
+This is an S/MIME signed message
+
+--$boundary
+(?P<encrypted_message>MIME-Version: 1\.0
+Content-Disposition: attachment; filename="smime\.p7m"
+Content-Type: application/(x\-)?pkcs7-mime; smime-type=enveloped-data; name="smime\.p7m"
+Content-Transfer-Encoding: base64
+
+(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})
+
+
+)--$boundary
+Content-Type: application/(x\-)?pkcs7-signature; name="smime\.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime\.p7s"
+
+(?:^[a-zA-Z0-9\/\\r\\n+]*={0,2})
+
+--$boundary--
+OEL;
+
+ if (!$this->assertValidVerify($expectedBody, $messageStream)) {
+ return false;
+ }
+
+ $expectedBody = str_replace("\n", "\r\n", $expectedBody);
+ if (!preg_match('%'.$expectedBody.'*%m', $entityString, $entities)) {
+ $this->fail('Failed regex match.');
+
+ return false;
+ }
+
+ $messageStreamClean = new Swift_ByteStream_TemporaryFileByteStream();
+ $messageStreamClean->write($entities['encrypted_message']);
+
+ $decryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
+
+ if (!openssl_pkcs7_decrypt($messageStreamClean->getPath(), $decryptedMessageStream->getPath(), 'file://'.$this->samplesDir.'smime/encrypt.crt', array('file://'.$this->samplesDir.'smime/encrypt.key', 'swift'))) {
+ $this->fail(sprintf('Decrypt of the message failed. Internal error "%s".', openssl_error_string()));
+ }
+
+ $this->assertEquals($originalMessage, $decryptedMessageStream->getContent());
+ unset($messageStreamClean, $messageStream, $decryptedMessageStream);
+ }
+
+ protected function assertValidVerify($expected, Swift_ByteStream_TemporaryFileByteStream $messageStream)
+ {
+ $actual = $messageStream->getContent();
+
+ // File is UNIX encoded so convert them to correct line ending
+ $expected = str_replace("\n", "\r\n", $expected);
+
+ $actual = trim(self::getBodyOfMessage($actual));
+ if (!$this->assertRegExp('%^'.$expected.'$\s*%m', $actual)) {
+ return false;
+ }
+
+ $opensslOutput = new Swift_ByteStream_TemporaryFileByteStream();
+ $verify = openssl_pkcs7_verify($messageStream->getPath(), null, $opensslOutput->getPath(), array($this->samplesDir.'smime/ca.crt'));
+
+ if (false === $verify) {
+ $this->fail('Verification of the message failed.');
+
+ return false;
+ } elseif (-1 === $verify) {
+ $this->fail(sprintf('Verification of the message failed. Internal error "%s".', openssl_error_string()));
+
+ return false;
+ }
+
+ return true;
+ }
+
+ protected function getBoundary($contentType)
+ {
+ if (!preg_match('/boundary=("[^"]+"|(?:[^\s]+|$))/is', $contentType, $contentTypeData)) {
+ $this->fail('Failed to find Boundary parameter');
+
+ return false;
+ }
+
+ return trim($contentTypeData[1], '"');
+ }
+
+ protected function newFilteredStream()
+ {
+ $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
+ $messageStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF');
+ $messageStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF');
+
+ return $messageStream;
+ }
+
+ protected static function getBodyOfMessage($message)
+ {
+ return substr($message, strpos($message, "\r\n\r\n"));
+ }
+
+ /**
+ * Strips of the sender headers and Mime-Version.
+ *
+ * @param Swift_ByteStream_TemporaryFileByteStream $messageStream
+ * @param Swift_ByteStream_TemporaryFileByteStream $inputStream
+ */
+ protected function cleanMessage($content)
+ {
+ $newContent = '';
+
+ $headers = self::getHeadersOfMessage($content);
+ foreach ($headers as $headerName => $value) {
+ if (!in_array($headerName, array('content-type', 'content-transfer-encoding', 'content-disposition'))) {
+ continue;
+ }
+
+ $headerName = explode('-', $headerName);
+ $headerName = array_map('ucfirst', $headerName);
+ $headerName = implode('-', $headerName);
+
+ if (strlen($value) > 62) {
+ $value = wordwrap($value, 62, "\n ");
+ }
+
+ $newContent .= "$headerName: $value\r\n";
+ }
+
+ return $newContent."\r\n".ltrim(self::getBodyOfMessage($content));
+ }
+
+ /**
+ * Returns the headers of the message.
+ *
+ * Header-names are lowercase.
+ *
+ * @param string $message
+ *
+ * @return array
+ */
+ protected static function getHeadersOfMessage($message)
+ {
+ $headersPosEnd = strpos($message, "\r\n\r\n");
+ $headerData = substr($message, 0, $headersPosEnd);
+ $headerLines = explode("\r\n", $headerData);
+
+ if (empty($headerLines)) {
+ return array();
+ }
+
+ $headers = array();
+
+ foreach ($headerLines as $headerLine) {
+ if (ctype_space($headerLines[0]) || false === strpos($headerLine, ':')) {
+ $headers[$currentHeaderName] .= ' '.trim($headerLine);
+ continue;
+ }
+
+ $header = explode(':', $headerLine, 2);
+ $currentHeaderName = strtolower($header[0]);
+ $headers[$currentHeaderName] = trim($header[1]);
+ }
+
+ return $headers;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php
new file mode 100644
index 0000000..c85bdc1
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/ByteArrayReplacementFilterTest.php
@@ -0,0 +1,129 @@
+<?php
+
+class Swift_StreamFilters_ByteArrayReplacementFilterTest extends \PHPUnit_Framework_TestCase
+{
+ public function testBasicReplacementsAreMade()
+ {
+ $filter = $this->_createFilter(array(0x61, 0x62), array(0x63, 0x64));
+ $this->assertEquals(
+ array(0x59, 0x60, 0x63, 0x64, 0x65),
+ $filter->filter(array(0x59, 0x60, 0x61, 0x62, 0x65))
+ );
+ }
+
+ public function testShouldBufferReturnsTrueIfPartialMatchAtEndOfBuffer()
+ {
+ $filter = $this->_createFilter(array(0x61, 0x62), array(0x63, 0x64));
+ $this->assertTrue($filter->shouldBuffer(array(0x59, 0x60, 0x61)),
+ '%s: Filter should buffer since 0x61 0x62 is the needle and the ending '.
+ '0x61 could be from 0x61 0x62'
+ );
+ }
+
+ public function testFilterCanMakeMultipleReplacements()
+ {
+ $filter = $this->_createFilter(array(array(0x61), array(0x62)), array(0x63));
+ $this->assertEquals(
+ array(0x60, 0x63, 0x60, 0x63, 0x60),
+ $filter->filter(array(0x60, 0x61, 0x60, 0x62, 0x60))
+ );
+ }
+
+ public function testMultipleReplacementsCanBeDifferent()
+ {
+ $filter = $this->_createFilter(array(array(0x61), array(0x62)), array(array(0x63), array(0x64)));
+ $this->assertEquals(
+ array(0x60, 0x63, 0x60, 0x64, 0x60),
+ $filter->filter(array(0x60, 0x61, 0x60, 0x62, 0x60))
+ );
+ }
+
+ public function testShouldBufferReturnsFalseIfPartialMatchNotAtEndOfString()
+ {
+ $filter = $this->_createFilter(array(0x0D, 0x0A), array(0x0A));
+ $this->assertFalse($filter->shouldBuffer(array(0x61, 0x62, 0x0D, 0x0A, 0x63)),
+ '%s: Filter should not buffer since x0Dx0A is the needle and is not at EOF'
+ );
+ }
+
+ public function testShouldBufferReturnsTrueIfAnyOfMultipleMatchesAtEndOfString()
+ {
+ $filter = $this->_createFilter(array(array(0x61, 0x62), array(0x63)), array(0x64));
+ $this->assertTrue($filter->shouldBuffer(array(0x59, 0x60, 0x61)),
+ '%s: Filter should buffer since 0x61 0x62 is a needle and the ending '.
+ '0x61 could be from 0x61 0x62'
+ );
+ }
+
+ public function testConvertingAllLineEndingsToCRLFWhenInputIsLF()
+ {
+ $filter = $this->_createFilter(
+ array(array(0x0D, 0x0A), array(0x0D), array(0x0A)),
+ array(array(0x0A), array(0x0A), array(0x0D, 0x0A))
+ );
+
+ $this->assertEquals(
+ array(0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63),
+ $filter->filter(array(0x60, 0x0A, 0x61, 0x0A, 0x62, 0x0A, 0x63))
+ );
+ }
+
+ public function testConvertingAllLineEndingsToCRLFWhenInputIsCR()
+ {
+ $filter = $this->_createFilter(
+ array(array(0x0D, 0x0A), array(0x0D), array(0x0A)),
+ array(array(0x0A), array(0x0A), array(0x0D, 0x0A))
+ );
+
+ $this->assertEquals(
+ array(0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63),
+ $filter->filter(array(0x60, 0x0D, 0x61, 0x0D, 0x62, 0x0D, 0x63))
+ );
+ }
+
+ public function testConvertingAllLineEndingsToCRLFWhenInputIsCRLF()
+ {
+ $filter = $this->_createFilter(
+ array(array(0x0D, 0x0A), array(0x0D), array(0x0A)),
+ array(array(0x0A), array(0x0A), array(0x0D, 0x0A))
+ );
+
+ $this->assertEquals(
+ array(0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63),
+ $filter->filter(array(0x60, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x63))
+ );
+ }
+
+ public function testConvertingAllLineEndingsToCRLFWhenInputIsLFCR()
+ {
+ $filter = $this->_createFilter(
+ array(array(0x0D, 0x0A), array(0x0D), array(0x0A)),
+ array(array(0x0A), array(0x0A), array(0x0D, 0x0A))
+ );
+
+ $this->assertEquals(
+ array(0x60, 0x0D, 0x0A, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x0D, 0x0A, 0x63),
+ $filter->filter(array(0x60, 0x0A, 0x0D, 0x61, 0x0A, 0x0D, 0x62, 0x0A, 0x0D, 0x63))
+ );
+ }
+
+ public function testConvertingAllLineEndingsToCRLFWhenInputContainsLFLF()
+ {
+ //Lighthouse Bug #23
+
+ $filter = $this->_createFilter(
+ array(array(0x0D, 0x0A), array(0x0D), array(0x0A)),
+ array(array(0x0A), array(0x0A), array(0x0D, 0x0A))
+ );
+
+ $this->assertEquals(
+ array(0x60, 0x0D, 0x0A, 0x0D, 0x0A, 0x61, 0x0D, 0x0A, 0x0D, 0x0A, 0x62, 0x0D, 0x0A, 0x0D, 0x0A, 0x63),
+ $filter->filter(array(0x60, 0x0A, 0x0A, 0x61, 0x0A, 0x0A, 0x62, 0x0A, 0x0A, 0x63))
+ );
+ }
+
+ private function _createFilter($search, $replace)
+ {
+ return new Swift_StreamFilters_ByteArrayReplacementFilter($search, $replace);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php
new file mode 100644
index 0000000..c14d5dc
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterFactoryTest.php
@@ -0,0 +1,36 @@
+<?php
+
+class Swift_StreamFilters_StringReplacementFilterFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInstancesOfStringReplacementFilterAreCreated()
+ {
+ $factory = $this->_createFactory();
+ $this->assertInstanceOf(
+ 'Swift_StreamFilters_StringReplacementFilter',
+ $factory->createFilter('a', 'b')
+ );
+ }
+
+ public function testSameInstancesAreCached()
+ {
+ $factory = $this->_createFactory();
+ $filter1 = $factory->createFilter('a', 'b');
+ $filter2 = $factory->createFilter('a', 'b');
+ $this->assertSame($filter1, $filter2, '%s: Instances should be cached');
+ }
+
+ public function testDifferingInstancesAreNotCached()
+ {
+ $factory = $this->_createFactory();
+ $filter1 = $factory->createFilter('a', 'b');
+ $filter2 = $factory->createFilter('a', 'c');
+ $this->assertNotEquals($filter1, $filter2,
+ '%s: Differing instances should not be cached'
+ );
+ }
+
+ private function _createFactory()
+ {
+ return new Swift_StreamFilters_StringReplacementFilterFactory();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php
new file mode 100644
index 0000000..681e235
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/StreamFilters/StringReplacementFilterTest.php
@@ -0,0 +1,59 @@
+<?php
+
+class Swift_StreamFilters_StringReplacementFilterTest extends \PHPUnit_Framework_TestCase
+{
+ public function testBasicReplacementsAreMade()
+ {
+ $filter = $this->_createFilter('foo', 'bar');
+ $this->assertEquals('XbarYbarZ', $filter->filter('XfooYfooZ'));
+ }
+
+ public function testShouldBufferReturnsTrueIfPartialMatchAtEndOfBuffer()
+ {
+ $filter = $this->_createFilter('foo', 'bar');
+ $this->assertTrue($filter->shouldBuffer('XfooYf'),
+ '%s: Filter should buffer since "foo" is the needle and the ending '.
+ '"f" could be from "foo"'
+ );
+ }
+
+ public function testFilterCanMakeMultipleReplacements()
+ {
+ $filter = $this->_createFilter(array('a', 'b'), 'foo');
+ $this->assertEquals('XfooYfooZ', $filter->filter('XaYbZ'));
+ }
+
+ public function testMultipleReplacementsCanBeDifferent()
+ {
+ $filter = $this->_createFilter(array('a', 'b'), array('foo', 'zip'));
+ $this->assertEquals('XfooYzipZ', $filter->filter('XaYbZ'));
+ }
+
+ public function testShouldBufferReturnsFalseIfPartialMatchNotAtEndOfString()
+ {
+ $filter = $this->_createFilter("\r\n", "\n");
+ $this->assertFalse($filter->shouldBuffer("foo\r\nbar"),
+ '%s: Filter should not buffer since x0Dx0A is the needle and is not at EOF'
+ );
+ }
+
+ public function testShouldBufferReturnsTrueIfAnyOfMultipleMatchesAtEndOfString()
+ {
+ $filter = $this->_createFilter(array('foo', 'zip'), 'bar');
+ $this->assertTrue($filter->shouldBuffer('XfooYzi'),
+ '%s: Filter should buffer since "zip" is a needle and the ending '.
+ '"zi" could be from "zip"'
+ );
+ }
+
+ public function testShouldBufferReturnsFalseOnEmptyBuffer()
+ {
+ $filter = $this->_createFilter("\r\n", "\n");
+ $this->assertFalse($filter->shouldBuffer(''));
+ }
+
+ private function _createFilter($search, $replace)
+ {
+ return new Swift_StreamFilters_StringReplacementFilter($search, $replace);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php
new file mode 100644
index 0000000..81bda4f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpEventSupportTest.php
@@ -0,0 +1,558 @@
+<?php
+
+require_once __DIR__.'/AbstractSmtpTest.php';
+
+abstract class Swift_Transport_AbstractSmtpEventSupportTest extends Swift_Transport_AbstractSmtpTest
+{
+ public function testRegisterPluginLoadsPluginInEventDispatcher()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $listener = $this->getMockery('Swift_Events_EventListener');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $dispatcher->shouldReceive('bindEventListener')
+ ->once()
+ ->with($listener);
+
+ $smtp->registerPlugin($listener);
+ }
+
+ public function testSendingDispatchesBeforeSendEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $message = $this->_createMessage();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('mark@swiftmailer.org' => 'Mark'));
+ $dispatcher->shouldReceive('createSendEvent')
+ ->once()
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'beforeSendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(1, $smtp->send($message));
+ }
+
+ public function testSendingDispatchesSendEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $message = $this->_createMessage();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('mark@swiftmailer.org' => 'Mark'));
+ $dispatcher->shouldReceive('createSendEvent')
+ ->once()
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'sendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(1, $smtp->send($message));
+ }
+
+ public function testSendEventCapturesFailures()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('mark@swiftmailer.org' => 'Mark'));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<chris@swiftmailer.org>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<mark@swiftmailer.org>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("500 Not now\r\n");
+ $dispatcher->shouldReceive('createSendEvent')
+ ->zeroOrMoreTimes()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'sendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+ $evt->shouldReceive('setFailedRecipients')
+ ->once()
+ ->with(array('mark@swiftmailer.org'));
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(0, $smtp->send($message));
+ }
+
+ public function testSendEventHasResultFailedIfAllFailures()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('mark@swiftmailer.org' => 'Mark'));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<chris@swiftmailer.org>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<mark@swiftmailer.org>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("500 Not now\r\n");
+ $dispatcher->shouldReceive('createSendEvent')
+ ->zeroOrMoreTimes()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'sendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+ $evt->shouldReceive('setResult')
+ ->once()
+ ->with(Swift_Events_SendEvent::RESULT_FAILED);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(0, $smtp->send($message));
+ }
+
+ public function testSendEventHasResultTentativeIfSomeFailures()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array(
+ 'mark@swiftmailer.org' => 'Mark',
+ 'chris@site.tld' => 'Chris',
+ ));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<chris@swiftmailer.org>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<mark@swiftmailer.org>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("500 Not now\r\n");
+ $dispatcher->shouldReceive('createSendEvent')
+ ->zeroOrMoreTimes()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'sendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+ $evt->shouldReceive('setResult')
+ ->once()
+ ->with(Swift_Events_SendEvent::RESULT_TENTATIVE);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(1, $smtp->send($message));
+ }
+
+ public function testSendEventHasResultSuccessIfNoFailures()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array(
+ 'mark@swiftmailer.org' => 'Mark',
+ 'chris@site.tld' => 'Chris',
+ ));
+ $dispatcher->shouldReceive('createSendEvent')
+ ->zeroOrMoreTimes()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'sendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+ $evt->shouldReceive('setResult')
+ ->once()
+ ->with(Swift_Events_SendEvent::RESULT_SUCCESS);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(2, $smtp->send($message));
+ }
+
+ public function testCancellingEventBubbleBeforeSendStopsEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_SendEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('chris@swiftmailer.org' => null));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('mark@swiftmailer.org' => 'Mark'));
+ $dispatcher->shouldReceive('createSendEvent')
+ ->zeroOrMoreTimes()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'beforeSendPerformed');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->atLeast()->once()
+ ->andReturn(true);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(0, $smtp->send($message));
+ }
+
+ public function testStartingTransportDispatchesTransportChangeEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportChangeEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createTransportChangeEvent')
+ ->atLeast()->once()
+ ->with($smtp)
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'transportStarted');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->atLeast()->once()
+ ->andReturn(false);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ }
+
+ public function testStartingTransportDispatchesBeforeTransportChangeEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportChangeEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createTransportChangeEvent')
+ ->atLeast()->once()
+ ->with($smtp)
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'beforeTransportStarted');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->atLeast()->once()
+ ->andReturn(false);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ }
+
+ public function testCancellingBubbleBeforeTransportStartStopsEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportChangeEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createTransportChangeEvent')
+ ->atLeast()->once()
+ ->with($smtp)
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'beforeTransportStarted');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->atLeast()->once()
+ ->andReturn(true);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+
+ $this->assertFalse($smtp->isStarted(),
+ '%s: Transport should not be started since event bubble was cancelled'
+ );
+ }
+
+ public function testStoppingTransportDispatchesTransportChangeEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportChangeEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createTransportChangeEvent')
+ ->atLeast()->once()
+ ->with($smtp)
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'transportStopped');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->stop();
+ }
+
+ public function testStoppingTransportDispatchesBeforeTransportChangeEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportChangeEvent')->shouldIgnoreMissing();
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createTransportChangeEvent')
+ ->atLeast()->once()
+ ->with($smtp)
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'beforeTransportStopped');
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->stop();
+ }
+
+ public function testCancellingBubbleBeforeTransportStoppedStopsEvent()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportChangeEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $hasRun = false;
+ $dispatcher->shouldReceive('createTransportChangeEvent')
+ ->atLeast()->once()
+ ->with($smtp)
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'beforeTransportStopped')
+ ->andReturnUsing(function () use (&$hasRun) {
+ $hasRun = true;
+ });
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->zeroOrMoreTimes();
+ $evt->shouldReceive('bubbleCancelled')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$hasRun) {
+ return $hasRun;
+ });
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->stop();
+
+ $this->assertTrue($smtp->isStarted(),
+ '%s: Transport should not be stopped since event bubble was cancelled'
+ );
+ }
+
+ public function testResponseEventsAreGenerated()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_ResponseEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createResponseEvent')
+ ->atLeast()->once()
+ ->with($smtp, \Mockery::any(), \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->atLeast()->once()
+ ->with($evt, 'responseReceived');
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ }
+
+ public function testCommandEventsAreGenerated()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_CommandEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $dispatcher->shouldReceive('createCommandEvent')
+ ->once()
+ ->with($smtp, \Mockery::any(), \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'commandSent');
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ }
+
+ public function testExceptionsCauseExceptionEvents()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportExceptionEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $buf->shouldReceive('readLine')
+ ->atLeast()->once()
+ ->andReturn("503 I'm sleepy, go away!\r\n");
+ $dispatcher->shouldReceive('createTransportExceptionEvent')
+ ->zeroOrMoreTimes()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->once()
+ ->with($evt, 'exceptionThrown');
+ $evt->shouldReceive('bubbleCancelled')
+ ->atLeast()->once()
+ ->andReturn(false);
+
+ try {
+ $smtp->start();
+ $this->fail('TransportException should be thrown on invalid response');
+ } catch (Swift_TransportException $e) {
+ }
+ }
+
+ public function testExceptionBubblesCanBeCancelled()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher(false);
+ $evt = $this->getMockery('Swift_Events_TransportExceptionEvent');
+ $smtp = $this->_getTransport($buf, $dispatcher);
+
+ $buf->shouldReceive('readLine')
+ ->atLeast()->once()
+ ->andReturn("503 I'm sleepy, go away!\r\n");
+ $dispatcher->shouldReceive('createTransportExceptionEvent')
+ ->twice()
+ ->with($smtp, \Mockery::any())
+ ->andReturn($evt);
+ $dispatcher->shouldReceive('dispatchEvent')
+ ->twice()
+ ->with($evt, 'exceptionThrown');
+ $evt->shouldReceive('bubbleCancelled')
+ ->atLeast()->once()
+ ->andReturn(true);
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ }
+
+ protected function _createEventDispatcher($stub = true)
+ {
+ return $this->getMockery('Swift_Events_EventDispatcher')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php
new file mode 100644
index 0000000..f49b489
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/AbstractSmtpTest.php
@@ -0,0 +1,1249 @@
+<?php
+
+abstract class Swift_Transport_AbstractSmtpTest extends \SwiftMailerTestCase
+{
+ /** Abstract test method */
+ abstract protected function _getTransport($buf);
+
+ public function testStartAccepts220ServiceGreeting()
+ {
+ /* -- RFC 2821, 4.2.
+
+ Greeting = "220 " Domain [ SP text ] CRLF
+
+ -- RFC 2822, 4.3.2.
+
+ CONNECTION ESTABLISHMENT
+ S: 220
+ E: 554
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started');
+ $smtp->start();
+ $this->assertTrue($smtp->isStarted(), '%s: start() should have started connection');
+ } catch (Exception $e) {
+ $this->fail('220 is a valid SMTP greeting and should be accepted');
+ }
+ }
+
+ public function testBadGreetingCausesException()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("554 I'm busy\r\n");
+ $this->_finishBuffer($buf);
+ try {
+ $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started');
+ $smtp->start();
+ $this->fail('554 greeting indicates an error and should cause an exception');
+ } catch (Exception $e) {
+ $this->assertFalse($smtp->isStarted(), '%s: start() should have failed');
+ }
+ }
+
+ public function testStartSendsHeloToInitiate()
+ {
+ /* -- RFC 2821, 3.2.
+
+ 3.2 Client Initiation
+
+ Once the server has sent the welcoming message and the client has
+ received it, the client normally sends the EHLO command to the
+ server, indicating the client's identity. In addition to opening the
+ session, use of EHLO indicates that the client is able to process
+ service extensions and requests that the server provide a list of the
+ extensions it supports. Older SMTP systems which are unable to
+ support service extensions and contemporary clients which do not
+ require service extensions in the mail session being initiated, MAY
+ use HELO instead of EHLO. Servers MUST NOT return the extended
+ EHLO-style response to a HELO command. For a particular connection
+ attempt, if the server returns a "command not recognized" response to
+ EHLO, the client SHOULD be able to fall back and send HELO.
+
+ In the EHLO command the host sending the command identifies itself;
+ the command may be interpreted as saying "Hello, I am <domain>" (and,
+ in the case of EHLO, "and I support service extension requests").
+
+ -- RFC 2281, 4.1.1.1.
+
+ ehlo = "EHLO" SP Domain CRLF
+ helo = "HELO" SP Domain CRLF
+
+ -- RFC 2821, 4.3.2.
+
+ EHLO or HELO
+ S: 250
+ E: 504, 550
+
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^HELO .*?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 ServerName'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ } catch (Exception $e) {
+ $this->fail('Starting SMTP should send HELO and accept 250 response');
+ }
+ }
+
+ public function testInvalidHeloResponseCausesException()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^HELO .*?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('504 WTF'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started');
+ $smtp->start();
+ $this->fail('Non 250 HELO response should raise Exception');
+ } catch (Exception $e) {
+ $this->assertFalse($smtp->isStarted(), '%s: SMTP start() should have failed');
+ }
+ }
+
+ public function testDomainNameIsPlacedInHelo()
+ {
+ /* -- RFC 2821, 4.1.4.
+
+ The SMTP client MUST, if possible, ensure that the domain parameter
+ to the EHLO command is a valid principal host name (not a CNAME or MX
+ name) for its host. If this is not possible (e.g., when the client's
+ address is dynamically assigned and the client does not have an
+ obvious name), an address literal SHOULD be substituted for the
+ domain name and supplemental information provided that will assist in
+ identifying the client.
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("HELO mydomain.com\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 ServerName'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->setLocalDomain('mydomain.com');
+ $smtp->start();
+ }
+
+ public function testSuccessfulMailCommand()
+ {
+ /* -- RFC 2821, 3.3.
+
+ There are three steps to SMTP mail transactions. The transaction
+ starts with a MAIL command which gives the sender identification.
+
+ .....
+
+ The first step in the procedure is the MAIL command.
+
+ MAIL FROM:<reverse-path> [SP <mail-parameters> ] <CRLF>
+
+ -- RFC 2821, 4.1.1.2.
+
+ Syntax:
+
+ "MAIL FROM:" ("<>" / Reverse-Path)
+ [SP Mail-parameters] CRLF
+ -- RFC 2821, 4.1.2.
+
+ Reverse-path = Path
+ Forward-path = Path
+ Path = "<" [ A-d-l ":" ] Mailbox ">"
+ A-d-l = At-domain *( "," A-d-l )
+ ; Note that this form, the so-called "source route",
+ ; MUST BE accepted, SHOULD NOT be generated, and SHOULD be
+ ; ignored.
+ At-domain = "@" domain
+
+ -- RFC 2821, 4.3.2.
+
+ MAIL
+ S: 250
+ E: 552, 451, 452, 550, 553, 503
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 OK\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ $smtp->send($message);
+ } catch (Exception $e) {
+ $this->fail('MAIL FROM should accept a 250 response');
+ }
+ }
+
+ public function testInvalidResponseCodeFromMailCausesException()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('553 Bad'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ $smtp->send($message);
+ $this->fail('MAIL FROM should accept a 250 response');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testSenderIsPreferredOverFrom()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getSender')
+ ->once()
+ ->andReturn(array('another@domain.com' => 'Someone'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<another@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testReturnPathIsPreferredOverSender()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getSender')
+ ->once()
+ ->andReturn(array('another@domain.com' => 'Someone'));
+ $message->shouldReceive('getReturnPath')
+ ->once()
+ ->andReturn('more@domain.com');
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<more@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testSuccessfulRcptCommandWith250Response()
+ {
+ /* -- RFC 2821, 3.3.
+
+ The second step in the procedure is the RCPT command.
+
+ RCPT TO:<forward-path> [ SP <rcpt-parameters> ] <CRLF>
+
+ The first or only argument to this command includes a forward-path
+ (normally a mailbox and domain, always surrounded by "<" and ">"
+ brackets) identifying one recipient. If accepted, the SMTP server
+ returns a 250 OK reply and stores the forward-path. If the recipient
+ is known not to be a deliverable address, the SMTP server returns a
+ 550 reply, typically with a string such as "no such user - " and the
+ mailbox name (other circumstances and reply codes are possible).
+ This step of the procedure can be repeated any number of times.
+
+ -- RFC 2821, 4.1.1.3.
+
+ This command is used to identify an individual recipient of the mail
+ data; multiple recipients are specified by multiple use of this
+ command. The argument field contains a forward-path and may contain
+ optional parameters.
+
+ The forward-path normally consists of the required destination
+ mailbox. Sending systems SHOULD not generate the optional list of
+ hosts known as a source route.
+
+ .......
+
+ "RCPT TO:" ("<Postmaster@" domain ">" / "<Postmaster>" / Forward-Path)
+ [SP Rcpt-parameters] CRLF
+
+ -- RFC 2821, 4.2.2.
+
+ 250 Requested mail action okay, completed
+ 251 User not local; will forward to <forward-path>
+ (See section 3.4)
+ 252 Cannot VRFY user, but will accept message and attempt
+ delivery
+
+ -- RFC 2821, 4.3.2.
+
+ RCPT
+ S: 250, 251 (but see section 3.4 for discussion of 251 and 551)
+ E: 550, 551, 552, 553, 450, 451, 452, 503, 550
+ */
+
+ //We'll treat 252 as accepted since it isn't really a failure
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ $smtp->send($message);
+ } catch (Exception $e) {
+ $this->fail('RCPT TO should accept a 250 response');
+ }
+ }
+
+ public function testMailFromCommandIsOnlySentOncePerMessage()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->never()
+ ->with("MAIL FROM:<me@domain.com>\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testMultipleRecipientsSendsMultipleRcpt()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array(
+ 'foo@bar' => null,
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<zip@button>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<test@domain>\r\n")
+ ->andReturn(3);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(3)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testCcRecipientsSendsMultipleRcpt()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('getCc')
+ ->once()
+ ->andReturn(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<zip@button>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<test@domain>\r\n")
+ ->andReturn(3);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(3)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testSendReturnsNumberOfSuccessfulRecipients()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('getCc')
+ ->once()
+ ->andReturn(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<zip@button>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('501 Nobody here'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<test@domain>\r\n")
+ ->andReturn(3);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(3)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(2, $smtp->send($message),
+ '%s: 1 of 3 recipients failed so 2 should be returned'
+ );
+ }
+
+ public function testRsetIsSentIfNoSuccessfulRecipients()
+ {
+ /* --RFC 2821, 4.1.1.5.
+
+ This command specifies that the current mail transaction will be
+ aborted. Any stored sender, recipients, and mail data MUST be
+ discarded, and all buffers and state tables cleared. The receiver
+ MUST send a "250 OK" reply to a RSET command with no arguments. A
+ reset command may be issued by the client at any time.
+
+ -- RFC 2821, 4.3.2.
+
+ RSET
+ S: 250
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('503 Bad'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RSET\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(0, $smtp->send($message),
+ '%s: 1 of 1 recipients failed so 0 should be returned'
+ );
+ }
+
+ public function testSuccessfulDataCommand()
+ {
+ /* -- RFC 2821, 3.3.
+
+ The third step in the procedure is the DATA command (or some
+ alternative specified in a service extension).
+
+ DATA <CRLF>
+
+ If accepted, the SMTP server returns a 354 Intermediate reply and
+ considers all succeeding lines up to but not including the end of
+ mail data indicator to be the message text.
+
+ -- RFC 2821, 4.1.1.4.
+
+ The receiver normally sends a 354 response to DATA, and then treats
+ the lines (strings ending in <CRLF> sequences, as described in
+ section 2.3.7) following the command as mail data from the sender.
+ This command causes the mail data to be appended to the mail data
+ buffer. The mail data may contain any of the 128 ASCII character
+ codes, although experience has indicated that use of control
+ characters other than SP, HT, CR, and LF may cause problems and
+ SHOULD be avoided when possible.
+
+ -- RFC 2821, 4.3.2.
+
+ DATA
+ I: 354 -> data -> S: 250
+ E: 552, 554, 451, 452
+ E: 451, 554, 503
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("DATA\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('354 Go ahead'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ $smtp->send($message);
+ } catch (Exception $e) {
+ $this->fail('354 is the expected response to DATA');
+ }
+ }
+
+ public function testBadDataResponseCausesException()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("DATA\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('451 Bad'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ $smtp->send($message);
+ $this->fail('354 is the expected response to DATA (not observed)');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testMessageIsStreamedToBufferForData()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("DATA\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('354 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("\r\n.\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 OK'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testBadResponseAfterDataTransmissionCausesException()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->once()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->once()
+ ->andReturn(array('foo@bar' => null));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("DATA\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('354 OK'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("\r\n.\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('554 Error'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ $smtp->send($message);
+ $this->fail('250 is the expected response after a DATA transmission (not observed)');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testBccRecipientsAreRemovedFromHeaders()
+ {
+ /* -- RFC 2821, 7.2.
+
+ Addresses that do not appear in the message headers may appear in the
+ RCPT commands to an SMTP server for a number of reasons. The two
+ most common involve the use of a mailing address as a "list exploder"
+ (a single address that resolves into multiple addresses) and the
+ appearance of "blind copies". Especially when more than one RCPT
+ command is present, and in order to avoid defeating some of the
+ purpose of these mechanisms, SMTP clients and servers SHOULD NOT copy
+ the full set of RCPT command arguments into the headers, either as
+ part of trace headers or as informational or private-extension
+ headers. Since this rule is often violated in practice, and cannot
+ be enforced, sending SMTP systems that are aware of "bcc" use MAY
+ find it helpful to send each blind copy as a separate message
+ transaction containing only a single RCPT command.
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('getBcc')
+ ->zeroOrMoreTimes()
+ ->andReturn(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array());
+ $message->shouldReceive('setBcc')
+ ->zeroOrMoreTimes();
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testEachBccRecipientIsSentASeparateMessage()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('getBcc')
+ ->zeroOrMoreTimes()
+ ->andReturn(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $message->shouldReceive('setBcc')
+ ->atLeast()->once()
+ ->with(array());
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array('zip@button' => 'Zip Button'));
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array('test@domain' => 'Test user'));
+ $message->shouldReceive('setBcc')
+ ->atLeast()->once()
+ ->with(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+
+ $buf->shouldReceive('write')->once()->with("MAIL FROM:<me@domain.com>\r\n")->andReturn(1);
+ $buf->shouldReceive('readLine')->once()->with(1)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("RCPT TO:<foo@bar>\r\n")->andReturn(2);
+ $buf->shouldReceive('readLine')->once()->with(2)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(3);
+ $buf->shouldReceive('readLine')->once()->with(3)->andReturn("354 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(4);
+ $buf->shouldReceive('readLine')->once()->with(4)->andReturn("250 OK\r\n");
+
+ $buf->shouldReceive('write')->once()->with("MAIL FROM:<me@domain.com>\r\n")->andReturn(5);
+ $buf->shouldReceive('readLine')->once()->with(5)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("RCPT TO:<zip@button>\r\n")->andReturn(6);
+ $buf->shouldReceive('readLine')->once()->with(6)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(7);
+ $buf->shouldReceive('readLine')->once()->with(7)->andReturn("354 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(8);
+ $buf->shouldReceive('readLine')->once()->with(8)->andReturn("250 OK\r\n");
+
+ $buf->shouldReceive('write')->once()->with("MAIL FROM:<me@domain.com>\r\n")->andReturn(9);
+ $buf->shouldReceive('readLine')->once()->with(9)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("RCPT TO:<test@domain>\r\n")->andReturn(10);
+ $buf->shouldReceive('readLine')->once()->with(10)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(11);
+ $buf->shouldReceive('readLine')->once()->with(11)->andReturn("354 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(12);
+ $buf->shouldReceive('readLine')->once()->with(12)->andReturn("250 OK\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(3, $smtp->send($message));
+ }
+
+ public function testMessageStateIsRestoredOnFailure()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('getBcc')
+ ->zeroOrMoreTimes()
+ ->andReturn(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array());
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain.com>\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("DATA\r\n")
+ ->andReturn(3);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(3)
+ ->andReturn("451 No\r\n");
+
+ $this->_finishBuffer($buf);
+
+ $smtp->start();
+ try {
+ $smtp->send($message);
+ $this->fail('A bad response was given so exception is expected');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testStopSendsQuitCommand()
+ {
+ /* -- RFC 2821, 4.1.1.10.
+
+ This command specifies that the receiver MUST send an OK reply, and
+ then close the transmission channel.
+
+ The receiver MUST NOT intentionally close the transmission channel
+ until it receives and replies to a QUIT command (even if there was an
+ error). The sender MUST NOT intentionally close the transmission
+ channel until it sends a QUIT command and SHOULD wait until it
+ receives the reply (even if there was an error response to a previous
+ command). If the connection is closed prematurely due to violations
+ of the above or system or network failure, the server MUST cancel any
+ pending transaction, but not undo any previously completed
+ transaction, and generally MUST act as if the command or transaction
+ in progress had received a temporary error (i.e., a 4yz response).
+
+ The QUIT command may be issued at any time.
+
+ Syntax:
+ "QUIT" CRLF
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("QUIT\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("221 Bye\r\n");
+ $buf->shouldReceive('terminate')
+ ->once();
+
+ $this->_finishBuffer($buf);
+
+ $this->assertFalse($smtp->isStarted());
+ $smtp->start();
+ $this->assertTrue($smtp->isStarted());
+ $smtp->stop();
+ $this->assertFalse($smtp->isStarted());
+ }
+
+ public function testBufferCanBeFetched()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ref = $smtp->getBuffer();
+ $this->assertEquals($buf, $ref);
+ }
+
+ public function testBufferCanBeWrittenToUsingExecuteCommand()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with("FOO\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with(1)
+ ->andReturn("250 OK\r\n");
+
+ $res = $smtp->executeCommand("FOO\r\n");
+ $this->assertEquals("250 OK\r\n", $res);
+ }
+
+ public function testResponseCodesAreValidated()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with("FOO\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with(1)
+ ->andReturn("551 Not ok\r\n");
+
+ try {
+ $smtp->executeCommand("FOO\r\n", array(250, 251));
+ $this->fail('A 250 or 251 response was needed but 551 was returned.');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testFailedRecipientsCanBeCollectedByReference()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('getBcc')
+ ->zeroOrMoreTimes()
+ ->andReturn(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+ $message->shouldReceive('setBcc')
+ ->atLeast()->once()
+ ->with(array());
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array('zip@button' => 'Zip Button'));
+ $message->shouldReceive('setBcc')
+ ->once()
+ ->with(array('test@domain' => 'Test user'));
+ $message->shouldReceive('setBcc')
+ ->atLeast()->once()
+ ->with(array(
+ 'zip@button' => 'Zip Button',
+ 'test@domain' => 'Test user',
+ ));
+
+ $buf->shouldReceive('write')->once()->with("MAIL FROM:<me@domain.com>\r\n")->andReturn(1);
+ $buf->shouldReceive('readLine')->once()->with(1)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("RCPT TO:<foo@bar>\r\n")->andReturn(2);
+ $buf->shouldReceive('readLine')->once()->with(2)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("DATA\r\n")->andReturn(3);
+ $buf->shouldReceive('readLine')->once()->with(3)->andReturn("354 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("\r\n.\r\n")->andReturn(4);
+ $buf->shouldReceive('readLine')->once()->with(4)->andReturn("250 OK\r\n");
+
+ $buf->shouldReceive('write')->once()->with("MAIL FROM:<me@domain.com>\r\n")->andReturn(5);
+ $buf->shouldReceive('readLine')->once()->with(5)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("RCPT TO:<zip@button>\r\n")->andReturn(6);
+ $buf->shouldReceive('readLine')->once()->with(6)->andReturn("500 Bad\r\n");
+ $buf->shouldReceive('write')->once()->with("RSET\r\n")->andReturn(7);
+ $buf->shouldReceive('readLine')->once()->with(7)->andReturn("250 OK\r\n");
+
+ $buf->shouldReceive('write')->once()->with("MAIL FROM:<me@domain.com>\r\n")->andReturn(9);
+ $buf->shouldReceive('readLine')->once()->with(9)->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')->once()->with("RCPT TO:<test@domain>\r\n")->andReturn(10);
+ $buf->shouldReceive('readLine')->once()->with(10)->andReturn("500 Bad\r\n");
+ $buf->shouldReceive('write')->once()->with("RSET\r\n")->andReturn(11);
+ $buf->shouldReceive('readLine')->once()->with(11)->andReturn("250 OK\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $this->assertEquals(1, $smtp->send($message, $failures));
+ $this->assertEquals(array('zip@button', 'test@domain'), $failures,
+ '%s: Failures should be caught in an array'
+ );
+ }
+
+ public function testSendingRegeneratesMessageId()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $message = $this->_createMessage();
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain.com' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+ $message->shouldReceive('generateId')
+ ->once();
+
+ $this->_finishBuffer($buf);
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ protected function _getBuffer()
+ {
+ return $this->getMockery('Swift_Transport_IoBuffer')->shouldIgnoreMissing();
+ }
+
+ protected function _createMessage()
+ {
+ return $this->getMockery('Swift_Mime_Message')->shouldIgnoreMissing();
+ }
+
+ protected function _finishBuffer($buf)
+ {
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with(0)
+ ->andReturn('220 server.com foo'."\r\n");
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with('~^(EH|HE)LO .*?\r\n$~D')
+ ->andReturn($x = uniqid());
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with($x)
+ ->andReturn('250 ServerName'."\r\n");
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with('~^MAIL FROM:<.*?>\r\n$~D')
+ ->andReturn($x = uniqid());
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with($x)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with('~^RCPT TO:<.*?>\r\n$~D')
+ ->andReturn($x = uniqid());
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with($x)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with("DATA\r\n")
+ ->andReturn($x = uniqid());
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with($x)
+ ->andReturn("354 OK\r\n");
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with("\r\n.\r\n")
+ ->andReturn($x = uniqid());
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with($x)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->with("RSET\r\n")
+ ->andReturn($x = uniqid());
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->with($x)
+ ->andReturn("250 OK\r\n");
+
+ $buf->shouldReceive('write')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+ $buf->shouldReceive('readLine')
+ ->zeroOrMoreTimes()
+ ->andReturn(false);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php
new file mode 100644
index 0000000..aca03a9
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/CramMd5AuthenticatorTest.php
@@ -0,0 +1,64 @@
+<?php
+
+class Swift_Transport_Esmtp_Auth_CramMd5AuthenticatorTest extends \SwiftMailerTestCase
+{
+ private $_agent;
+
+ protected function setUp()
+ {
+ $this->_agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing();
+ }
+
+ public function testKeywordIsCramMd5()
+ {
+ /* -- RFC 2195, 2.
+ The authentication type associated with CRAM is "CRAM-MD5".
+ */
+
+ $cram = $this->_getAuthenticator();
+ $this->assertEquals('CRAM-MD5', $cram->getAuthKeyword());
+ }
+
+ public function testSuccessfulAuthentication()
+ {
+ $cram = $this->_getAuthenticator();
+
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("AUTH CRAM-MD5\r\n", array(334))
+ ->andReturn('334 '.base64_encode('<foo@bar>')."\r\n");
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(\Mockery::any(), array(235));
+
+ $this->assertTrue($cram->authenticate($this->_agent, 'jack', 'pass'),
+ '%s: The buffer accepted all commands authentication should succeed'
+ );
+ }
+
+ public function testAuthenticationFailureSendRsetAndReturnFalse()
+ {
+ $cram = $this->_getAuthenticator();
+
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("AUTH CRAM-MD5\r\n", array(334))
+ ->andReturn('334 '.base64_encode('<foo@bar>')."\r\n");
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(\Mockery::any(), array(235))
+ ->andThrow(new Swift_TransportException(''));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("RSET\r\n", array(250));
+
+ $this->assertFalse($cram->authenticate($this->_agent, 'jack', 'pass'),
+ '%s: Authentication fails, so RSET should be sent'
+ );
+ }
+
+ private function _getAuthenticator()
+ {
+ return new Swift_Transport_Esmtp_Auth_CramMd5Authenticator();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php
new file mode 100644
index 0000000..13f0209
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/LoginAuthenticatorTest.php
@@ -0,0 +1,64 @@
+<?php
+
+class Swift_Transport_Esmtp_Auth_LoginAuthenticatorTest extends \SwiftMailerTestCase
+{
+ private $_agent;
+
+ protected function setUp()
+ {
+ $this->_agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing();
+ }
+
+ public function testKeywordIsLogin()
+ {
+ $login = $this->_getAuthenticator();
+ $this->assertEquals('LOGIN', $login->getAuthKeyword());
+ }
+
+ public function testSuccessfulAuthentication()
+ {
+ $login = $this->_getAuthenticator();
+
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("AUTH LOGIN\r\n", array(334));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(base64_encode('jack')."\r\n", array(334));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(base64_encode('pass')."\r\n", array(235));
+
+ $this->assertTrue($login->authenticate($this->_agent, 'jack', 'pass'),
+ '%s: The buffer accepted all commands authentication should succeed'
+ );
+ }
+
+ public function testAuthenticationFailureSendRsetAndReturnFalse()
+ {
+ $login = $this->_getAuthenticator();
+
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("AUTH LOGIN\r\n", array(334));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(base64_encode('jack')."\r\n", array(334));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(base64_encode('pass')."\r\n", array(235))
+ ->andThrow(new Swift_TransportException(''));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("RSET\r\n", array(250));
+
+ $this->assertFalse($login->authenticate($this->_agent, 'jack', 'pass'),
+ '%s: Authentication fails, so RSET should be sent'
+ );
+ }
+
+ private function _getAuthenticator()
+ {
+ return new Swift_Transport_Esmtp_Auth_LoginAuthenticator();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php
new file mode 100644
index 0000000..911d258
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/NTLMAuthenticatorTest.php
@@ -0,0 +1,213 @@
+<?php
+
+class Swift_Transport_Esmtp_Auth_NTLMAuthenticatorTest extends \SwiftMailerTestCase
+{
+ private $_message1 = '4e544c4d535350000100000007020000';
+ private $_message2 = '4e544c4d53535000020000000c000c003000000035828980514246973ea892c10000000000000000460046003c00000054004500530054004e00540002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d0000000000';
+ private $_message3 = '4e544c4d5353500003000000180018006000000076007600780000000c000c0040000000080008004c0000000c000c0054000000000000009a0000000102000054004500530054004e00540074006500730074004d0045004d00420045005200bf2e015119f6bdb3f6fdb768aa12d478f5ce3d2401c8f6e9caa4da8f25d5e840974ed8976d3ada46010100000000000030fa7e3c677bc301f5ce3d2401c8f6e90000000002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d000000000000000000';
+
+ protected function setUp()
+ {
+ if (!function_exists('openssl_encrypt') || !function_exists('openssl_random_pseudo_bytes') || !function_exists('bcmul') || !function_exists('iconv')) {
+ $this->markTestSkipped('One of the required functions is not available.');
+ }
+ }
+
+ public function testKeywordIsNtlm()
+ {
+ $login = $this->_getAuthenticator();
+ $this->assertEquals('NTLM', $login->getAuthKeyword());
+ }
+
+ public function testMessage1Generator()
+ {
+ $login = $this->_getAuthenticator();
+ $message1 = $this->_invokePrivateMethod('createMessage1', $login);
+
+ $this->assertEquals($this->_message1, bin2hex($message1), '%s: We send the smallest ntlm message which should never fail.');
+ }
+
+ public function testLMv1Generator()
+ {
+ $password = 'test1234';
+ $challenge = 'b019d38bad875c9d';
+ $lmv1 = '1879f60127f8a877022132ec221bcbf3ca016a9f76095606';
+
+ $login = $this->_getAuthenticator();
+ $lmv1Result = $this->_invokePrivateMethod('createLMPassword', $login, array($password, $this->hex2bin($challenge)));
+
+ $this->assertEquals($lmv1, bin2hex($lmv1Result), '%s: The keys should be the same cause we use the same values to generate them.');
+ }
+
+ public function testLMv2Generator()
+ {
+ $username = 'user';
+ $password = 'SecREt01';
+ $domain = 'DOMAIN';
+ $challenge = '0123456789abcdef';
+ $lmv2 = 'd6e6152ea25d03b7c6ba6629c2d6aaf0ffffff0011223344';
+
+ $login = $this->_getAuthenticator();
+ $lmv2Result = $this->_invokePrivateMethod('createLMv2Password', $login, array($password, $username, $domain, $this->hex2bin($challenge), $this->hex2bin('ffffff0011223344')));
+
+ $this->assertEquals($lmv2, bin2hex($lmv2Result), '%s: The keys should be the same cause we use the same values to generate them.');
+ }
+
+ public function testMessage3v1Generator()
+ {
+ $username = 'test';
+ $domain = 'TESTNT';
+ $workstation = 'MEMBER';
+ $lmResponse = '1879f60127f8a877022132ec221bcbf3ca016a9f76095606';
+ $ntlmResponse = 'e6285df3287c5d194f84df1a94817c7282d09754b6f9e02a';
+ $message3T = '4e544c4d5353500003000000180018006000000018001800780000000c000c0040000000080008004c0000000c000c0054000000000000009a0000000102000054004500530054004e00540074006500730074004d0045004d004200450052001879f60127f8a877022132ec221bcbf3ca016a9f76095606e6285df3287c5d194f84df1a94817c7282d09754b6f9e02a';
+
+ $login = $this->_getAuthenticator();
+ $message3 = $this->_invokePrivateMethod('createMessage3', $login, array($domain, $username, $workstation, $this->hex2bin($lmResponse), $this->hex2bin($ntlmResponse)));
+
+ $this->assertEquals($message3T, bin2hex($message3), '%s: We send the same information as the example is created with so this should be the same');
+ }
+
+ public function testMessage3v2Generator()
+ {
+ $username = 'test';
+ $domain = 'TESTNT';
+ $workstation = 'MEMBER';
+ $lmResponse = 'bf2e015119f6bdb3f6fdb768aa12d478f5ce3d2401c8f6e9';
+ $ntlmResponse = 'caa4da8f25d5e840974ed8976d3ada46010100000000000030fa7e3c677bc301f5ce3d2401c8f6e90000000002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d000000000000000000';
+
+ $login = $this->_getAuthenticator();
+ $message3 = $this->_invokePrivateMethod('createMessage3', $login, array($domain, $username, $workstation, $this->hex2bin($lmResponse), $this->hex2bin($ntlmResponse)));
+
+ $this->assertEquals($this->_message3, bin2hex($message3), '%s: We send the same information as the example is created with so this should be the same');
+ }
+
+ public function testGetDomainAndUsername()
+ {
+ $username = "DOMAIN\user";
+
+ $login = $this->_getAuthenticator();
+ list($domain, $user) = $this->_invokePrivateMethod('getDomainAndUsername', $login, array($username));
+
+ $this->assertEquals('DOMAIN', $domain, '%s: the fetched domain did not match');
+ $this->assertEquals('user', $user, '%s: the fetched user did not match');
+ }
+
+ public function testGetDomainAndUsernameWithExtension()
+ {
+ $username = "domain.com\user";
+
+ $login = $this->_getAuthenticator();
+ list($domain, $user) = $this->_invokePrivateMethod('getDomainAndUsername', $login, array($username));
+
+ $this->assertEquals('domain.com', $domain, '%s: the fetched domain did not match');
+ $this->assertEquals('user', $user, '%s: the fetched user did not match');
+ }
+
+ public function testGetDomainAndUsernameWithAtSymbol()
+ {
+ $username = 'user@DOMAIN';
+
+ $login = $this->_getAuthenticator();
+ list($domain, $user) = $this->_invokePrivateMethod('getDomainAndUsername', $login, array($username));
+
+ $this->assertEquals('DOMAIN', $domain, '%s: the fetched domain did not match');
+ $this->assertEquals('user', $user, '%s: the fetched user did not match');
+ }
+
+ public function testGetDomainAndUsernameWithAtSymbolAndExtension()
+ {
+ $username = 'user@domain.com';
+
+ $login = $this->_getAuthenticator();
+ list($domain, $user) = $this->_invokePrivateMethod('getDomainAndUsername', $login, array($username));
+
+ $this->assertEquals('domain.com', $domain, '%s: the fetched domain did not match');
+ $this->assertEquals('user', $user, '%s: the fetched user did not match');
+ }
+
+ public function testGetDomainAndUsernameWithoutDomain()
+ {
+ $username = 'user';
+
+ $login = $this->_getAuthenticator();
+ list($domain, $user) = $this->_invokePrivateMethod('getDomainAndUsername', $login, array($username));
+
+ $this->assertEquals('', $domain, '%s: the fetched domain did not match');
+ $this->assertEquals('user', $user, '%s: the fetched user did not match');
+ }
+
+ public function testSuccessfulAuthentication()
+ {
+ $domain = 'TESTNT';
+ $username = 'test';
+ $secret = 'test1234';
+
+ $ntlm = $this->_getAuthenticator();
+ $agent = $this->_getAgent();
+ $agent->shouldReceive('executeCommand')
+ ->once()
+ ->with('AUTH NTLM '.base64_encode(
+ $this->_invokePrivateMethod('createMessage1', $ntlm)
+ )."\r\n", array(334))
+ ->andReturn('334 '.base64_encode($this->hex2bin('4e544c4d53535000020000000c000c003000000035828980514246973ea892c10000000000000000460046003c00000054004500530054004e00540002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d0000000000')));
+ $agent->shouldReceive('executeCommand')
+ ->once()
+ ->with(base64_encode(
+ $this->_invokePrivateMethod('createMessage3', $ntlm, array($domain, $username, $this->hex2bin('4d0045004d00420045005200'), $this->hex2bin('bf2e015119f6bdb3f6fdb768aa12d478f5ce3d2401c8f6e9'), $this->hex2bin('caa4da8f25d5e840974ed8976d3ada46010100000000000030fa7e3c677bc301f5ce3d2401c8f6e90000000002000c0054004500530054004e00540001000c004d0045004d0042004500520003001e006d0065006d006200650072002e0074006500730074002e0063006f006d000000000000000000'))
+ ))."\r\n", array(235));
+
+ $this->assertTrue($ntlm->authenticate($agent, $username.'@'.$domain, $secret, $this->hex2bin('30fa7e3c677bc301'), $this->hex2bin('f5ce3d2401c8f6e9')), '%s: The buffer accepted all commands authentication should succeed');
+ }
+
+ public function testAuthenticationFailureSendRsetAndReturnFalse()
+ {
+ $domain = 'TESTNT';
+ $username = 'test';
+ $secret = 'test1234';
+
+ $ntlm = $this->_getAuthenticator();
+ $agent = $this->_getAgent();
+ $agent->shouldReceive('executeCommand')
+ ->once()
+ ->with('AUTH NTLM '.base64_encode(
+ $this->_invokePrivateMethod('createMessage1', $ntlm)
+ )."\r\n", array(334))
+ ->andThrow(new Swift_TransportException(''));
+ $agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("RSET\r\n", array(250));
+
+ $this->assertFalse($ntlm->authenticate($agent, $username.'@'.$domain, $secret, $this->hex2bin('30fa7e3c677bc301'), $this->hex2bin('f5ce3d2401c8f6e9')), '%s: Authentication fails, so RSET should be sent');
+ }
+
+ private function _getAuthenticator()
+ {
+ return new Swift_Transport_Esmtp_Auth_NTLMAuthenticator();
+ }
+
+ private function _getAgent()
+ {
+ return $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing();
+ }
+
+ private function _invokePrivateMethod($method, $instance, array $args = array())
+ {
+ $methodC = new ReflectionMethod($instance, trim($method));
+ $methodC->setAccessible(true);
+
+ return $methodC->invokeArgs($instance, $args);
+ }
+
+ /**
+ * Hex2bin replacement for < PHP 5.4.
+ *
+ * @param string $hex
+ *
+ * @return string Binary
+ */
+ protected function hex2bin($hex)
+ {
+ return function_exists('hex2bin') ? hex2bin($hex) : pack('H*', $hex);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php
new file mode 100644
index 0000000..73a9062
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/Auth/PlainAuthenticatorTest.php
@@ -0,0 +1,67 @@
+<?php
+
+class Swift_Transport_Esmtp_Auth_PlainAuthenticatorTest extends \SwiftMailerTestCase
+{
+ private $_agent;
+
+ protected function setUp()
+ {
+ $this->_agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing();
+ }
+
+ public function testKeywordIsPlain()
+ {
+ /* -- RFC 4616, 1.
+ The name associated with this mechanism is "PLAIN".
+ */
+
+ $login = $this->_getAuthenticator();
+ $this->assertEquals('PLAIN', $login->getAuthKeyword());
+ }
+
+ public function testSuccessfulAuthentication()
+ {
+ /* -- RFC 4616, 2.
+ The client presents the authorization identity (identity to act as),
+ followed by a NUL (U+0000) character, followed by the authentication
+ identity (identity whose password will be used), followed by a NUL
+ (U+0000) character, followed by the clear-text password.
+ */
+
+ $plain = $this->_getAuthenticator();
+
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with('AUTH PLAIN '.base64_encode(
+ 'jack'.chr(0).'jack'.chr(0).'pass'
+ )."\r\n", array(235));
+
+ $this->assertTrue($plain->authenticate($this->_agent, 'jack', 'pass'),
+ '%s: The buffer accepted all commands authentication should succeed'
+ );
+ }
+
+ public function testAuthenticationFailureSendRsetAndReturnFalse()
+ {
+ $plain = $this->_getAuthenticator();
+
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with('AUTH PLAIN '.base64_encode(
+ 'jack'.chr(0).'jack'.chr(0).'pass'
+ )."\r\n", array(235))
+ ->andThrow(new Swift_TransportException(''));
+ $this->_agent->shouldReceive('executeCommand')
+ ->once()
+ ->with("RSET\r\n", array(250));
+
+ $this->assertFalse($plain->authenticate($this->_agent, 'jack', 'pass'),
+ '%s: Authentication fails, so RSET should be sent'
+ );
+ }
+
+ private function _getAuthenticator()
+ {
+ return new Swift_Transport_Esmtp_Auth_PlainAuthenticator();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php
new file mode 100644
index 0000000..d52328a
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/Esmtp/AuthHandlerTest.php
@@ -0,0 +1,165 @@
+<?php
+
+class Swift_Transport_Esmtp_AuthHandlerTest extends \SwiftMailerTestCase
+{
+ private $_agent;
+
+ protected function setUp()
+ {
+ $this->_agent = $this->getMockery('Swift_Transport_SmtpAgent')->shouldIgnoreMissing();
+ }
+
+ public function testKeywordIsAuth()
+ {
+ $auth = $this->_createHandler(array());
+ $this->assertEquals('AUTH', $auth->getHandledKeyword());
+ }
+
+ public function testUsernameCanBeSetAndFetched()
+ {
+ $auth = $this->_createHandler(array());
+ $auth->setUsername('jack');
+ $this->assertEquals('jack', $auth->getUsername());
+ }
+
+ public function testPasswordCanBeSetAndFetched()
+ {
+ $auth = $this->_createHandler(array());
+ $auth->setPassword('pass');
+ $this->assertEquals('pass', $auth->getPassword());
+ }
+
+ public function testAuthModeCanBeSetAndFetched()
+ {
+ $auth = $this->_createHandler(array());
+ $auth->setAuthMode('PLAIN');
+ $this->assertEquals('PLAIN', $auth->getAuthMode());
+ }
+
+ public function testMixinMethods()
+ {
+ $auth = $this->_createHandler(array());
+ $mixins = $auth->exposeMixinMethods();
+ $this->assertTrue(in_array('getUsername', $mixins),
+ '%s: getUsername() should be accessible via mixin'
+ );
+ $this->assertTrue(in_array('setUsername', $mixins),
+ '%s: setUsername() should be accessible via mixin'
+ );
+ $this->assertTrue(in_array('getPassword', $mixins),
+ '%s: getPassword() should be accessible via mixin'
+ );
+ $this->assertTrue(in_array('setPassword', $mixins),
+ '%s: setPassword() should be accessible via mixin'
+ );
+ $this->assertTrue(in_array('setAuthMode', $mixins),
+ '%s: setAuthMode() should be accessible via mixin'
+ );
+ $this->assertTrue(in_array('getAuthMode', $mixins),
+ '%s: getAuthMode() should be accessible via mixin'
+ );
+ }
+
+ public function testAuthenticatorsAreCalledAccordingToParamsAfterEhlo()
+ {
+ $a1 = $this->_createMockAuthenticator('PLAIN');
+ $a2 = $this->_createMockAuthenticator('LOGIN');
+
+ $a1->shouldReceive('authenticate')
+ ->never()
+ ->with($this->_agent, 'jack', 'pass');
+ $a2->shouldReceive('authenticate')
+ ->once()
+ ->with($this->_agent, 'jack', 'pass')
+ ->andReturn(true);
+
+ $auth = $this->_createHandler(array($a1, $a2));
+ $auth->setUsername('jack');
+ $auth->setPassword('pass');
+
+ $auth->setKeywordParams(array('CRAM-MD5', 'LOGIN'));
+ $auth->afterEhlo($this->_agent);
+ }
+
+ public function testAuthenticatorsAreNotUsedIfNoUsernameSet()
+ {
+ $a1 = $this->_createMockAuthenticator('PLAIN');
+ $a2 = $this->_createMockAuthenticator('LOGIN');
+
+ $a1->shouldReceive('authenticate')
+ ->never()
+ ->with($this->_agent, 'jack', 'pass');
+ $a2->shouldReceive('authenticate')
+ ->never()
+ ->with($this->_agent, 'jack', 'pass')
+ ->andReturn(true);
+
+ $auth = $this->_createHandler(array($a1, $a2));
+
+ $auth->setKeywordParams(array('CRAM-MD5', 'LOGIN'));
+ $auth->afterEhlo($this->_agent);
+ }
+
+ public function testSeveralAuthenticatorsAreTriedIfNeeded()
+ {
+ $a1 = $this->_createMockAuthenticator('PLAIN');
+ $a2 = $this->_createMockAuthenticator('LOGIN');
+
+ $a1->shouldReceive('authenticate')
+ ->once()
+ ->with($this->_agent, 'jack', 'pass')
+ ->andReturn(false);
+ $a2->shouldReceive('authenticate')
+ ->once()
+ ->with($this->_agent, 'jack', 'pass')
+ ->andReturn(true);
+
+ $auth = $this->_createHandler(array($a1, $a2));
+ $auth->setUsername('jack');
+ $auth->setPassword('pass');
+
+ $auth->setKeywordParams(array('PLAIN', 'LOGIN'));
+ $auth->afterEhlo($this->_agent);
+ }
+
+ public function testFirstAuthenticatorToPassBreaksChain()
+ {
+ $a1 = $this->_createMockAuthenticator('PLAIN');
+ $a2 = $this->_createMockAuthenticator('LOGIN');
+ $a3 = $this->_createMockAuthenticator('CRAM-MD5');
+
+ $a1->shouldReceive('authenticate')
+ ->once()
+ ->with($this->_agent, 'jack', 'pass')
+ ->andReturn(false);
+ $a2->shouldReceive('authenticate')
+ ->once()
+ ->with($this->_agent, 'jack', 'pass')
+ ->andReturn(true);
+ $a3->shouldReceive('authenticate')
+ ->never()
+ ->with($this->_agent, 'jack', 'pass');
+
+ $auth = $this->_createHandler(array($a1, $a2));
+ $auth->setUsername('jack');
+ $auth->setPassword('pass');
+
+ $auth->setKeywordParams(array('PLAIN', 'LOGIN', 'CRAM-MD5'));
+ $auth->afterEhlo($this->_agent);
+ }
+
+ private function _createHandler($authenticators)
+ {
+ return new Swift_Transport_Esmtp_AuthHandler($authenticators);
+ }
+
+ private function _createMockAuthenticator($type)
+ {
+ $authenticator = $this->getMockery('Swift_Transport_Esmtp_Authenticator')->shouldIgnoreMissing();
+ $authenticator->shouldReceive('getAuthKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn($type);
+
+ return $authenticator;
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php
new file mode 100644
index 0000000..166e160
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransport/ExtensionSupportTest.php
@@ -0,0 +1,529 @@
+<?php
+
+require_once dirname(__DIR__).'/EsmtpTransportTest.php';
+
+interface Swift_Transport_EsmtpHandlerMixin extends Swift_Transport_EsmtpHandler
+{
+ public function setUsername($user);
+
+ public function setPassword($pass);
+}
+
+class Swift_Transport_EsmtpTransport_ExtensionSupportTest extends Swift_Transport_EsmtpTransportTest
+{
+ public function testExtensionHandlersAreSortedAsNeeded()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('getPriorityOver')
+ ->zeroOrMoreTimes()
+ ->with('STARTTLS')
+ ->andReturn(1);
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $ext2->shouldReceive('getPriorityOver')
+ ->zeroOrMoreTimes()
+ ->with('AUTH')
+ ->andReturn(-1);
+ $this->_finishBuffer($buf);
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2));
+ $this->assertEquals(array($ext2, $ext1), $smtp->getExtensionHandlers());
+ }
+
+ public function testHandlersAreNotifiedOfParams()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 server.com foo\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .*?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-ServerName.tld\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-AUTH PLAIN LOGIN\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 SIZE=123456\r\n");
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('setKeywordParams')
+ ->once()
+ ->with(array('PLAIN', 'LOGIN'));
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('SIZE');
+ $ext2->shouldReceive('setKeywordParams')
+ ->zeroOrMoreTimes()
+ ->with(array('123456'));
+ $this->_finishBuffer($buf);
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2));
+ $smtp->start();
+ }
+
+ public function testSupportedExtensionHandlersAreRunAfterEhlo()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 server.com foo\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .*?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-ServerName.tld\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-AUTH PLAIN LOGIN\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 SIZE=123456\r\n");
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('afterEhlo')
+ ->once()
+ ->with($smtp);
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('SIZE');
+ $ext2->shouldReceive('afterEhlo')
+ ->zeroOrMoreTimes()
+ ->with($smtp);
+ $ext3->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $ext3->shouldReceive('afterEhlo')
+ ->never()
+ ->with($smtp);
+ $this->_finishBuffer($buf);
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2, $ext3));
+ $smtp->start();
+ }
+
+ public function testExtensionsCanModifyMailFromParams()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher();
+ $smtp = new Swift_Transport_EsmtpTransport($buf, array(), $dispatcher);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 server.com foo\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .*?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-ServerName.tld\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-AUTH PLAIN LOGIN\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 SIZE=123456\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain> FOO ZIP\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar>\r\n")
+ ->andReturn(3);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(3)
+ ->andReturn("250 OK\r\n");
+ $this->_finishBuffer($buf);
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('getMailParams')
+ ->once()
+ ->andReturn('FOO');
+ $ext1->shouldReceive('getPriorityOver')
+ ->zeroOrMoreTimes()
+ ->with('AUTH')
+ ->andReturn(-1);
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('SIZE');
+ $ext2->shouldReceive('getMailParams')
+ ->once()
+ ->andReturn('ZIP');
+ $ext2->shouldReceive('getPriorityOver')
+ ->zeroOrMoreTimes()
+ ->with('AUTH')
+ ->andReturn(1);
+ $ext3->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $ext3->shouldReceive('getMailParams')
+ ->never();
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2, $ext3));
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testExtensionsCanModifyRcptParams()
+ {
+ $buf = $this->_getBuffer();
+ $dispatcher = $this->_createEventDispatcher();
+ $smtp = new Swift_Transport_EsmtpTransport($buf, array(), $dispatcher);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('me@domain' => 'Me'));
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null));
+
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 server.com foo\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-ServerName.tld\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-AUTH PLAIN LOGIN\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 SIZE=123456\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("MAIL FROM:<me@domain>\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("250 OK\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("RCPT TO:<foo@bar> FOO ZIP\r\n")
+ ->andReturn(3);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(3)
+ ->andReturn("250 OK\r\n");
+ $this->_finishBuffer($buf);
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('getRcptParams')
+ ->once()
+ ->andReturn('FOO');
+ $ext1->shouldReceive('getPriorityOver')
+ ->zeroOrMoreTimes()
+ ->with('AUTH')
+ ->andReturn(-1);
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('SIZE');
+ $ext2->shouldReceive('getRcptParams')
+ ->once()
+ ->andReturn('ZIP');
+ $ext2->shouldReceive('getPriorityOver')
+ ->zeroOrMoreTimes()
+ ->with('AUTH')
+ ->andReturn(1);
+ $ext3->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $ext3->shouldReceive('getRcptParams')
+ ->never();
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2, $ext3));
+ $smtp->start();
+ $smtp->send($message);
+ }
+
+ public function testExtensionsAreNotifiedOnCommand()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 server.com foo\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-ServerName.tld\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-AUTH PLAIN LOGIN\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 SIZE=123456\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("FOO\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn("250 Cool\r\n");
+ $this->_finishBuffer($buf);
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('onCommand')
+ ->once()
+ ->with($smtp, "FOO\r\n", array(250, 251), \Mockery::any(), \Mockery::any());
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('SIZE');
+ $ext2->shouldReceive('onCommand')
+ ->once()
+ ->with($smtp, "FOO\r\n", array(250, 251), \Mockery::any(), \Mockery::any());
+ $ext3->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $ext3->shouldReceive('onCommand')
+ ->never()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2, $ext3));
+ $smtp->start();
+ $smtp->executeCommand("FOO\r\n", array(250, 251));
+ }
+
+ public function testChainOfCommandAlgorithmWhenNotifyingExtensions()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+ $ext3 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 server.com foo\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-ServerName.tld\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250-AUTH PLAIN LOGIN\r\n");
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn("250 SIZE=123456\r\n");
+ $buf->shouldReceive('write')
+ ->never()
+ ->with("FOO\r\n");
+ $this->_finishBuffer($buf);
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('onCommand')
+ ->once()
+ ->with($smtp, "FOO\r\n", array(250, 251), \Mockery::any(), \Mockery::any())
+ ->andReturnUsing(function ($a, $b, $c, $d, &$e) {
+ $e = true;
+
+ return '250 ok';
+ });
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('SIZE');
+ $ext2->shouldReceive('onCommand')
+ ->never()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $ext3->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $ext3->shouldReceive('onCommand')
+ ->never()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2, $ext3));
+ $smtp->start();
+ $smtp->executeCommand("FOO\r\n", array(250, 251));
+ }
+
+ public function testExtensionsCanExposeMixinMethods()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandlerMixin')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('exposeMixinMethods')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('setUsername', 'setPassword'));
+ $ext1->shouldReceive('setUsername')
+ ->once()
+ ->with('mick');
+ $ext1->shouldReceive('setPassword')
+ ->once()
+ ->with('pass');
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $this->_finishBuffer($buf);
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2));
+ $smtp->setUsername('mick');
+ $smtp->setPassword('pass');
+ }
+
+ public function testMixinMethodsBeginningWithSetAndNullReturnAreFluid()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandlerMixin')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('exposeMixinMethods')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('setUsername', 'setPassword'));
+ $ext1->shouldReceive('setUsername')
+ ->once()
+ ->with('mick')
+ ->andReturn(null);
+ $ext1->shouldReceive('setPassword')
+ ->once()
+ ->with('pass')
+ ->andReturn(null);
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $this->_finishBuffer($buf);
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2));
+ $ret = $smtp->setUsername('mick');
+ $this->assertEquals($smtp, $ret);
+ $ret = $smtp->setPassword('pass');
+ $this->assertEquals($smtp, $ret);
+ }
+
+ public function testMixinSetterWhichReturnValuesAreNotFluid()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $ext1 = $this->getMockery('Swift_Transport_EsmtpHandlerMixin')->shouldIgnoreMissing();
+ $ext2 = $this->getMockery('Swift_Transport_EsmtpHandler')->shouldIgnoreMissing();
+
+ $ext1->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('AUTH');
+ $ext1->shouldReceive('exposeMixinMethods')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('setUsername', 'setPassword'));
+ $ext1->shouldReceive('setUsername')
+ ->once()
+ ->with('mick')
+ ->andReturn('x');
+ $ext1->shouldReceive('setPassword')
+ ->once()
+ ->with('pass')
+ ->andReturn('x');
+ $ext2->shouldReceive('getHandledKeyword')
+ ->zeroOrMoreTimes()
+ ->andReturn('STARTTLS');
+ $this->_finishBuffer($buf);
+
+ $smtp->setExtensionHandlers(array($ext1, $ext2));
+ $this->assertEquals('x', $smtp->setUsername('mick'));
+ $this->assertEquals('x', $smtp->setPassword('pass'));
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php
new file mode 100644
index 0000000..e6cca15
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/EsmtpTransportTest.php
@@ -0,0 +1,297 @@
+<?php
+
+class Swift_Transport_EsmtpTransportTest extends Swift_Transport_AbstractSmtpEventSupportTest
+{
+ protected function _getTransport($buf, $dispatcher = null)
+ {
+ if (!$dispatcher) {
+ $dispatcher = $this->_createEventDispatcher();
+ }
+
+ return new Swift_Transport_EsmtpTransport($buf, array(), $dispatcher);
+ }
+
+ public function testHostCanBeSetAndFetched()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $smtp->setHost('foo');
+ $this->assertEquals('foo', $smtp->getHost(), '%s: Host should be returned');
+ }
+
+ public function testPortCanBeSetAndFetched()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $smtp->setPort(25);
+ $this->assertEquals(25, $smtp->getPort(), '%s: Port should be returned');
+ }
+
+ public function testTimeoutCanBeSetAndFetched()
+ {
+ $buf = $this->_getBuffer();
+ $buf->shouldReceive('setParam')
+ ->once()
+ ->with('timeout', 10);
+
+ $smtp = $this->_getTransport($buf);
+ $smtp->setTimeout(10);
+ $this->assertEquals(10, $smtp->getTimeout(), '%s: Timeout should be returned');
+ }
+
+ public function testEncryptionCanBeSetAndFetched()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $smtp->setEncryption('tls');
+ $this->assertEquals('tls', $smtp->getEncryption(), '%s: Crypto should be returned');
+ }
+
+ public function testStartSendsHeloToInitiate()
+ {
+ //Overridden for EHLO instead
+ }
+
+ public function testStartSendsEhloToInitiate()
+ {
+ /* -- RFC 2821, 3.2.
+
+ 3.2 Client Initiation
+
+ Once the server has sent the welcoming message and the client has
+ received it, the client normally sends the EHLO command to the
+ server, indicating the client's identity. In addition to opening the
+ session, use of EHLO indicates that the client is able to process
+ service extensions and requests that the server provide a list of the
+ extensions it supports. Older SMTP systems which are unable to
+ support service extensions and contemporary clients which do not
+ require service extensions in the mail session being initiated, MAY
+ use HELO instead of EHLO. Servers MUST NOT return the extended
+ EHLO-style response to a HELO command. For a particular connection
+ attempt, if the server returns a "command not recognized" response to
+ EHLO, the client SHOULD be able to fall back and send HELO.
+
+ In the EHLO command the host sending the command identifies itself;
+ the command may be interpreted as saying "Hello, I am <domain>" (and,
+ in the case of EHLO, "and I support service extension requests").
+
+ -- RFC 2281, 4.1.1.1.
+
+ ehlo = "EHLO" SP Domain CRLF
+ helo = "HELO" SP Domain CRLF
+
+ -- RFC 2821, 4.3.2.
+
+ EHLO or HELO
+ S: 250
+ E: 504, 550
+
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 ServerName'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ } catch (Exception $e) {
+ $this->fail('Starting Esmtp should send EHLO and accept 250 response');
+ }
+ }
+
+ public function testHeloIsUsedAsFallback()
+ {
+ /* -- RFC 2821, 4.1.4.
+
+ If the EHLO command is not acceptable to the SMTP server, 501, 500,
+ or 502 failure replies MUST be returned as appropriate. The SMTP
+ server MUST stay in the same state after transmitting these replies
+ that it was in before the EHLO was received.
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('501 WTF'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^HELO .+?\r\n$~D')
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 HELO'."\r\n");
+
+ $this->_finishBuffer($buf);
+ try {
+ $smtp->start();
+ } catch (Exception $e) {
+ $this->fail(
+ 'Starting Esmtp should fallback to HELO if needed and accept 250 response'
+ );
+ }
+ }
+
+ public function testInvalidHeloResponseCausesException()
+ {
+ //Overridden to first try EHLO
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('501 WTF'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^HELO .+?\r\n$~D')
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('504 WTF'."\r\n");
+ $this->_finishBuffer($buf);
+
+ try {
+ $this->assertFalse($smtp->isStarted(), '%s: SMTP should begin non-started');
+ $smtp->start();
+ $this->fail('Non 250 HELO response should raise Exception');
+ } catch (Exception $e) {
+ $this->assertFalse($smtp->isStarted(), '%s: SMTP start() should have failed');
+ }
+ }
+
+ public function testDomainNameIsPlacedInEhlo()
+ {
+ /* -- RFC 2821, 4.1.4.
+
+ The SMTP client MUST, if possible, ensure that the domain parameter
+ to the EHLO command is a valid principal host name (not a CNAME or MX
+ name) for its host. If this is not possible (e.g., when the client's
+ address is dynamically assigned and the client does not have an
+ obvious name), an address literal SHOULD be substituted for the
+ domain name and supplemental information provided that will assist in
+ identifying the client.
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("EHLO mydomain.com\r\n")
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('250 ServerName'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->setLocalDomain('mydomain.com');
+ $smtp->start();
+ }
+
+ public function testDomainNameIsPlacedInHelo()
+ {
+ //Overridden to include ESMTP
+ /* -- RFC 2821, 4.1.4.
+
+ The SMTP client MUST, if possible, ensure that the domain parameter
+ to the EHLO command is a valid principal host name (not a CNAME or MX
+ name) for its host. If this is not possible (e.g., when the client's
+ address is dynamically assigned and the client does not have an
+ obvious name), an address literal SHOULD be substituted for the
+ domain name and supplemental information provided that will assist in
+ identifying the client.
+ */
+
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(0)
+ ->andReturn("220 some.server.tld bleh\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with('~^EHLO .+?\r\n$~D')
+ ->andReturn(1);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(1)
+ ->andReturn('501 WTF'."\r\n");
+ $buf->shouldReceive('write')
+ ->once()
+ ->with("HELO mydomain.com\r\n")
+ ->andReturn(2);
+ $buf->shouldReceive('readLine')
+ ->once()
+ ->with(2)
+ ->andReturn('250 ServerName'."\r\n");
+
+ $this->_finishBuffer($buf);
+ $smtp->setLocalDomain('mydomain.com');
+ $smtp->start();
+ }
+
+ public function testFluidInterface()
+ {
+ $buf = $this->_getBuffer();
+ $smtp = $this->_getTransport($buf);
+ $buf->shouldReceive('setParam')
+ ->once()
+ ->with('timeout', 30);
+
+ $ref = $smtp
+ ->setHost('foo')
+ ->setPort(25)
+ ->setEncryption('tls')
+ ->setTimeout(30)
+ ;
+ $this->assertEquals($ref, $smtp);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php
new file mode 100644
index 0000000..e56e37f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/FailoverTransportTest.php
@@ -0,0 +1,518 @@
+<?php
+
+class Swift_Transport_FailoverTransportTest extends \SwiftMailerTestCase
+{
+ public function testFirstTransportIsUsed()
+ {
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState) {
+ return $connectionState;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState) {
+ if (!$connectionState) {
+ $connectionState = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->twice()
+ ->with(\Mockery::anyOf($message1, $message2), \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState) {
+ if ($connectionState) {
+ return 1;
+ }
+ });
+ $t2->shouldReceive('start')->never();
+ $t2->shouldReceive('send')->never();
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message1));
+ $this->assertEquals(1, $transport->send($message2));
+ }
+
+ public function testMessageCanBeTriedOnNextTransportIfExceptionThrown()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ return 1;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message));
+ }
+
+ public function testZeroIsReturnedIfTransportReturnsZero()
+ {
+ $message = $this->getMockery('Swift_Mime_Message')->shouldIgnoreMissing();
+ $t1 = $this->getMockery('Swift_Transport')->shouldIgnoreMissing();
+
+ $connectionState = false;
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState) {
+ return $connectionState;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState) {
+ if (!$connectionState) {
+ $connectionState = true;
+ }
+ });
+ $testCase = $this;
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState, $testCase) {
+ if (!$connectionState) {
+ $testCase->fail();
+ }
+
+ return 0;
+ });
+
+ $transport = $this->_getTransport(array($t1));
+ $transport->start();
+ $this->assertEquals(0, $transport->send($message));
+ }
+
+ public function testTransportsWhichThrowExceptionsAreNotRetried()
+ {
+ $e = new Swift_TransportException('maur b0rken');
+
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $message3 = $this->getMockery('Swift_Mime_Message');
+ $message4 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message2, \Mockery::any());
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message3, \Mockery::any());
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message4, \Mockery::any());
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->times(4)
+ ->with(\Mockery::anyOf($message1, $message2, $message3, $message4), \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ return 1;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message1));
+ $this->assertEquals(1, $transport->send($message2));
+ $this->assertEquals(1, $transport->send($message3));
+ $this->assertEquals(1, $transport->send($message4));
+ }
+
+ public function testExceptionIsThrownIfAllTransportsDie()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ throw $e;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ try {
+ $transport->send($message);
+ $this->fail('All transports failed so Exception should be thrown');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testStoppingTransportStopsAllDelegates()
+ {
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+
+ $connectionState1 = true;
+ $connectionState2 = true;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('stop')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if ($connectionState1) {
+ $connectionState1 = false;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('stop')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if ($connectionState2) {
+ $connectionState2 = false;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $transport->stop();
+ }
+
+ public function testTransportShowsAsNotStartedIfAllDelegatesDead()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ $connectionState1 = false;
+ throw $e;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ $connectionState2 = false;
+ throw $e;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertTrue($transport->isStarted());
+ try {
+ $transport->send($message);
+ $this->fail('All transports failed so Exception should be thrown');
+ } catch (Exception $e) {
+ $this->assertFalse($transport->isStarted());
+ }
+ }
+
+ public function testRestartingTransportRestartsDeadDelegates()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->twice()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ $connectionState1 = false;
+ throw $e;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message2, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if ($connectionState1) {
+ return 10;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ $connectionState2 = false;
+ throw $e;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->never()
+ ->with($message2, \Mockery::any());
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertTrue($transport->isStarted());
+ try {
+ $transport->send($message1);
+ $this->fail('All transports failed so Exception should be thrown');
+ } catch (Exception $e) {
+ $this->assertFalse($transport->isStarted());
+ }
+ //Restart and re-try
+ $transport->start();
+ $this->assertTrue($transport->isStarted());
+ $this->assertEquals(10, $transport->send($message2));
+ }
+
+ public function testFailureReferenceIsPassedToDelegates()
+ {
+ $failures = array();
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+
+ $connectionState = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use ($connectionState) {
+ return $connectionState;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use ($connectionState) {
+ if (!$connectionState) {
+ $connectionState = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, $failures)
+ ->andReturnUsing(function () use ($connectionState) {
+ if ($connectionState) {
+ return 1;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1));
+ $transport->start();
+ $transport->send($message, $failures);
+ }
+
+ public function testRegisterPluginDelegatesToLoadedTransports()
+ {
+ $plugin = $this->_createPlugin();
+
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $t1->shouldReceive('registerPlugin')
+ ->once()
+ ->with($plugin);
+ $t2->shouldReceive('registerPlugin')
+ ->once()
+ ->with($plugin);
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->registerPlugin($plugin);
+ }
+
+ private function _getTransport(array $transports)
+ {
+ $transport = new Swift_Transport_FailoverTransport();
+ $transport->setTransports($transports);
+
+ return $transport;
+ }
+
+ private function _createPlugin()
+ {
+ return $this->getMockery('Swift_Events_EventListener');
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php
new file mode 100644
index 0000000..f6bb819
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/LoadBalancedTransportTest.php
@@ -0,0 +1,749 @@
+<?php
+
+class Swift_Transport_LoadBalancedTransportTest extends \SwiftMailerTestCase
+{
+ public function testEachTransportIsUsedInTurn()
+ {
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $testCase = $this;
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $testCase) {
+ if ($connectionState1) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message2, \Mockery::any());
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message2, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $testCase) {
+ if ($connectionState2) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+ $t2->shouldReceive('send')
+ ->never()
+ ->with($message1, \Mockery::any());
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message1));
+ $this->assertEquals(1, $transport->send($message2));
+ }
+
+ public function testTransportsAreReusedInRotatingFashion()
+ {
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $message3 = $this->getMockery('Swift_Mime_Message');
+ $message4 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $testCase = $this;
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $testCase) {
+ if ($connectionState1) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message2, \Mockery::any());
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message3, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $testCase) {
+ if ($connectionState1) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message4, \Mockery::any());
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message2, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $testCase) {
+ if ($connectionState2) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+ $t2->shouldReceive('send')
+ ->never()
+ ->with($message1, \Mockery::any());
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message4, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $testCase) {
+ if ($connectionState2) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+ $t2->shouldReceive('send')
+ ->never()
+ ->with($message3, \Mockery::any());
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+
+ $this->assertEquals(1, $transport->send($message1));
+ $this->assertEquals(1, $transport->send($message2));
+ $this->assertEquals(1, $transport->send($message3));
+ $this->assertEquals(1, $transport->send($message4));
+ }
+
+ public function testMessageCanBeTriedOnNextTransportIfExceptionThrown()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $testCase = $this;
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e, $testCase) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ $testCase->fail();
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $testCase) {
+ if ($connectionState2) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message));
+ }
+
+ public function testMessageIsTriedOnNextTransportIfZeroReturned()
+ {
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if ($connectionState1) {
+ return 0;
+ }
+
+ return 1;
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if ($connectionState2) {
+ return 1;
+ }
+
+ return 0;
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message));
+ }
+
+ public function testZeroIsReturnedIfAllTransportsReturnZero()
+ {
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if ($connectionState1) {
+ return 0;
+ }
+
+ return 1;
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if ($connectionState2) {
+ return 0;
+ }
+
+ return 1;
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(0, $transport->send($message));
+ }
+
+ public function testTransportsWhichThrowExceptionsAreNotRetried()
+ {
+ $e = new Swift_TransportException('maur b0rken');
+
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $message3 = $this->getMockery('Swift_Mime_Message');
+ $message4 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $testCase = $this;
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e, $testCase) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ $testCase->fail();
+ });
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message2, \Mockery::any());
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message3, \Mockery::any());
+ $t1->shouldReceive('send')
+ ->never()
+ ->with($message4, \Mockery::any());
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->times(4)
+ ->with(\Mockery::anyOf($message1, $message3, $message3, $message4), \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $testCase) {
+ if ($connectionState2) {
+ return 1;
+ }
+ $testCase->fail();
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertEquals(1, $transport->send($message1));
+ $this->assertEquals(1, $transport->send($message2));
+ $this->assertEquals(1, $transport->send($message3));
+ $this->assertEquals(1, $transport->send($message4));
+ }
+
+ public function testExceptionIsThrownIfAllTransportsDie()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ throw $e;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ try {
+ $transport->send($message);
+ $this->fail('All transports failed so Exception should be thrown');
+ } catch (Exception $e) {
+ }
+ }
+
+ public function testStoppingTransportStopsAllDelegates()
+ {
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = true;
+ $connectionState2 = true;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('stop')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if ($connectionState1) {
+ $connectionState1 = false;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('stop')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if ($connectionState2) {
+ $connectionState2 = false;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $transport->stop();
+ }
+
+ public function testTransportShowsAsNotStartedIfAllDelegatesDead()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ throw $e;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ throw $e;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertTrue($transport->isStarted());
+ try {
+ $transport->send($message);
+ $this->fail('All transports failed so Exception should be thrown');
+ } catch (Exception $e) {
+ $this->assertFalse($transport->isStarted());
+ }
+ }
+
+ public function testRestartingTransportRestartsDeadDelegates()
+ {
+ $e = new Swift_TransportException('b0rken');
+
+ $message1 = $this->getMockery('Swift_Mime_Message');
+ $message2 = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+ $connectionState1 = false;
+ $connectionState2 = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ return $connectionState1;
+ });
+ $t1->shouldReceive('start')
+ ->twice()
+ ->andReturnUsing(function () use (&$connectionState1) {
+ if (!$connectionState1) {
+ $connectionState1 = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ $connectionState1 = false;
+ throw $e;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message2, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState1, $e) {
+ if ($connectionState1) {
+ return 10;
+ }
+ });
+
+ $t2->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ return $connectionState2;
+ });
+ $t2->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState2) {
+ if (!$connectionState2) {
+ $connectionState2 = true;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->once()
+ ->with($message1, \Mockery::any())
+ ->andReturnUsing(function () use (&$connectionState2, $e) {
+ if ($connectionState2) {
+ throw $e;
+ }
+ });
+ $t2->shouldReceive('send')
+ ->never()
+ ->with($message2, \Mockery::any());
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->start();
+ $this->assertTrue($transport->isStarted());
+ try {
+ $transport->send($message1);
+ $this->fail('All transports failed so Exception should be thrown');
+ } catch (Exception $e) {
+ $this->assertFalse($transport->isStarted());
+ }
+ //Restart and re-try
+ $transport->start();
+ $this->assertTrue($transport->isStarted());
+ $this->assertEquals(10, $transport->send($message2));
+ }
+
+ public function testFailureReferenceIsPassedToDelegates()
+ {
+ $failures = array();
+ $testCase = $this;
+
+ $message = $this->getMockery('Swift_Mime_Message');
+ $t1 = $this->getMockery('Swift_Transport');
+ $connectionState = false;
+
+ $t1->shouldReceive('isStarted')
+ ->zeroOrMoreTimes()
+ ->andReturnUsing(function () use (&$connectionState) {
+ return $connectionState;
+ });
+ $t1->shouldReceive('start')
+ ->once()
+ ->andReturnUsing(function () use (&$connectionState) {
+ if (!$connectionState) {
+ $connectionState = true;
+ }
+ });
+ $t1->shouldReceive('send')
+ ->once()
+ ->with($message, \Mockery::on(function (&$var) use (&$failures, $testCase) {
+ return $testCase->varsAreReferences($var, $failures);
+ }))
+ ->andReturnUsing(function () use (&$connectionState) {
+ if ($connectionState) {
+ return 1;
+ }
+ });
+
+ $transport = $this->_getTransport(array($t1));
+ $transport->start();
+ $transport->send($message, $failures);
+ }
+
+ public function testRegisterPluginDelegatesToLoadedTransports()
+ {
+ $plugin = $this->_createPlugin();
+
+ $t1 = $this->getMockery('Swift_Transport');
+ $t2 = $this->getMockery('Swift_Transport');
+
+ $t1->shouldReceive('registerPlugin')
+ ->once()
+ ->with($plugin);
+ $t2->shouldReceive('registerPlugin')
+ ->once()
+ ->with($plugin);
+
+ $transport = $this->_getTransport(array($t1, $t2));
+ $transport->registerPlugin($plugin);
+ }
+
+ /**
+ * Adapted from Yay_Matchers_ReferenceMatcher.
+ */
+ public function varsAreReferences(&$ref1, &$ref2)
+ {
+ if (is_object($ref2)) {
+ return $ref1 === $ref2;
+ }
+ if ($ref1 !== $ref2) {
+ return false;
+ }
+
+ $copy = $ref2;
+ $randomString = uniqid('yay');
+ $ref2 = $randomString;
+ $isRef = ($ref1 === $ref2);
+ $ref2 = $copy;
+
+ return $isRef;
+ }
+
+ private function _getTransport(array $transports)
+ {
+ $transport = new Swift_Transport_LoadBalancedTransport();
+ $transport->setTransports($transports);
+
+ return $transport;
+ }
+
+ private function _createPlugin()
+ {
+ return $this->getMockery('Swift_Events_EventListener');
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/MailTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/MailTransportTest.php
new file mode 100644
index 0000000..6672a3d
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/MailTransportTest.php
@@ -0,0 +1,533 @@
+<?php
+
+/**
+ * @group legacy
+ */
+class Swift_Transport_MailTransportTest extends \SwiftMailerTestCase
+{
+ public function testTransportInvokesMailOncePerMessage()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $invoker->shouldReceive('mail')
+ ->once();
+
+ $transport->send($message);
+ }
+
+ public function testTransportUsesToFieldBodyInSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $to = $this->_createHeader();
+ $headers = $this->_createHeaders(array(
+ 'To' => $to,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $to->shouldReceive('getFieldBody')
+ ->zeroOrMoreTimes()
+ ->andReturn('Foo <foo@bar>');
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with('Foo <foo@bar>', \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testTransportUsesSubjectFieldBodyInSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $subj = $this->_createHeader();
+ $headers = $this->_createHeaders(array(
+ 'Subject' => $subj,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $subj->shouldReceive('getFieldBody')
+ ->zeroOrMoreTimes()
+ ->andReturn('Thing');
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), 'Thing', \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testTransportUsesBodyOfMessage()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ "To: Foo <foo@bar>\r\n".
+ "\r\n".
+ 'This body'
+ );
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), 'This body', \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testTransportSettingUsingReturnPathForExtraParams()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('getReturnPath')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ 'foo@bar'
+ );
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-ffoo@bar');
+
+ $transport->send($message);
+ }
+
+ public function testTransportSettingEmptyExtraParams()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('getReturnPath')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $message->shouldReceive('getSender')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), null);
+
+ $transport->send($message);
+ }
+
+ public function testTransportSettingSettingExtraParamsWithF()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+ $transport->setExtraParams('-x\'foo\' -f%s');
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('getReturnPath')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ 'foo@bar'
+ );
+ $message->shouldReceive('getSender')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-x\'foo\' -ffoo@bar');
+
+ $transport->send($message);
+ }
+
+ public function testTransportSettingSettingExtraParamsWithoutF()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+ $transport->setExtraParams('-x\'foo\'');
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('getReturnPath')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ 'foo@bar'
+ );
+ $message->shouldReceive('getSender')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-x\'foo\'');
+
+ $transport->send($message);
+ }
+
+ public function testTransportSettingInvalidFromEmail()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('getReturnPath')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php "@email.com'
+ );
+ $message->shouldReceive('getSender')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $message->shouldReceive('getFrom')
+ ->zeroOrMoreTimes()
+ ->andReturn(null);
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), null);
+
+ $transport->send($message);
+ }
+
+ public function testTransportUsesHeadersFromMessage()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $message->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ "Subject: Stuff\r\n".
+ "\r\n".
+ 'This body'
+ );
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), 'Subject: Stuff'.PHP_EOL, \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testTransportReturnsCountOfAllRecipientsIfInvokerReturnsTrue()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessage($headers);
+
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null, 'zip@button' => null));
+ $message->shouldReceive('getCc')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('test@test' => null));
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn(true);
+
+ $this->assertEquals(3, $transport->send($message));
+ }
+
+ public function testTransportReturnsZeroIfInvokerReturnsFalse()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessage($headers);
+
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => null, 'zip@button' => null));
+ $message->shouldReceive('getCc')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('test@test' => null));
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any())
+ ->andReturn(false);
+
+ $this->assertEquals(0, $transport->send($message));
+ }
+
+ public function testToHeaderIsRemovedFromHeaderSetDuringSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $to = $this->_createHeader();
+ $headers = $this->_createHeaders(array(
+ 'To' => $to,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $headers->shouldReceive('remove')
+ ->once()
+ ->with('To');
+ $headers->shouldReceive('remove')
+ ->zeroOrMoreTimes();
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testSubjectHeaderIsRemovedFromHeaderSetDuringSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $subject = $this->_createHeader();
+ $headers = $this->_createHeaders(array(
+ 'Subject' => $subject,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $headers->shouldReceive('remove')
+ ->once()
+ ->with('Subject');
+ $headers->shouldReceive('remove')
+ ->zeroOrMoreTimes();
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testToHeaderIsPutBackAfterSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $to = $this->_createHeader();
+ $headers = $this->_createHeaders(array(
+ 'To' => $to,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $headers->shouldReceive('set')
+ ->once()
+ ->with($to);
+ $headers->shouldReceive('set')
+ ->zeroOrMoreTimes();
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testSubjectHeaderIsPutBackAfterSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $subject = $this->_createHeader();
+ $headers = $this->_createHeaders(array(
+ 'Subject' => $subject,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+
+ $headers->shouldReceive('set')
+ ->once()
+ ->with($subject);
+ $headers->shouldReceive('set')
+ ->zeroOrMoreTimes();
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ public function testMessageHeadersOnlyHavePHPEolsDuringSending()
+ {
+ $invoker = $this->_createInvoker();
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $subject = $this->_createHeader();
+ $subject->shouldReceive('getFieldBody')->andReturn("Foo\r\nBar");
+
+ $headers = $this->_createHeaders(array(
+ 'Subject' => $subject,
+ ));
+ $message = $this->_createMessageWithRecipient($headers);
+ $message->shouldReceive('toString')
+ ->zeroOrMoreTimes()
+ ->andReturn(
+ "From: Foo\r\n<foo@bar>\r\n".
+ "\r\n".
+ "This\r\n".
+ 'body'
+ );
+
+ if ("\r\n" != PHP_EOL) {
+ $expectedHeaders = "From: Foo\n<foo@bar>\n";
+ $expectedSubject = "Foo\nBar";
+ $expectedBody = "This\nbody";
+ } else {
+ $expectedHeaders = "From: Foo\r\n<foo@bar>\r\n";
+ $expectedSubject = "Foo\r\nBar";
+ $expectedBody = "This\r\nbody";
+ }
+
+ $invoker->shouldReceive('mail')
+ ->once()
+ ->with(\Mockery::any(), $expectedSubject, $expectedBody, $expectedHeaders, \Mockery::any());
+
+ $transport->send($message);
+ }
+
+ /**
+ * @expectedException \Swift_TransportException
+ * @expectedExceptionMessage Cannot send message without a recipient
+ */
+ public function testExceptionWhenNoRecipients()
+ {
+ $invoker = $this->_createInvoker();
+ $invoker->shouldReceive('mail');
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessage($headers);
+
+ $transport->send($message);
+ }
+
+ public function noExceptionWhenRecipientsExistProvider()
+ {
+ return array(
+ array('To'),
+ array('Cc'),
+ array('Bcc'),
+ );
+ }
+
+ /**
+ * @dataProvider noExceptionWhenRecipientsExistProvider
+ *
+ * @param string $header
+ */
+ public function testNoExceptionWhenRecipientsExist($header)
+ {
+ $invoker = $this->_createInvoker();
+ $invoker->shouldReceive('mail');
+ $dispatcher = $this->_createEventDispatcher();
+ $transport = $this->_createTransport($invoker, $dispatcher);
+
+ $headers = $this->_createHeaders();
+ $message = $this->_createMessage($headers);
+ $message->shouldReceive(sprintf('get%s', $header))->andReturn(array('foo@bar' => 'Foo'));
+
+ $transport->send($message);
+ }
+
+ private function _createTransport($invoker, $dispatcher)
+ {
+ return new Swift_Transport_MailTransport($invoker, $dispatcher);
+ }
+
+ private function _createEventDispatcher()
+ {
+ return $this->getMockery('Swift_Events_EventDispatcher')->shouldIgnoreMissing();
+ }
+
+ private function _createInvoker()
+ {
+ return $this->getMockery('Swift_Transport_MailInvoker');
+ }
+
+ private function _createMessage($headers)
+ {
+ $message = $this->getMockery('Swift_Mime_Message')->shouldIgnoreMissing();
+ $message->shouldReceive('getHeaders')
+ ->zeroOrMoreTimes()
+ ->andReturn($headers);
+
+ return $message;
+ }
+
+ private function _createMessageWithRecipient($headers, $recipient = array('foo@bar' => 'Foo'))
+ {
+ $message = $this->_createMessage($headers);
+ $message->shouldReceive('getTo')->andReturn($recipient);
+
+ return $message;
+ }
+
+ private function _createHeaders($headers = array())
+ {
+ $set = $this->getMockery('Swift_Mime_HeaderSet')->shouldIgnoreMissing();
+
+ if (count($headers) > 0) {
+ foreach ($headers as $name => $header) {
+ $set->shouldReceive('get')
+ ->zeroOrMoreTimes()
+ ->with($name)
+ ->andReturn($header);
+ $set->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->with($name)
+ ->andReturn(true);
+ }
+ }
+
+ $header = $this->_createHeader();
+ $set->shouldReceive('get')
+ ->zeroOrMoreTimes()
+ ->andReturn($header);
+ $set->shouldReceive('has')
+ ->zeroOrMoreTimes()
+ ->andReturn(true);
+
+ return $set;
+ }
+
+ private function _createHeader()
+ {
+ return $this->getMockery('Swift_Mime_Header')->shouldIgnoreMissing();
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php
new file mode 100644
index 0000000..9040f9e
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/SendmailTransportTest.php
@@ -0,0 +1,151 @@
+<?php
+
+class Swift_Transport_SendmailTransportTest extends Swift_Transport_AbstractSmtpEventSupportTest
+{
+ protected function _getTransport($buf, $dispatcher = null, $command = '/usr/sbin/sendmail -bs')
+ {
+ if (!$dispatcher) {
+ $dispatcher = $this->_createEventDispatcher();
+ }
+ $transport = new Swift_Transport_SendmailTransport($buf, $dispatcher);
+ $transport->setCommand($command);
+
+ return $transport;
+ }
+
+ protected function _getSendmail($buf, $dispatcher = null)
+ {
+ if (!$dispatcher) {
+ $dispatcher = $this->_createEventDispatcher();
+ }
+ $sendmail = new Swift_Transport_SendmailTransport($buf, $dispatcher);
+
+ return $sendmail;
+ }
+
+ public function testCommandCanBeSetAndFetched()
+ {
+ $buf = $this->_getBuffer();
+ $sendmail = $this->_getSendmail($buf);
+
+ $sendmail->setCommand('/usr/sbin/sendmail -bs');
+ $this->assertEquals('/usr/sbin/sendmail -bs', $sendmail->getCommand());
+ $sendmail->setCommand('/usr/sbin/sendmail -oi -t');
+ $this->assertEquals('/usr/sbin/sendmail -oi -t', $sendmail->getCommand());
+ }
+
+ public function testSendingMessageIn_t_ModeUsesSimplePipe()
+ {
+ $buf = $this->_getBuffer();
+ $sendmail = $this->_getSendmail($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => 'Foobar', 'zip@button' => 'Zippy'));
+ $message->shouldReceive('toByteStream')
+ ->once()
+ ->with($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('terminate')
+ ->once();
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array("\r\n" => "\n", "\n." => "\n.."));
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array());
+
+ $sendmail->setCommand('/usr/sbin/sendmail -t');
+ $this->assertEquals(2, $sendmail->send($message));
+ }
+
+ public function testSendingIn_t_ModeWith_i_FlagDoesntEscapeDot()
+ {
+ $buf = $this->_getBuffer();
+ $sendmail = $this->_getSendmail($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => 'Foobar', 'zip@button' => 'Zippy'));
+ $message->shouldReceive('toByteStream')
+ ->once()
+ ->with($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('terminate')
+ ->once();
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array("\r\n" => "\n"));
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array());
+
+ $sendmail->setCommand('/usr/sbin/sendmail -i -t');
+ $this->assertEquals(2, $sendmail->send($message));
+ }
+
+ public function testSendingInTModeWith_oi_FlagDoesntEscapeDot()
+ {
+ $buf = $this->_getBuffer();
+ $sendmail = $this->_getSendmail($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => 'Foobar', 'zip@button' => 'Zippy'));
+ $message->shouldReceive('toByteStream')
+ ->once()
+ ->with($buf);
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('terminate')
+ ->once();
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array("\r\n" => "\n"));
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array());
+
+ $sendmail->setCommand('/usr/sbin/sendmail -oi -t');
+ $this->assertEquals(2, $sendmail->send($message));
+ }
+
+ public function testSendingMessageRegeneratesId()
+ {
+ $buf = $this->_getBuffer();
+ $sendmail = $this->_getSendmail($buf);
+ $message = $this->_createMessage();
+
+ $message->shouldReceive('getTo')
+ ->zeroOrMoreTimes()
+ ->andReturn(array('foo@bar' => 'Foobar', 'zip@button' => 'Zippy'));
+ $message->shouldReceive('generateId');
+ $buf->shouldReceive('initialize')
+ ->once();
+ $buf->shouldReceive('terminate')
+ ->once();
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array("\r\n" => "\n", "\n." => "\n.."));
+ $buf->shouldReceive('setWriteTranslations')
+ ->once()
+ ->with(array());
+
+ $sendmail->setCommand('/usr/sbin/sendmail -t');
+ $this->assertEquals(2, $sendmail->send($message));
+ }
+
+ public function testFluidInterface()
+ {
+ $buf = $this->_getBuffer();
+ $sendmail = $this->_getTransport($buf);
+
+ $ref = $sendmail->setCommand('/foo');
+ $this->assertEquals($ref, $sendmail);
+ }
+}
diff --git a/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php
new file mode 100644
index 0000000..5109b56
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/tests/unit/Swift/Transport/StreamBufferTest.php
@@ -0,0 +1,43 @@
+<?php
+
+class Swift_Transport_StreamBufferTest extends \PHPUnit_Framework_TestCase
+{
+ public function testSettingWriteTranslationsCreatesFilters()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->once())
+ ->method('createFilter')
+ ->with('a', 'b')
+ ->will($this->returnCallback(array($this, '_createFilter')));
+
+ $buffer = $this->_createBuffer($factory);
+ $buffer->setWriteTranslations(array('a' => 'b'));
+ }
+
+ public function testOverridingTranslationsOnlyAddsNeededFilters()
+ {
+ $factory = $this->_createFactory();
+ $factory->expects($this->exactly(2))
+ ->method('createFilter')
+ ->will($this->returnCallback(array($this, '_createFilter')));
+
+ $buffer = $this->_createBuffer($factory);
+ $buffer->setWriteTranslations(array('a' => 'b'));
+ $buffer->setWriteTranslations(array('x' => 'y', 'a' => 'b'));
+ }
+
+ private function _createBuffer($replacementFactory)
+ {
+ return new Swift_Transport_StreamBuffer($replacementFactory);
+ }
+
+ private function _createFactory()
+ {
+ return $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock();
+ }
+
+ public function _createFilter()
+ {
+ return $this->getMockBuilder('Swift_StreamFilter')->getMock();
+ }
+}