123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684 |
- <?php
- namespace spec\Gaufrette\Adapter;
- use AmazonS3;
- use PhpSpec\ObjectBehavior;
- use Prophecy\Argument;
- class AmazonS3Spec extends ObjectBehavior
- {
- /**
- * @param \AmazonS3 $service
- */
- function let(AmazonS3 $service)
- {
- $this->beConstructedWith($service, 'bucketName');
- }
- function it_is_adapter()
- {
- $this->shouldHaveType('Gaufrette\Adapter');
- }
- function it_supports_metadata()
- {
- $this->shouldHaveType('Gaufrette\Adapter\MetadataSupporter');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_reads_file(AmazonS3 $service)
- {
- $options = array(
- 'range' => 12,
- 'response' => array(
- 'content-language' => 'pl-pl'
- )
- );
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object(
- 'bucketName',
- 'filename',
- $options
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse('header', 'some content', 200))
- ;
- $this->setMetadata('filename', $options);
- $this->read('filename')->shouldReturn('some content');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_returns_false_when_cannot_read(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object(
- 'bucketName',
- 'filename',
- array()
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse('header', 'some content', 500))
- ;
- $this->read('filename')->shouldReturn(false);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_read(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object(
- 'bucketName',
- 'filename',
- array()
- )
- ->willThrow(new \RuntimeException('read'))
- ;
- $this->shouldThrow(new \RuntimeException('read'))->duringRead('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_rename_file(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->copy_object(
- array(
- 'bucket' => 'bucketName',
- 'filename' => 'filename1',
- ),
- array(
- 'bucket' => 'bucketName',
- 'filename' => 'filename2'
- ),
- array('acl' => \AmazonS3::ACL_OWNER_READ)
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse('header', 'some content', 200))
- ;
- $service
- ->delete_object(
- 'bucketName',
- 'filename1',
- Argument::any()
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array(), 'some', 200))
- ;
- $this->setMetadata('filename1', array('acl' => \AmazonS3::ACL_OWNER_READ));
- $this->rename('filename1', 'filename2')->shouldReturn(true);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_rename(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->copy_object(Argument::cetera())
- ->willThrow(new \RuntimeException('rename'))
- ;
- $this->shouldThrow(new \RuntimeException('rename'))->duringRename('filename', 'filename1');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_returns_false_when_cannot_rename(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->copy_object(
- array(
- 'bucket' => 'bucketName',
- 'filename' => 'filename1',
- ),
- array(
- 'bucket' => 'bucketName',
- 'filename' => 'filename2'
- ),
- array()
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse('header', 'some content', 500))
- ;
- $this->rename('filename1', 'filename2')->shouldReturn(false);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_write_file(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->create_object(
- 'bucketName',
- 'filename',
- array(
- 'acl' => \AmazonS3::ACL_PRIVATE,
- 'body' => 'some content'
- )
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array('x-aws-requestheaders' => array('Content-Length' => 12)), 'some content', 200))
- ;
- $this->setMetadata('filename', array('acl' => \AmazonS3::ACL_PRIVATE, 'body' => 'other content'));
- $this->write('filename', 'some content')->shouldReturn(12);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_returns_false_when_cannot_write(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->create_object(
- 'bucketName',
- 'filename',
- array(
- 'acl' => \AmazonS3::ACL_PUBLIC,
- 'body' => 'some content'
- )
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array('x-aws-requestheaders' => array('Content-Length' => 12)), 'some content', 500))
- ;
- $this->write('filename', 'some content')->shouldReturn(false);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_write(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->create_object(Argument::cetera())
- ->willThrow(new \RuntimeException('write'))
- ;
- $this->shouldThrow(new \RuntimeException('write'))->duringWrite('filename', 'some content');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_check_if_file_exists(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service->if_object_exists('bucketName', 'filename')->willReturn(true);
- $this->exists('filename')->shouldReturn(true);
- $service->if_object_exists('bucketName', 'filename')->willReturn(false);
- $this->exists('filename')->shouldReturn(false);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_file_exists(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->if_object_exists('bucketName', 'filename')
- ->willThrow(new \RuntimeException('exists'))
- ;
- $this->shouldThrow(new \RuntimeException('exists'))->duringExists('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_get_file_mtime(AmazonS3 $service)
- {
- $metadata = array('acl' => \AmazonS3::ACL_PUBLIC);
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object_metadata(
- 'bucketName',
- 'filename',
- $metadata
- )
- ->shouldBeCalled()
- ->willReturn(array('Headers' => array('last-modified' => '2012-01-01 23:10:10')))
- ;
- $this->setMetadata('filename', $metadata);
- $this->mtime('filename')->shouldReturn(strtotime('2012-01-01 23:10:10'));
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_returns_false_when_cannot_fetch_mtime(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object_metadata(
- 'bucketName',
- 'filename',
- array()
- )
- ->shouldBeCalled()
- ->willReturn(array('Headers' => array()))
- ;
- $this->mtime('filename')->shouldReturn(false);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_fetch_mtime(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object_metadata('bucketName', 'filename', Argument::any())
- ->willThrow(new \RuntimeException('mtime'))
- ;
- $this->shouldThrow(new \RuntimeException('mtime'))->duringMtime('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_delete_file(AmazonS3 $service)
- {
- $metadata = array('acl' => \AmazonS3::ACL_PRIVATE);
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->delete_object(
- 'bucketName',
- 'filename',
- $metadata
- )
- ->willReturn(new \CFResponse(array(), 'some', 200))
- ;
- $this->setMetadata('filename', $metadata);
- $this->delete('filename')->shouldReturn(true);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_fetch_delete(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(true)
- ;
- $service
- ->delete_object(
- 'bucketName',
- 'filename',
- Argument::any()
- )
- ->willThrow(new \RuntimeException('delete'))
- ;
- $this->shouldThrow(new \RuntimeException('delete'))->duringDelete('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_returns_false_when_cannot_delete(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->delete_object(
- 'bucketName',
- 'filename',
- array()
- )
- ->willReturn(new \CFResponse(array(), 'some', 500))
- ;
- $this->delete('filename')->shouldReturn(false);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_get_keys(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->get_object_list('bucketName')
- ->shouldBeCalled()
- ->willReturn(array('filename2', 'aaa/filename', 'filename1'))
- ;
- $this->keys()->shouldReturn(array('aaa', 'aaa/filename', 'filename1', 'filename2'));
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_is_verbose_and_throws_exceptions_when_fetch_keys(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(true)
- ;
- $service
- ->get_object_list('bucketName')
- ->willThrow(new \RuntimeException('keys'))
- ;
- $this->shouldThrow(new \RuntimeException('keys'))->duringKeys();
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_handle_dirs(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(true)
- ;
- $service
- ->if_object_exists('bucketName', 'filename')
- ->shouldNotBeCalled()
- ;
- $service
- ->if_object_exists('bucketName', 'filename/')
- ->shouldBeCalled()
- ->willReturn(false)
- ;
- $service
- ->if_object_exists('bucketName', 'dirname/')
- ->willReturn(true)
- ;
- $this->isDirectory('filename')->shouldReturn(false);
- $this->isDirectory('dirname')->shouldReturn(true);
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_should_fail_when_bucket_does_not_exist(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(false)
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringRead('filename')
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringWrite('filename', 'content')
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringDelete('filename')
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringExists('filename')
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringMtime('filename')
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringRename('filename', 'filename2')
- ;
- $this
- ->shouldThrow(new \RuntimeException('The configured bucket "bucketName" does not exist.'))
- ->duringKeys()
- ;
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_creates_bucket_if_create_mode_is_enabled(AmazonS3 $service)
- {
- $service->set_region(Argument::any())->shouldBeCalled();
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(false)
- ;
- $service->hostname = \AmazonS3::REGION_US_E1;
- $service
- ->create_bucket('bucketName', \AmazonS3::REGION_US_E1)
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array(), 'created', 201))
- ;
- $service
- ->if_object_exists('bucketName', 'filename')
- ->willReturn(false)
- ;
- $this->beConstructedWith($service, 'bucketName', array('create' => true));
- $this->exists('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_fails_when_cannot_create_bucket(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(false)
- ;
- $service
- ->create_bucket('bucketName', Argument::any())
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array(), 'created', 500))
- ;
- $this->beConstructedWith($service, 'bucketName', array('create' => true));
- $this
- ->shouldThrow(new \RuntimeException('Failed to create the configured bucket "bucketName".'))
- ->duringExists('filename')
- ;
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_allows_to_configure_reqion(AmazonS3 $service)
- {
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(true)
- ;
- $service
- ->set_region(\AmazonS3::REGION_EU_W1)
- ->shouldBeCalled()
- ;
- $service
- ->if_object_exists('bucketName', 'filename')
- ->willReturn(true)
- ;
- $this->beConstructedWith($service, 'bucketName', array('region' => \AmazonS3::REGION_EU_W1));
- $this->exists('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_allows_to_configure_region_for_bucket(AmazonS3 $service)
- {
- $service->set_region(Argument::any())->shouldBeCalled();
- $service
- ->if_bucket_exists('bucketName')
- ->willReturn(false)
- ;
- $service
- ->create_bucket('bucketName', \AmazonS3::REGION_EU_W1)
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array(), 'created', 201))
- ;
- $service
- ->if_object_exists('bucketName', 'filename')
- ->willReturn(false)
- ;
- $this->beConstructedWith($service, 'bucketName', array('create' => true, 'region' => \AmazonS3::REGION_EU_W1));
- $this->exists('filename');
- }
- /**
- * @param \AmazonS3 $service
- */
- function it_allows_to_configure_acl(AmazonS3 $service)
- {
- $this->setAcl('123abc');
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->create_object(
- 'bucketName',
- 'filename',
- array(
- 'acl' => '123abc',
- 'body' => 'some content'
- )
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array('x-aws-requestheaders' => array('Content-Length' => 12)), 'some content', 200))
- ;
- $this->write('filename', 'some content')->shouldReturn(12);
- $this->getAcl()->shouldBe('123abc');
- }
- /**
- * @param \AmazonS3 $service
- */
- function its_file_metadata_acl_are_more_important_than_global_acl_config(AmazonS3 $service)
- {
- $this->setAcl('123abc');
- $service
- ->if_bucket_exists('bucketName')
- ->shouldBeCalled()
- ->willReturn(true)
- ;
- $service
- ->create_object(
- 'bucketName',
- 'filename',
- array(
- 'acl' => 'more important acl',
- 'body' => 'some content'
- )
- )
- ->shouldBeCalled()
- ->willReturn(new \CFResponse(array('x-aws-requestheaders' => array('Content-Length' => 12)), 'some content', 200))
- ;
- $this->setMetadata('filename', array('acl' => 'more important acl'));
- $this->write('filename', 'some content')->shouldReturn(12);
- }
- }
|