From 29da006f787a30bba1359c4b91a0210921e4e73a Mon Sep 17 00:00:00 2001 From: Sanjeev Suresh Date: Thu, 21 Jun 2018 15:26:27 -0700 Subject: [PATCH 1/2] changed the getList default to an empty list instead of None, because otherwise an exception is raised when trying to iterate over an empty list --- moto/s3/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moto/s3/models.py b/moto/s3/models.py index 431c9c988..c38eea5c7 100644 --- a/moto/s3/models.py +++ b/moto/s3/models.py @@ -718,7 +718,7 @@ class S3Backend(BaseBackend): if key_name in bucket.keys: key = bucket.keys[key_name] else: - for key_version in bucket.keys.getlist(key_name): + for key_version in bucket.keys.getlist(key_name, default=[]): if str(key_version.version_id) == str(version_id): key = key_version break From 2ebd5f735973463d67f423dc7ddcaf3ee832a13a Mon Sep 17 00:00:00 2001 From: Sanjeev Suresh Date: Fri, 22 Jun 2018 11:59:01 -0700 Subject: [PATCH 2/2] tests for prefixes that return empty result sets --- tests/test_s3/test_s3.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 9f37791cb..c5edc1173 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -2362,6 +2362,35 @@ def test_boto3_list_object_versions(): response['Body'].read().should.equal(items[-1]) +@mock_s3 +def test_boto3_bad_prefix_list_object_versions(): + s3 = boto3.client('s3', region_name='us-east-1') + bucket_name = 'mybucket' + key = 'key-with-versions' + bad_prefix = 'key-that-does-not-exist' + s3.create_bucket(Bucket=bucket_name) + s3.put_bucket_versioning( + Bucket=bucket_name, + VersioningConfiguration={ + 'Status': 'Enabled' + } + ) + items = (six.b('v1'), six.b('v2')) + for body in items: + s3.put_object( + Bucket=bucket_name, + Key=key, + Body=body + ) + response = s3.list_object_versions( + Bucket=bucket_name, + Prefix=bad_prefix, + ) + response['ResponseMetadata']['HTTPStatusCode'].should.equal(200) + response.should_not.contain('Versions') + response.should_not.contain('DeleteMarkers') + + @mock_s3 def test_boto3_delete_markers(): s3 = boto3.client('s3', region_name='us-east-1')