diff --git a/moto/s3/responses.py b/moto/s3/responses.py index 06aeb8e28..9aa576e6a 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -6,7 +6,11 @@ import sys import six from botocore.awsrequest import AWSPreparedRequest -from moto.core.utils import str_to_rfc_1123_datetime, py2_strip_unicode_keys +from moto.core.utils import ( + str_to_rfc_1123_datetime, + py2_strip_unicode_keys, + unix_time_millis, +) from six.moves.urllib.parse import parse_qs, urlparse, unquote, parse_qsl import xmltodict @@ -458,6 +462,8 @@ class ResponseObject(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): else: delete_marker_list.append(version) template = self.response_template(S3_BUCKET_GET_VERSIONS) + + key_list.sort(key=lambda r: (r.name, -unix_time_millis(r.last_modified))) return ( 200, {}, diff --git a/tests/test_s3/test_s3.py b/tests/test_s3/test_s3.py index 8c2b8130c..fa64c88e4 100644 --- a/tests/test_s3/test_s3.py +++ b/tests/test_s3/test_s3.py @@ -873,12 +873,12 @@ def test_list_versions(): versions.should.have.length_of(2) versions[0].name.should.equal("the-key") - versions[0].version_id.should.equal(key_versions[0]) - versions[0].get_contents_as_string().should.equal(b"Version 1") + versions[0].version_id.should.equal(key_versions[1]) + versions[0].get_contents_as_string().should.equal(b"Version 2") versions[1].name.should.equal("the-key") - versions[1].version_id.should.equal(key_versions[1]) - versions[1].get_contents_as_string().should.equal(b"Version 2") + versions[1].version_id.should.equal(key_versions[0]) + versions[1].get_contents_as_string().should.equal(b"Version 1") key = Key(bucket, "the2-key") key.set_contents_from_string("Version 1") @@ -3700,6 +3700,10 @@ def test_boto3_list_object_versions(): len(response["Versions"]).should.equal(2) keys = set([item["Key"] for item in response["Versions"]]) keys.should.equal({key}) + + # the first item in the list should be the latest + response["Versions"][0]["IsLatest"].should.equal(True) + # Test latest object version is returned response = s3.get_object(Bucket=bucket_name, Key=key) response["Body"].read().should.equal(items[-1])