)]}'
{"test/unit/proxy/controllers/test_account.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24fae1205281265db07197ba460630933b4ad984","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def test_response_code_for_PUT(self):"},{"line_number":247,"context_line":"        PUT_TEST_CASES \u003d ["},{"line_number":248,"context_line":"            ((204, 204, 204), 204),"},{"line_number":249,"context_line":"            ((204, 204, 404), 204),"},{"line_number":250,"context_line":"            ((204, 204, 503), 204),"},{"line_number":251,"context_line":"            ((204, 404, 404), 404),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_b510035b","line":248,"updated":"2016-01-26 12:43:29.000000000","message":"these 204\u0027s should be 200 or 201.\n\nOK, so the code being tested just tests for 2xx, but feels like we should have the test represent reality, and be consistent with the similar test in TestAccountController4Replicas","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b79200057ff1325bba3ac2ed6bd592ef5595697b","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def test_response_code_for_PUT(self):"},{"line_number":247,"context_line":"        PUT_TEST_CASES \u003d ["},{"line_number":248,"context_line":"            ((204, 204, 204), 204),"},{"line_number":249,"context_line":"            ((204, 204, 404), 204),"},{"line_number":250,"context_line":"            ((204, 204, 503), 204),"},{"line_number":251,"context_line":"            ((204, 404, 404), 404),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_f2f8a34b","line":248,"in_reply_to":"9a68dd71_b510035b","updated":"2016-01-27 07:11:50.000000000","message":"Done","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24fae1205281265db07197ba460630933b4ad984","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            ((503, 503, 503), 503)"},{"line_number":258,"context_line":"        ]"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        self.app.allow_account_management \u003d True"},{"line_number":261,"context_line":"        controller \u003d proxy_server.AccountController(self.app, \u0027AUTH_bob\u0027)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        context \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_5c6bef85","line":260,"updated":"2016-01-26 12:43:29.000000000","message":"lines 260-271 are duplicated 6 times in the patch - perhaps make a helper method in a base class...\n\ne.g. self._assert_responses(method, test_cases)","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b79200057ff1325bba3ac2ed6bd592ef5595697b","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            ((503, 503, 503), 503)"},{"line_number":258,"context_line":"        ]"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        self.app.allow_account_management \u003d True"},{"line_number":261,"context_line":"        controller \u003d proxy_server.AccountController(self.app, \u0027AUTH_bob\u0027)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        context \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_1202173f","line":260,"in_reply_to":"9a68dd71_5c6bef85","updated":"2016-01-27 07:11:50.000000000","message":"Done","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24fae1205281265db07197ba460630933b4ad984","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                    fake_http_connect(*responses, give_connect\u003dcallback)):"},{"line_number":269,"context_line":"                req \u003d Request.blank(\u0027/v1/AUTH_bob\u0027)"},{"line_number":270,"context_line":"                resp \u003d controller.PUT(req)"},{"line_number":271,"context_line":"            self.assertEqual(expected, resp.status_int)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def test_response_code_for_DELETE(self):"},{"line_number":274,"context_line":"        DELETE_TEST_CASES \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_39788d8f","line":271,"updated":"2016-01-26 12:43:29.000000000","message":"nit: it would be nice to have a message saying what the test case was if the assert ever fails","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b79200057ff1325bba3ac2ed6bd592ef5595697b","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                    fake_http_connect(*responses, give_connect\u003dcallback)):"},{"line_number":269,"context_line":"                req \u003d Request.blank(\u0027/v1/AUTH_bob\u0027)"},{"line_number":270,"context_line":"                resp \u003d controller.PUT(req)"},{"line_number":271,"context_line":"            self.assertEqual(expected, resp.status_int)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def test_response_code_for_DELETE(self):"},{"line_number":274,"context_line":"        DELETE_TEST_CASES \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_b2f22b6e","line":271,"in_reply_to":"9a68dd71_39788d8f","updated":"2016-01-27 07:11:50.000000000","message":"Done","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24fae1205281265db07197ba460630933b4ad984","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            ((200, 404, 503, 503), 503),"},{"line_number":342,"context_line":"            ((200, 503, 503, 503), 503),"},{"line_number":343,"context_line":"            ((404, 404, 404, 404), 404),"},{"line_number":344,"context_line":"            ((404, 404, 404, 503), 404),"},{"line_number":345,"context_line":"            ((404, 503, 503, 503), 503),"},{"line_number":346,"context_line":"            ((503, 503, 503, 503), 503)"},{"line_number":347,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_1917c955","line":344,"updated":"2016-01-26 12:43:29.000000000","message":"case (404, 404, 503, 503) is missing, there should be 15 combinations","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b79200057ff1325bba3ac2ed6bd592ef5595697b","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            ((200, 404, 503, 503), 503),"},{"line_number":342,"context_line":"            ((200, 503, 503, 503), 503),"},{"line_number":343,"context_line":"            ((404, 404, 404, 404), 404),"},{"line_number":344,"context_line":"            ((404, 404, 404, 503), 404),"},{"line_number":345,"context_line":"            ((404, 503, 503, 503), 503),"},{"line_number":346,"context_line":"            ((503, 503, 503, 503), 503)"},{"line_number":347,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_12dbf7ee","line":344,"in_reply_to":"9a68dd71_1917c955","updated":"2016-01-27 07:11:50.000000000","message":"Added. (two more places)","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7189362b083a117395a14c16c104c3be92f9fa41","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            ((204, 204, 204, 204), 204),"},{"line_number":365,"context_line":"            ((204, 204, 204, 404), 204),"},{"line_number":366,"context_line":"            ((204, 204, 204, 503), 204),"},{"line_number":367,"context_line":"            ((204, 204, 404, 404), 503),"},{"line_number":368,"context_line":"            ((204, 204, 404, 503), 503),"},{"line_number":369,"context_line":"            ((204, 204, 503, 503), 503),"},{"line_number":370,"context_line":"            ((204, 404, 404, 404), 404),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_0dd6c727","line":367,"updated":"2016-01-25 20:32:30.000000000","message":"I still think this one is annoying.  If we could validate that those 404\u0027s are from DELETED accounts I think we could return something better than server error.  Maybe the account\u0027s return 410 for deleted accounts already?","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"3d54a1192f6628a8fc1fe6f1a0c0d0c58ed9a779","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            ((204, 204, 204, 204), 204),"},{"line_number":365,"context_line":"            ((204, 204, 204, 404), 204),"},{"line_number":366,"context_line":"            ((204, 204, 204, 503), 204),"},{"line_number":367,"context_line":"            ((204, 204, 404, 404), 503),"},{"line_number":368,"context_line":"            ((204, 204, 404, 503), 503),"},{"line_number":369,"context_line":"            ((204, 204, 503, 503), 503),"},{"line_number":370,"context_line":"            ((204, 404, 404, 404), 404),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_5039a2d7","line":367,"in_reply_to":"9a68dd71_0dd6c727","updated":"2016-01-26 07:54:14.000000000","message":"i checked it returns 404 (https://github.com/openstack/swift/blob/master/swift/account/server.py#L95)","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24fae1205281265db07197ba460630933b4ad984","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                            fake_http_connect(*responses)):"},{"line_number":386,"context_line":"                req \u003d Request.blank(\u0027/v1/AUTH_bob\u0027)"},{"line_number":387,"context_line":"                resp \u003d controller.DELETE(req)"},{"line_number":388,"context_line":"            print \u0027# responses: %s %s %s %s\u0027 % responses"},{"line_number":389,"context_line":"            self.assertEqual(expected, resp.status_int)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def test_response_code_for_POST(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_7cb5932f","line":388,"updated":"2016-01-26 12:43:29.000000000","message":"oops","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"b79200057ff1325bba3ac2ed6bd592ef5595697b","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                            fake_http_connect(*responses)):"},{"line_number":386,"context_line":"                req \u003d Request.blank(\u0027/v1/AUTH_bob\u0027)"},{"line_number":387,"context_line":"                resp \u003d controller.DELETE(req)"},{"line_number":388,"context_line":"            print \u0027# responses: %s %s %s %s\u0027 % responses"},{"line_number":389,"context_line":"            self.assertEqual(expected, resp.status_int)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def test_response_code_for_POST(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a68dd71_326abb1b","line":388,"in_reply_to":"9a68dd71_7cb5932f","updated":"2016-01-27 07:11:50.000000000","message":"Removed","commit_id":"785fc9662ace7026bbd45475097da0c13346e68d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7b5a90c2ad22824009c58ecd6c57aeccbc9be5c1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            self.app.allow_account_management \u003d True"},{"line_number":50,"context_line":"        controller \u003d proxy_server.AccountController(self.app, \u0027AUTH_bob\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        callback \u003d self._make_callback_func({}) if method \u003d\u003d \u0027PUT\u0027 else None"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        for responses, expected in test_cases:"},{"line_number":55,"context_line":"            if callback:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_490ca542","line":52,"updated":"2016-01-27 10:16:36.000000000","message":"I didn\u0027t notice this on last review, but the callback is unnecessary - no assertions are made about the context, which is {}","commit_id":"eb8653aad93312ef742888a48a7153dfc381ca78"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"9761314c859a69d4a30e50add877ebde4001057a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            self.app.allow_account_management \u003d True"},{"line_number":50,"context_line":"        controller \u003d proxy_server.AccountController(self.app, \u0027AUTH_bob\u0027)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        callback \u003d self._make_callback_func({}) if method \u003d\u003d \u0027PUT\u0027 else None"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        for responses, expected in test_cases:"},{"line_number":55,"context_line":"            if callback:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_0631afa2","line":52,"in_reply_to":"7a5de9d1_490ca542","updated":"2016-01-27 13:26:43.000000000","message":"Removed","commit_id":"eb8653aad93312ef742888a48a7153dfc381ca78"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7b5a90c2ad22824009c58ecd6c57aeccbc9be5c1","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            self.assertEqual(expected,"},{"line_number":68,"context_line":"                             resp.status_int,"},{"line_number":69,"context_line":"                             \u0027Failed case: %s\u0027 % str(responses))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_account_info_in_response_env(self):"},{"line_number":72,"context_line":"        controller \u003d proxy_server.AccountController(self.app, \u0027AUTH_bob\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_4c20334a","line":69,"updated":"2016-01-27 10:16:36.000000000","message":"This does not show how the test failed - see my gist.","commit_id":"eb8653aad93312ef742888a48a7153dfc381ca78"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"9761314c859a69d4a30e50add877ebde4001057a","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            self.assertEqual(expected,"},{"line_number":68,"context_line":"                             resp.status_int,"},{"line_number":69,"context_line":"                             \u0027Failed case: %s\u0027 % str(responses))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_account_info_in_response_env(self):"},{"line_number":72,"context_line":"        controller \u003d proxy_server.AccountController(self.app, \u0027AUTH_bob\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_66b0a38c","line":69,"in_reply_to":"7a5de9d1_4c20334a","updated":"2016-01-27 13:26:43.000000000","message":"If tests failed, we can see the traceback with error message like:\n\nAssertionError: Failed case: (503, 503, 503, 503)\n    \u0027200 !\u003d 503\u0027 \u003d \u0027%s !\u003d %s\u0027 % (safe_repr(200), safe_repr(503))\n    \u0027Failed case: (503, 503, 503, 503)\u0027 \u003d self._formatMessage(\u0027Failed case: (503, 503, 503, 503)\u0027, \u0027200 !\u003d 503\u0027)\n\u003e\u003e  raise self.failureException(\u0027Failed case: (503, 503, 503, 503)\u0027)\n\nI thought it\u0027s enough info to debug the code but I understand we better to have clear message in the line of AssertionError so I will fix it.\n\nAssertionError: Expected 200 but got 503. Failed case: (503, 503, 503, 503)\n    \u0027200 !\u003d 503\u0027 \u003d \u0027%s !\u003d %s\u0027 % (safe_repr(200), safe_repr(503))\n    \u0027Expected 200 but got 503. Failed case: (503, 503, 503, 503)\u0027 \u003d self._formatMessage(\u0027Expected 200 but got 503. Failed case: (503, 503, 503, 503)\u0027, \u0027200 !\u003d 503\u0027)\n\u003e\u003e  raise self.failureException(\u0027Expected 200 but got 503. Failed case: (503, 503, 503, 503)\u0027)","commit_id":"eb8653aad93312ef742888a48a7153dfc381ca78"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7b5a90c2ad22824009c58ecd6c57aeccbc9be5c1","unresolved":false,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"@patch_policies("},{"line_number":317,"context_line":"    [StoragePolicy(0, \u0027zero\u0027, True, object_ring\u003dFakeRing(replicas\u003d4))])"},{"line_number":318,"context_line":"class TestAccountController4Replicas(TestAccountController):"},{"line_number":319,"context_line":"    def setUp(self):"},{"line_number":320,"context_line":"        self.app \u003d proxy_server.Application("},{"line_number":321,"context_line":"            None,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_aca9a7e1","line":318,"updated":"2016-01-27 10:16:36.000000000","message":"subclassing TestAccountController causes *all* the test methods to be repeated - was that intentional? If not, then break the helper methods into a shared base class that has no test methods.\n\ne.g. https://gist.github.com/alistairncoles/6d6e9802c642b6898d53","commit_id":"eb8653aad93312ef742888a48a7153dfc381ca78"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"9761314c859a69d4a30e50add877ebde4001057a","unresolved":false,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"@patch_policies("},{"line_number":317,"context_line":"    [StoragePolicy(0, \u0027zero\u0027, True, object_ring\u003dFakeRing(replicas\u003d4))])"},{"line_number":318,"context_line":"class TestAccountController4Replicas(TestAccountController):"},{"line_number":319,"context_line":"    def setUp(self):"},{"line_number":320,"context_line":"        self.app \u003d proxy_server.Application("},{"line_number":321,"context_line":"            None,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_a193e5a2","line":318,"in_reply_to":"7a5de9d1_aca9a7e1","updated":"2016-01-27 13:26:43.000000000","message":"It\u0027s intentional. So far we don\u0027t have tests for even num replicas case. I think this is good idea to test for typical even num replicas case and 3 replicas case because we support both cases. When someone add/change test_account.py, we make sure that the code works both.","commit_id":"eb8653aad93312ef742888a48a7153dfc381ca78"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"aa49ae6c6512cf921765453d5cf5e5ce4450ba96","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            context[\u0027method\u0027] \u003d method"},{"line_number":43,"context_line":"            context[\u0027path\u0027] \u003d path"},{"line_number":44,"context_line":"            context[\u0027headers\u0027] \u003d headers or {}"},{"line_number":45,"context_line":"        return callback"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _assert_responses(self, method, test_cases):"},{"line_number":48,"context_line":"        if method in (\u0027PUT\u0027, \u0027DELETE\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_0db474cf","line":45,"updated":"2016-02-19 04:51:21.000000000","message":"oh, so this just moved for fun...","commit_id":"c871e423ef0bed6c774693af3d54750235d6ce1f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"aa49ae6c6512cf921765453d5cf5e5ce4450ba96","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        for responses, expected in test_cases:"},{"line_number":53,"context_line":"            with mock.patch("},{"line_number":54,"context_line":"                    \u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":55,"context_line":"                    fake_http_connect(*responses)):"},{"line_number":56,"context_line":"                req \u003d Request.blank(\u0027/v1/AUTH_bob\u0027)"},{"line_number":57,"context_line":"                resp \u003d getattr(controller, method)(req)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_6dc9c05a","line":55,"updated":"2016-02-19 04:51:21.000000000","message":"is the good fake_http_connect?   yay that\u0027s the good one!\n\nbut the mocked_http_conn context manager in the same module is even better than using mock.patch directly!","commit_id":"c871e423ef0bed6c774693af3d54750235d6ce1f"}]}
