)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09bbbfb1193087db4dd82e594efbfc47de4c7a5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ed87daf7_0052e8a1","updated":"2026-04-22 16:46:54.000000000","message":"Seems reasonable. One quick question (though maybe it\u0027s better as a follow-on?)","commit_id":"6e27b49c4a18b6bea1e356fb5255b46c293d0696"}],"test/functional/test_object_versioning.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"09bbbfb1193087db4dd82e594efbfc47de4c7a5d","unresolved":true,"context_lines":[{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":1086,"context_line":"            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u0027bad\u0027})"},{"line_number":1087,"context_line":"        self.assertEqual(400, cm.exception.status)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    def test_delete_with_version_api_old_object(self):"},{"line_number":1090,"context_line":"        versioned_obj_name \u003d Utils.create_name()"}],"source_content_type":"text/x-python","patch_set":2,"id":"517a80d0_18de7345","line":1087,"updated":"2026-04-22 16:46:54.000000000","message":"Do we already have a test like\n```\ndiff --git a/test/functional/test_object_versioning.py b/test/functional/test_object_versioning.py\nindex 46d501a00c..5caf265d48 100644\n--- a/test/functional/test_object_versioning.py\n+++ b/test/functional/test_object_versioning.py\n@@ -1086,6 +1086,10 @@ class TestObjectVersioning(TestObjectVersioningBase):\n             obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u0027bad\u0027})\n         self.assertEqual(400, cm.exception.status)\n \n+        with self.assertRaises(ResponseError) as cm:\n+            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u0027123\u0027})\n+        self.assertEqual(404, cm.exception.status)\n+\n     def test_delete_with_version_api_old_object(self):\n         versioned_obj_name \u003d Utils.create_name()\n         obj \u003d self.env.container.file(versioned_obj_name)\n```\n?","commit_id":"6e27b49c4a18b6bea1e356fb5255b46c293d0696"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"feafab0c939d0553e4810b93ac1cbf7b5d7730c7","unresolved":true,"context_lines":[{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":1086,"context_line":"            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u0027bad\u0027})"},{"line_number":1087,"context_line":"        self.assertEqual(400, cm.exception.status)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    def test_delete_with_version_api_old_object(self):"},{"line_number":1090,"context_line":"        versioned_obj_name \u003d Utils.create_name()"}],"source_content_type":"text/x-python","patch_set":2,"id":"f9a2eaa3_d4286aa5","line":1087,"in_reply_to":"517a80d0_18de7345","updated":"2026-04-24 11:40:50.000000000","message":"No, not functional, AFAICT.\n\nSee follow-up 986073: versioning: add func test for PUT?version-id\u003d 404 | https://review.opendev.org/c/openstack/swift/+/986073","commit_id":"6e27b49c4a18b6bea1e356fb5255b46c293d0696"}],"test/unit/common/middleware/test_object_versioning.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"243a0c810a997d8d2239a041ae2c239d8333e427","unresolved":true,"context_lines":[{"line_number":2031,"context_line":"            req \u003d Request.blank("},{"line_number":2032,"context_line":"                \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":2033,"context_line":"                environ\u003d{\u0027swift.cache\u0027: self.cache_version_on},"},{"line_number":2034,"context_line":"                params\u003d{\u0027version-id\u0027: invalid_versions})"},{"line_number":2035,"context_line":"            status, headers, body \u003d self.call_ov(req)"},{"line_number":2036,"context_line":"            self.assertEqual(status, \u0027400 Bad Request\u0027)"},{"line_number":2037,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"462e66f4_f44f9df6","side":"PARENT","line":2034,"range":{"start_line":2034,"start_character":38,"end_line":2034,"end_character":54},"updated":"2026-04-02 12:19:31.000000000","message":"using the *list* as a request param was always going to be a 400!","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"feafab0c939d0553e4810b93ac1cbf7b5d7730c7","unresolved":false,"context_lines":[{"line_number":2031,"context_line":"            req \u003d Request.blank("},{"line_number":2032,"context_line":"                \u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":2033,"context_line":"                environ\u003d{\u0027swift.cache\u0027: self.cache_version_on},"},{"line_number":2034,"context_line":"                params\u003d{\u0027version-id\u0027: invalid_versions})"},{"line_number":2035,"context_line":"            status, headers, body \u003d self.call_ov(req)"},{"line_number":2036,"context_line":"            self.assertEqual(status, \u0027400 Bad Request\u0027)"},{"line_number":2037,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"99dcf65b_5ff95741","side":"PARENT","line":2034,"range":{"start_line":2034,"start_character":38,"end_line":2034,"end_character":54},"in_reply_to":"462e66f4_f44f9df6","updated":"2026-04-24 11:40:50.000000000","message":"Acknowledged","commit_id":"694d25bb1a87f9426ac7ad1f3817c51f5bf13a34"}]}
