Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Merge pull request zendframework/zendframework#5470 from stefanotorre…
Browse files Browse the repository at this point in the history
…si/add/mail-transport-factory

Add Zend\Mail\Transport\Factory
  • Loading branch information
weierophinney committed Nov 13, 2013
191 parents 54dd5a2 + 71fb94d + 57d925a + f581f22 + 10ab90e + 31569f7 + 9256cad + 155b787 + 6a14e0a + e84c12e + 94de9c5 + 4b83eb4 + 1483e66 + b428d8b + dc72787 + bca6f24 + 1cda83c + 835b631 + d3605c7 + 7a32de0 + 7a6cebf + 662a059 + 5e1c4bb + de6ba8b + 19c92ef + f5abdbd + a4b3fcc + e0d3e79 + eb7f4fc + f5f296f + c1bc89d + 2cfde08 + 5ed923d + 7bfa121 + 0b38f0b + 1914ec7 + 47650bd + b7f9c80 + d490dab + 0b235a6 + ea8420a + 806e429 + 14b8e16 + 2c9f881 + 1591173 + 3288109 + 6149722 + fb18be8 + 2f56d24 + 256686b + 3cc679d + da18011 + 93ac388 + 57ef4a3 + 2f2851a + 2ec1dbc + 9a48955 + b6b50b9 + a16c105 + a634561 + 779d017 + e998d74 + e0c0b66 + 677bd85 + bd0abb6 + 7e23a9b + 76e9a65 + 9666e65 + 0fb7a6e + b476244 + a566cb1 + 84a7972 + f6501d5 + 74b0454 + ea99bf1 + e2703e7 + 90db7ae + b2f5380 + d6ee2dd + 2dae9df + 15a2e1f + 00d7ef1 + 88e29ab + 04f5596 + d4b9187 + 83cb40e + e80536c + 8344c40 + 314ef07 + f8fe680 + 7d99158 + 5a453b7 + 16b512c + e13bb78 + f8c8e84 + 0e833f2 + 463bd0b + e23f919 + c0f3fe1 + 9af4d23 + fbdafd9 + 46c341e + 1fcdf03 + 9e5c38e + 41f8caa + f236745 + ab9047d + c7b4a3f + 5cbe79f + dc8268a + cbafbe9 + d2c6567 + 0cc6fdf + 09daef8 + df6fc46 + ba228cf + 67d18da + 48a0084 + c78da38 + 76f6205 + 02baf86 + 907dad9 + 56854a7 + 51b08b5 + 86f37cb + 5ecd1ed + a4cca36 + cfc46bf + a576736 + 0650b43 + 6fc76b3 + 2dcfeeb + 80461fa + db66f77 + 66790e4 + ceefa98 + fc0f947 + 6a060b9 + de10d09 + 9ac9f8e + dc02847 + ee05131 + fb9ea71 + cb2e3cf + 08f2b17 + efc498e + 71822ef + 818d7d9 + 5c72f46 + 2b5dcae + 32dbda5 + d550f51 + 3aa0ee9 + 4ea71ee + 730f592 + c6516da + 76770c7 + 167fdbf + 1510cfa + e52ef9a + c1754e3 + 30e7e8b + c208a5e + c258e8b + 95bc2ba + 62058ff + 5129baa + e212b9b + 760714d + 844e2ae + 69ad6c7 + d68e5a1 + 9fededc + 1fe76d7 + 9cfe1eb + de84a61 + ee1b45a + 8dd678f + fd733d8 + a0f84c8 + c1d4cb7 + eb5e6bf + d361dcc + 94d4789 + 722be83 + 7968947 + c71fe68 + dd11405 + 4256692 + 84144a9 + 24cc7ff commit bd9c008
Show file tree
Hide file tree
Showing 4 changed files with 271 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/Transport/Exception/DomainException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\Mail\Transport\Exception;

use Zend\Mail\Exception;

/**
* Exception for Zend\Mail\Transport component.
*/
class DomainException extends Exception\DomainException implements ExceptionInterface
{
}
83 changes: 83 additions & 0 deletions src/Transport/Factory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\Mail\Transport;

use Traversable;
use Zend\Stdlib\ArrayUtils;

abstract class Factory
{
/**
* @var array Known transport types
*/
protected static $classMap = array(
'file' => 'Zend\Mail\Transport\File',
'null' => 'Zend\Mail\Transport\Null',
'sendmail' => 'Zend\Mail\Transport\Sendmail',
'smtp' => 'Zend\Mail\Transport\Smtp',
);

/**
* @param array $spec
* @return TransportInterface
* @throws Exception\InvalidArgumentException
* @throws Exception\DomainException
*/
public static function create($spec = array())
{
if ($spec instanceof Traversable) {
$spec = ArrayUtils::iteratorToArray($spec);
}

if (! is_array($spec)) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects an array or Traversable argument; received "%s"',
__METHOD__,
(is_object($spec) ? get_class($spec) : gettype($spec))
));
}

$type = isset($spec['type']) ? $spec['type'] : 'sendmail';

$normalizedType = strtolower($type);

if (isset(static::$classMap[$normalizedType])) {
$type = static::$classMap[$normalizedType];
}

if (! class_exists($type)) {
throw new Exception\DomainException(sprintf(
'%s expects the "type" attribute to resolve to an existing class; received "%s"',
__METHOD__,
$type
));
}

$transport = new $type;

if (! $transport instanceof TransportInterface) {
throw new Exception\DomainException(sprintf(
'%s expects the "type" attribute to resolve to a valid Zend\Mail\Transport\TransportInterface instance; received "%s"',
__METHOD__,
$type
));
}

if ($transport instanceof Smtp && isset($spec['options'])) {
$transport->setOptions(new SmtpOptions($spec['options']));
}

if ($transport instanceof File && isset($spec['options'])) {
$transport->setOptions(new FileOptions($spec['options']));
}

return $transport;
}
}
8 changes: 8 additions & 0 deletions src/Transport/File.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ public function __construct(FileOptions $options = null)
$this->setOptions($options);
}

/**
* @return FileOptions
*/
public function getOptions()
{
return $this->options;
}

/**
* Sets options
*
Expand Down
161 changes: 161 additions & 0 deletions test/Transport/FactoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<?php
/**
* @author Stefano Torresi (http://stefanotorresi.it)
* @license See the file LICENSE.txt for copying permission.
* ************************************************
*/

namespace ZendTest\Mail\Transport;

use PHPUnit_Framework_TestCase;
use Zend\Mail\Transport\Factory;
use Zend\Stdlib\ArrayObject;

class FactoryTest extends PHPUnit_Framework_TestCase
{
/**
* @dataProvider invalidSpecTypeProvider
* @expectedException \Zend\Mail\Transport\Exception\InvalidArgumentException
* @param $spec
*/
public function testInvalidSpecThrowsInvalidArgumentException($spec)
{
Factory::create($spec);
}

public function invalidSpecTypeProvider()
{
return array(
array('spec'),
array(new \stdClass()),
);
}

/**
*
*/
public function testDefaultTypeIsSendmail()
{
$transport = Factory::create();

$this->assertInstanceOf('Zend\Mail\Transport\Sendmail', $transport);
}

/**
* @dataProvider typeProvider
* @param $type
*/
public function testCanCreateClassUsingTypeKey($type)
{
$transport = Factory::create(array(
'type' => $type,
));

$this->assertInstanceOf($type, $transport);
}

public function typeProvider()
{
return array(
array('Zend\Mail\Transport\File'),
array('Zend\Mail\Transport\Null'),
array('Zend\Mail\Transport\Sendmail'),
array('Zend\Mail\Transport\Smtp'),
);
}

/**
* @dataProvider typeAliasProvider
* @param $type
* @param $expectedClass
*/
public function testCanCreateClassFromTypeAlias($type, $expectedClass)
{
$transport = Factory::create(array(
'type' => $type,
));

$this->assertInstanceOf($expectedClass, $transport);
}

public function typeAliasProvider()
{
return array(
array('file', 'Zend\Mail\Transport\File'),
array('null', 'Zend\Mail\Transport\Null'),
array('sendmail', 'Zend\Mail\Transport\Sendmail'),
array('smtp', 'Zend\Mail\Transport\Smtp'),
array('File', 'Zend\Mail\Transport\File'),
array('Null', 'Zend\Mail\Transport\Null'),
array('NULL', 'Zend\Mail\Transport\Null'),
array('Sendmail', 'Zend\Mail\Transport\Sendmail'),
array('SendMail', 'Zend\Mail\Transport\Sendmail'),
array('Smtp', 'Zend\Mail\Transport\Smtp'),
array('SMTP', 'Zend\Mail\Transport\Smtp'),
);
}

/**
*
*/
public function testCanUseTraversableAsSpec()
{
$spec = new ArrayObject(array(
'type' => 'null'
));

$transport = Factory::create($spec);

$this->assertInstanceOf('Zend\Mail\Transport\Null', $transport);
}

/**
* @dataProvider invalidClassProvider
* @expectedException \Zend\Mail\Transport\Exception\DomainException
* @param $class
*/
public function testInvalidClassThrowsDomainException($class)
{
Factory::create(array(
'type' => $class
));
}

public function invalidClassProvider()
{
return array(
array('stdClass'),
array('non-existent-class'),
);
}

/**
*
*/
public function testCanCreateSmtpTransportWithOptions()
{
$transport = Factory::create(array(
'type' => 'smtp',
'options' => array(
'host' => 'somehost',
)
));

$this->assertEquals($transport->getOptions()->getHost(), 'somehost');
}

/**
*
*/
public function testCanCreateFileTransportWithOptions()
{
$transport = Factory::create(array(
'type' => 'file',
'options' => array(
'path' => __DIR__,
)
));

$this->assertEquals($transport->getOptions()->getPath(), __DIR__);
}
}

0 comments on commit bd9c008

Please sign in to comment.