From e5fe6e9b2be8fb2197a34ebf4b94f97cdcf6238a Mon Sep 17 00:00:00 2001 From: Nicolas Le Goff Date: Thu, 10 Apr 2014 21:51:34 +0200 Subject: [PATCH] Fix strategy implementation --- .../FileStrategy/AbstractFileStrategy.php | 49 +++++++++++ .../Zippy/FileStrategy/TB2FileStrategy.php | 17 +--- .../Zippy/FileStrategy/TBz2FileStrategy.php | 17 +--- .../Zippy/FileStrategy/TGzFileStrategy.php | 17 +--- .../Zippy/FileStrategy/TarBz2FileStrategy.php | 17 +--- .../Zippy/FileStrategy/TarFileStrategy.php | 17 +--- .../Zippy/FileStrategy/TarGzFileStrategy.php | 17 +--- .../Zippy/FileStrategy/ZipFileStrategy.php | 17 +--- .../FileStrategy/AbstractFileStrategyTest.php | 82 +++++++++++++++++++ .../FileStrategy/FileStrategyTestCase.php | 19 +++++ 10 files changed, 178 insertions(+), 91 deletions(-) create mode 100644 src/Alchemy/Zippy/FileStrategy/AbstractFileStrategy.php create mode 100644 tests/Alchemy/Zippy/Tests/FileStrategy/AbstractFileStrategyTest.php diff --git a/src/Alchemy/Zippy/FileStrategy/AbstractFileStrategy.php b/src/Alchemy/Zippy/FileStrategy/AbstractFileStrategy.php new file mode 100644 index 0000000..f6f65df --- /dev/null +++ b/src/Alchemy/Zippy/FileStrategy/AbstractFileStrategy.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\Zippy\FileStrategy; + +use Alchemy\Zippy\Adapter\AdapterContainer; +use Alchemy\Zippy\Exception\RuntimeException; + +abstract class AbstractFileStrategy implements FileStrategyInterface +{ + protected $container; + + public function __construct(AdapterContainer $container) + { + $this->container = $container; + } + + /** + * {@inheritdoc} + */ + public function getAdapters() + { + $services = array(); + foreach ($this->getServiceNames() as $serviceName) { + try { + $services[] = $this->container[$serviceName]; + } catch (RuntimeException $e) { + + } + } + + return $services; + } + + /** + * Returns an array of service names that defines adapters. + * + * @return string[] + */ + abstract protected function getServiceNames(); +} diff --git a/src/Alchemy/Zippy/FileStrategy/TB2FileStrategy.php b/src/Alchemy/Zippy/FileStrategy/TB2FileStrategy.php index b63562b..45c55b5 100644 --- a/src/Alchemy/Zippy/FileStrategy/TB2FileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/TB2FileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class TB2FileStrategy implements FileStrategyInterface +class TB2FileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\GNUTar\\TarBz2GNUTarAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\BSDTar\\TarBz2BSDTarAdapter'], + 'Alchemy\\Zippy\\Adapter\\GNUTar\\TarBz2GNUTarAdapter', + 'Alchemy\\Zippy\\Adapter\\BSDTar\\TarBz2BSDTarAdapter' ); } diff --git a/src/Alchemy/Zippy/FileStrategy/TBz2FileStrategy.php b/src/Alchemy/Zippy/FileStrategy/TBz2FileStrategy.php index c3295b8..a99b545 100644 --- a/src/Alchemy/Zippy/FileStrategy/TBz2FileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/TBz2FileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class TBz2FileStrategy implements FileStrategyInterface +class TBz2FileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\GNUTar\\TarBz2GNUTarAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\BSDTar\\TarBz2BSDTarAdapter'], + 'Alchemy\\Zippy\\Adapter\\GNUTar\\TarBz2GNUTarAdapter', + 'Alchemy\\Zippy\\Adapter\\BSDTar\\TarBz2BSDTarAdapter' ); } diff --git a/src/Alchemy/Zippy/FileStrategy/TGzFileStrategy.php b/src/Alchemy/Zippy/FileStrategy/TGzFileStrategy.php index 7ace0a3..f1e6ca3 100644 --- a/src/Alchemy/Zippy/FileStrategy/TGzFileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/TGzFileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class TGzFileStrategy implements FileStrategyInterface +class TGzFileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\GNUTar\\TarGzGNUTarAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\BSDTar\\TarGzBSDTarAdapter'], + 'Alchemy\\Zippy\\Adapter\\GNUTar\\TarGzGNUTarAdapter', + 'Alchemy\\Zippy\\Adapter\\BSDTar\\TarGzBSDTarAdapter' ); } diff --git a/src/Alchemy/Zippy/FileStrategy/TarBz2FileStrategy.php b/src/Alchemy/Zippy/FileStrategy/TarBz2FileStrategy.php index 13ab295..fa4b1e4 100644 --- a/src/Alchemy/Zippy/FileStrategy/TarBz2FileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/TarBz2FileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class TarBz2FileStrategy implements FileStrategyInterface +class TarBz2FileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\GNUTar\\TarBz2GNUTarAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\BSDTar\\TarBz2BSDTarAdapter'], + 'Alchemy\\Zippy\\Adapter\\GNUTar\\TarBz2GNUTarAdapter', + 'Alchemy\\Zippy\\Adapter\\BSDTar\\TarBz2BSDTarAdapter' ); } diff --git a/src/Alchemy/Zippy/FileStrategy/TarFileStrategy.php b/src/Alchemy/Zippy/FileStrategy/TarFileStrategy.php index 930ea45..b5fdae0 100644 --- a/src/Alchemy/Zippy/FileStrategy/TarFileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/TarFileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class TarFileStrategy implements FileStrategyInterface +class TarFileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\GNUTar\\TarGNUTarAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\BSDTar\\TarBSDTarAdapter'], + 'Alchemy\\Zippy\\Adapter\\GNUTar\\TarGNUTarAdapter', + 'Alchemy\\Zippy\\Adapter\\BSDTar\\TarBSDTarAdapter' ); } diff --git a/src/Alchemy/Zippy/FileStrategy/TarGzFileStrategy.php b/src/Alchemy/Zippy/FileStrategy/TarGzFileStrategy.php index 5dae40b..a136e62 100644 --- a/src/Alchemy/Zippy/FileStrategy/TarGzFileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/TarGzFileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class TarGzFileStrategy implements FileStrategyInterface +class TarGzFileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\GNUTar\\TarGzGNUTarAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\BSDTar\\TarGzBSDTarAdapter'], + 'Alchemy\\Zippy\\Adapter\\GNUTar\\TarGzGNUTarAdapter', + 'Alchemy\\Zippy\\Adapter\\BSDTar\\TarGzBSDTarAdapter' ); } diff --git a/src/Alchemy/Zippy/FileStrategy/ZipFileStrategy.php b/src/Alchemy/Zippy/FileStrategy/ZipFileStrategy.php index 312bfb5..dfeb5c7 100644 --- a/src/Alchemy/Zippy/FileStrategy/ZipFileStrategy.php +++ b/src/Alchemy/Zippy/FileStrategy/ZipFileStrategy.php @@ -11,25 +11,16 @@ namespace Alchemy\Zippy\FileStrategy; -use Alchemy\Zippy\Adapter\AdapterContainer; - -class ZipFileStrategy implements FileStrategyInterface +class ZipFileStrategy extends AbstractFileStrategy { - private $container; - - public function __construct(AdapterContainer $container) - { - $this->container = $container; - } - /** * {@inheritdoc} */ - public function getAdapters() + protected function getServiceNames() { return array( - $this->container['Alchemy\\Zippy\\Adapter\\ZipAdapter'], - $this->container['Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter'], + 'Alchemy\\Zippy\\Adapter\\ZipAdapter', + 'Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter' ); } diff --git a/tests/Alchemy/Zippy/Tests/FileStrategy/AbstractFileStrategyTest.php b/tests/Alchemy/Zippy/Tests/FileStrategy/AbstractFileStrategyTest.php new file mode 100644 index 0000000..76c4553 --- /dev/null +++ b/tests/Alchemy/Zippy/Tests/FileStrategy/AbstractFileStrategyTest.php @@ -0,0 +1,82 @@ +getMockForAbstractClass('Alchemy\Zippy\FileStrategy\AbstractFileStrategy', array($container)); + $stub->expects($this->any()) + ->method('getServiceNames') + ->will($this->returnValue(array( + 'Unknown\Services' + ))); + + + $adapters = $stub->getAdapters(); + $this->assertInternalType('array', $adapters); + $this->assertCount(0, $adapters); + } + + public function testGetAdapters() + { + $container = AdapterContainer::load(); + + $stub = $this->getMockForAbstractClass('Alchemy\Zippy\FileStrategy\AbstractFileStrategy', array($container)); + $stub->expects($this->any()) + ->method('getServiceNames') + ->will($this->returnValue(array( + 'Alchemy\\Zippy\\Adapter\\ZipAdapter', + 'Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter' + ))); + + $adapters = $stub->getAdapters(); + $this->assertInternalType('array', $adapters); + $this->assertCount(2, $adapters); + foreach ($adapters as $adapter) { + $this->assertInstanceOf('Alchemy\\Zippy\\Adapter\\AdapterInterface', $adapter); + } + } + + public function testGetAdaptersWithAdapterThatRaiseAnException() + { + $adapterMock = $this->getMock('Alchemy\Zippy\Adapter\AdapterInterface'); + $container = $this->getMock('Alchemy\Zippy\Adapter\AdapterContainer'); + $container + ->expects($this->at(0)) + ->method('offsetGet') + ->with($this->equalTo('Alchemy\\Zippy\\Adapter\\ZipAdapter')) + ->will($this->returnValue($adapterMock)); + + $container + ->expects($this->at(1)) + ->method('offsetGet') + ->with($this->equalTo('Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter')) + ->will($this->throwException(new RuntimeException())); + + $stub = $this->getMockForAbstractClass('Alchemy\Zippy\FileStrategy\AbstractFileStrategy', array($container)); + $stub->expects($this->any()) + ->method('getServiceNames') + ->will($this->returnValue(array( + 'Alchemy\\Zippy\\Adapter\\ZipAdapter', + 'Alchemy\\Zippy\\Adapter\\ZipExtensionAdapter' + ))); + + $adapters = $stub->getAdapters(); + $this->assertInternalType('array', $adapters); + $this->assertCount(1, $adapters); + foreach ($adapters as $adapter) { + $this->assertSame($adapterMock, $adapter); + } + } +} diff --git a/tests/Alchemy/Zippy/Tests/FileStrategy/FileStrategyTestCase.php b/tests/Alchemy/Zippy/Tests/FileStrategy/FileStrategyTestCase.php index efdbdf6..e353149 100644 --- a/tests/Alchemy/Zippy/Tests/FileStrategy/FileStrategyTestCase.php +++ b/tests/Alchemy/Zippy/Tests/FileStrategy/FileStrategyTestCase.php @@ -3,6 +3,7 @@ namespace Alchemy\Zippy\Tests\FileStrategy; use Alchemy\Zippy\Adapter\AdapterInterface; +use Alchemy\Zippy\Exception\RuntimeException; use Alchemy\Zippy\Tests\TestCase; use Alchemy\Zippy\FileStrategy\FileStrategyInterface; @@ -55,6 +56,24 @@ public function getAdaptersShouldReturnAnArrayOfAdapter() } } + /** @test */ + public function getAdaptersShouldReturnAnArrayOfAdapterEvenIfAdapterRaiseAnException() + { + $container = $this->getMock('Alchemy\Zippy\Adapter\AdapterContainer'); + $container + ->expects($this->any()) + ->method('offsetGet') + ->will($this->throwException(new RuntimeException())); + + $adapters = $this->getStrategy($container)->getAdapters(); + + $this->assertInternalType('array', $adapters); + + foreach ($adapters as $adapter) { + $this->assertInstanceOf('Alchemy\\Zippy\\Adapter\\AdapterInterface', $adapter); + } + } + /** * @return FileStrategyInterface */