summaryrefslogtreecommitdiff
path: root/vendor/swiftmailer/swiftmailer/tests/unit
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/swiftmailer/swiftmailer/tests/unit')
-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
72 files changed, 16349 insertions, 0 deletions
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();
+ }
+}