diff --git a/library/Class/WebService/ArteVOD/Vignette.php b/library/Class/WebService/ArteVOD/Vignette.php index 3adf699a38a636168d3f8262bc560e1d4b0f6265..f6933c45bbe130febc8dbd0df68ff2d9c37954d4 100644 --- a/library/Class/WebService/ArteVOD/Vignette.php +++ b/library/Class/WebService/ArteVOD/Vignette.php @@ -20,23 +20,54 @@ */ class Class_WebService_ArteVOD_Vignette extends Class_WebService_Abstract { + protected static $_instance; protected $_file_writer; + protected $_updload_mover; + protected $_url_validator; + + + public static function getInstance() { + if (!isset(static::$_instance)) + static::$_instance = new static(); + return static::$_instance; + } + + + public static function resetInstance() { + static::$_instance = null; + } + + + public function __construct() { + $this->_upload_mover = new Class_UploadMover_LocalFile(); + $this->_url_validator = new ZendAfi_Validate_Url(); + } + public function updateAlbum($album) { - $parts = explode('/', $album->getPoster()); + $url_poster = $album->getPoster(); + if (!($url_poster && $this->_url_validator->isValid($url_poster))) + return $this; + + if (!$image = static::getHttpClient()->open_url($url_poster)) + return $this; + + $parts = explode('/', $url_poster); $filename = array_pop($parts); $temp_name = PATH_TEMP.$filename; - - $image = static::getHttpClient()->open_url($album->getPoster()); - $this->getFileWriter()->putContents($temp_name, $image); + if (false === $this->getFileWriter()->putContents($temp_name, $image)) + return $this; $_FILES['fichier'] = ['name' => $filename, 'tmp_name' => $temp_name, 'size' => strlen($image)]; - $album->setUploadMover('fichier', new Class_UploadMover_LocalFile()); + $album->setUploadMover('fichier', $this->_upload_mover); + $album->receiveFile(); $album->save(); + + return $this; } @@ -46,6 +77,8 @@ class Class_WebService_ArteVOD_Vignette extends Class_WebService_Abstract { public function getFileWriter() { + if (!isset($this->_file_writer)) + $this->_file_writer = new Class_FileWriter(); return $this->_file_writer; } } diff --git a/tests/library/Class/WebService/ArteVOD/VignetteTest.php b/tests/library/Class/WebService/ArteVOD/VignetteTest.php index a8363450b26c0925ce8827c0eeafe364d5cbd8a4..21bd1c769225e226a6d9ec8d57ee0cb61e8feab8 100644 --- a/tests/library/Class/WebService/ArteVOD/VignetteTest.php +++ b/tests/library/Class/WebService/ArteVOD/VignetteTest.php @@ -19,9 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Storm_Test_ModelTestCase { - protected $_album; - protected $_file_writer; +abstract class Class_WebService_ArteVOD_VignetteTestCase extends Storm_Test_ModelTestCase { + protected $_vignette, $_http_client; public function setUp() { parent::setup(); @@ -30,35 +29,85 @@ class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Storm_Test_Model ->whenCalled('save') ->answers(true); + Class_WebService_ArteVOD_Vignette::resetInstance(); + $this->_vignette = Class_WebService_ArteVOD_Vignette::getInstance(); + + $this->_http_client = Storm_Test_ObjectWrapper::mock(); + Class_WebService_ArteVOD_Vignette::setDefaultHttpClient($this->_http_client); + } + + + public function tearDown() { + Class_WebService_ArteVOD_Vignette::setDefaultHttpClient(null); + parent::tearDown(); + } +} + - $this->_album = Class_Album::newInstanceWithId(45) + + +class Class_WebService_ArteVOD_VignetteInitializationTest extends Class_WebService_ArteVOD_VignetteTestCase { + /** @test */ + public function defaultFileWriterShouldBeAnInstanceOfRealFileWriter() { + $this->assertInstanceOf('Class_FileWriter', $this->_vignette->getFileWriter()); + } +} + + + + +abstract class Class_WebService_ArteVOD_VignetteBlancheNeigeTestCase extends Class_WebService_ArteVOD_VignetteTestCase { + protected $_album; + protected $_file_writer; + + + public function setUp() { + parent::setup(); + + $this->_album = Storm_Test_ObjectWrapper::on( + Class_Album::newInstanceWithId(45) ->setTitre('Blanche Neige') ->beArteVOD() ->setNotes([['field' => '856', 'data' => ['x' => 'poster', - 'a' => 'http://mediatheque.com/blanche_neige.jpg']]]); + 'a' => 'http://mediatheque.com/blanche_neige.jpg']]])); + + - $this->_http_client = Storm_Test_ObjectWrapper::mock(); - Class_WebService_ArteVOD_Vignette::setDefaultHttpClient($this->_http_client); $this->_http_client ->whenCalled('open_url') ->with('http://mediatheque.com/blanche_neige.jpg') ->answers('an image'); - $vignette = new Class_WebService_ArteVOD_Vignette(); - $vignette->setFileWriter($this->_file_writer = Storm_Test_ObjectWrapper::mock() - ->whenCalled('putContents') - ->with(PATH_TEMP.'blanche_neige.jpg', 'an image') - ->answers(8) - ->beStrict()); - $vignette->updateAlbum($this->_album); - + $this->_vignette->setFileWriter($this->_file_writer = Storm_Test_ObjectWrapper::mock()); + $this->_file_writer + ->whenCalled('putContents') + ->answers(''); } +} - public function tearDown() { - Class_WebService_ArteVOD_Vignette::setDefaultHttpClient(null); - parent::tearDown(); + + +class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Class_WebService_ArteVOD_VignetteBlancheNeigeTestCase { + public function setUp() { + parent::setup(); + + $this->_album + ->whenCalled('receiveFile') + ->willDo(function() { + $this->_album->setFichier('blanche_neige.jpg'); + return true; + }); + + + $this->_file_writer + ->whenCalled('putContents') + ->with(PATH_TEMP.'blanche_neige.jpg', 'an image') + ->answers(8) + ->beStrict(); + + $this->_vignette->updateAlbum($this->_album); } @@ -111,4 +160,43 @@ class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Storm_Test_Model } } + + + +class Class_WebService_ArteVOD_VignetteBlancheNeigeErrorsTest extends Class_WebService_ArteVOD_VignetteBlancheNeigeTestCase { + /** @test */ + public function withoutValidUrlShouldNotDownloadImage() { + $this->_album + ->setNotes([['field' => '856', + 'data' => ['x' => 'poster', + 'a' => 'zork']]]); + $this->_vignette->updateAlbum($this->_album); + $this->assertFalse($this->_http_client->methodHasBeenCalled('open_url')); + } + + + /** @test */ + public function withoutDataShouldNotSaveImage() { + $this->_http_client + ->whenCalled('open_url') + ->with($this->_album->getPoster()) + ->answers(''); + + $this->_vignette->updateAlbum($this->_album); + $this->assertFalse($this->_file_writer->methodHasBeenCalled('putContents')); + } + + + + /** @test */ + public function withFailedWriteFileShouldNotMoveIt() { + $this->_file_writer + ->whenCalled('putContents') + ->answers(false); + + $this->_vignette->updateAlbum($this->_album); + $this->assertFalse($this->_album->methodHasBeenCalled('receiveFile')); + } +} + ?> \ No newline at end of file