diff --git a/moto/s3/models.py b/moto/s3/models.py index c6baa3f79..ec1ac46dd 100644 --- a/moto/s3/models.py +++ b/moto/s3/models.py @@ -477,7 +477,12 @@ class S3Backend(BaseBackend): def delete_key(self, bucket_name, key_name): key_name = clean_key_name(key_name) bucket = self.get_bucket(bucket_name) - return bucket.keys.pop(key_name) + + try: + bucket.keys.pop(key_name) + return True + except KeyError: + return False def copy_key(self, src_bucket_name, src_key_name, dest_bucket_name, dest_key_name, storage=None, acl=None, src_version_id=None): diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 700561035..5c9711e34 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -305,11 +305,11 @@ class ResponseObject(_TemplateEnvironmentMixin): error_names = [] for k in keys: - try: - key_name = k.firstChild.nodeValue - self.backend.delete_key(bucket_name, key_name) + key_name = k.firstChild.nodeValue + success = self.backend.delete_key(bucket_name, key_name) + if success: deleted_names.append(key_name) - except KeyError: + else: error_names.append(key_name) return 200, headers, template.render(deleted=deleted_names, delete_errors=error_names) @@ -520,12 +520,9 @@ class ResponseObject(_TemplateEnvironmentMixin): upload_id = query['uploadId'][0] self.backend.cancel_multipart(bucket_name, upload_id) return 204, headers, "" - try: - removed_key = self.backend.delete_key(bucket_name, key_name) - except KeyError: - return 404, headers, "" + self.backend.delete_key(bucket_name, key_name) template = self.response_template(S3_DELETE_OBJECT_SUCCESS) - return 204, headers, template.render(bucket=removed_key) + return 204, headers, template.render() def _complete_multipart_body(self, body): ps = minidom.parseString(body).getElementsByTagName('Part') diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 25668400c..eb68c9ed4 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -501,7 +501,8 @@ def test_delete_missing_key(): conn = boto.connect_s3('the_key', 'the_secret') bucket = conn.create_bucket('foobar') - bucket.delete_key.when.called_with('foobar').should.throw(S3ResponseError) + deleted_key = bucket.delete_key("foobar") + deleted_key.key.should.equal("foobar") @mock_s3