)]}'
{"tempest/api/identity/admin/test_roles.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEqual(role_name, body[\u0027name\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        resp, body \u003d self.client.list_roles()"},{"line_number":67,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":68,"context_line":"        found \u003d [role for role in body if role[\u0027name\u0027] \u003d\u003d role_name]"},{"line_number":69,"context_line":"        self.assertTrue(any(found))"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_ec5c3e28","line":67,"updated":"2014-05-08 08:11:35.000000000","message":"Change the order of param","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c53c72be24f2b32280f2db5ca685aa8d5003cd6b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEqual(role_name, body[\u0027name\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        resp, body \u003d self.client.list_roles()"},{"line_number":67,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":68,"context_line":"        found \u003d [role for role in body if role[\u0027name\u0027] \u003d\u003d role_name]"},{"line_number":69,"context_line":"        self.assertTrue(any(found))"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_37457570","line":67,"in_reply_to":"7adec928_2cd8e6ee","updated":"2014-05-09 09:36:04.000000000","message":"It actually matters in assert message it will throw.","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertEqual(role_name, body[\u0027name\u0027])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        resp, body \u003d self.client.list_roles()"},{"line_number":67,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":68,"context_line":"        found \u003d [role for role in body if role[\u0027name\u0027] \u003d\u003d role_name]"},{"line_number":69,"context_line":"        self.assertTrue(any(found))"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_2cd8e6ee","line":67,"in_reply_to":"7adec928_ec5c3e28","updated":"2014-05-08 08:30:52.000000000","message":"Does that order really matter.\nIt is same as :\na \u003d\u003d b or b \u003d\u003d a","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.assertEqual(204, resp.status)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        resp, body \u003d self.client.list_roles()"},{"line_number":75,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":76,"context_line":"        found \u003d [role for role in body if role[\u0027name\u0027] \u003d\u003d role_name]"},{"line_number":77,"context_line":"        self.assertFalse(any(found))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_0c416a39","line":75,"updated":"2014-05-08 08:11:35.000000000","message":"same as above","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.assertEqual(204, resp.status)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        resp, body \u003d self.client.list_roles()"},{"line_number":75,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":76,"context_line":"        found \u003d [role for role in body if role[\u0027name\u0027] \u003d\u003d role_name]"},{"line_number":77,"context_line":"        self.assertFalse(any(found))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_8c957ae6","line":75,"in_reply_to":"7adec928_0c416a39","updated":"2014-05-08 08:30:52.000000000","message":"ditto","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":94,"context_line":"        self.client.assign_user_role(tenant[\u0027id\u0027], user[\u0027id\u0027], role[\u0027id\u0027])"},{"line_number":95,"context_line":"        resp, roles \u003d self.client.list_user_roles(tenant[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":96,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":97,"context_line":"        self.assert_role_in_role_list(role, roles)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @test.attr(type\u003d\u0027gate\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_ac795695","line":96,"updated":"2014-05-08 08:11:35.000000000","message":"same","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":94,"context_line":"        self.client.assign_user_role(tenant[\u0027id\u0027], user[\u0027id\u0027], role[\u0027id\u0027])"},{"line_number":95,"context_line":"        resp, roles \u003d self.client.list_user_roles(tenant[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":96,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":97,"context_line":"        self.assert_role_in_role_list(role, roles)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @test.attr(type\u003d\u0027gate\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_ac9a3612","line":96,"in_reply_to":"7adec928_ac795695","updated":"2014-05-08 08:30:52.000000000","message":"ditto","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":113,"context_line":"        self.client.assign_user_role(tenant[\u0027id\u0027], user[\u0027id\u0027], role[\u0027id\u0027])"},{"line_number":114,"context_line":"        resp, roles \u003d self.client.list_user_roles(tenant[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":115,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":116,"context_line":"        self.assert_role_in_role_list(role, roles)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_ec735eaf","line":115,"updated":"2014-05-08 08:11:35.000000000","message":"same","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":113,"context_line":"        self.client.assign_user_role(tenant[\u0027id\u0027], user[\u0027id\u0027], role[\u0027id\u0027])"},{"line_number":114,"context_line":"        resp, roles \u003d self.client.list_user_roles(tenant[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":115,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":116,"context_line":"        self.assert_role_in_role_list(role, roles)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_cc9f8202","line":115,"in_reply_to":"7adec928_ec735eaf","updated":"2014-05-08 08:30:52.000000000","message":"ditto","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"}],"tempest/api/identity/admin/test_roles_negative.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # Non-administrator user should not be authorized to"},{"line_number":162,"context_line":"        # remove a user\u0027s role"},{"line_number":163,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":164,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":165,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":166,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":167,"context_line":"        self.assertRaises(exceptions.Unauthorized,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_6c8d8e7b","line":164,"updated":"2014-05-08 08:11:35.000000000","message":"just replace with self.client.assign_user_role...... without taking any return value.","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # Non-administrator user should not be authorized to"},{"line_number":162,"context_line":"        # remove a user\u0027s role"},{"line_number":163,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":164,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":165,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":166,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":167,"context_line":"        self.assertRaises(exceptions.Unauthorized,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_4c9372fa","line":164,"in_reply_to":"7adec928_6c8d8e7b","updated":"2014-05-08 08:30:52.000000000","message":"Okie..Will do that....Thanks","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def test_remove_user_role_request_without_token(self):"},{"line_number":173,"context_line":"        # Request to remove a user\u0027s role without a valid token"},{"line_number":174,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":175,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":176,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":177,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":178,"context_line":"        token \u003d self.client.auth_provider.get_token()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_aceeb620","line":175,"updated":"2014-05-08 08:11:35.000000000","message":"same","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def test_remove_user_role_request_without_token(self):"},{"line_number":173,"context_line":"        # Request to remove a user\u0027s role without a valid token"},{"line_number":174,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":175,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":176,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":177,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":178,"context_line":"        token \u003d self.client.auth_provider.get_token()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_6c902eed","line":175,"in_reply_to":"7adec928_aceeb620","updated":"2014-05-08 08:30:52.000000000","message":"ditto","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    def test_remove_user_role_non_existent_role(self):"},{"line_number":187,"context_line":"        # Attempt to delete a non existent role from a user should fail"},{"line_number":188,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":189,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":190,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":191,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":192,"context_line":"        non_existent_role \u003d str(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_4c5532c5","line":189,"updated":"2014-05-08 08:11:35.000000000","message":"same","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    def test_remove_user_role_non_existent_role(self):"},{"line_number":187,"context_line":"        # Attempt to delete a non existent role from a user should fail"},{"line_number":188,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":189,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":190,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":191,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":192,"context_line":"        non_existent_role \u003d str(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_8cbc9a6e","line":189,"in_reply_to":"7adec928_4c5532c5","updated":"2014-05-08 08:30:52.000000000","message":"ditto","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def test_remove_user_role_non_existent_tenant(self):"},{"line_number":198,"context_line":"        # Attempt to remove a role from a non existent tenant should fail"},{"line_number":199,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":200,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":201,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":202,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":203,"context_line":"        non_existent_tenant \u003d str(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_ac6316b0","line":200,"updated":"2014-05-08 08:11:35.000000000","message":"same","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def test_remove_user_role_non_existent_tenant(self):"},{"line_number":198,"context_line":"        # Attempt to remove a role from a non existent tenant should fail"},{"line_number":199,"context_line":"        (user, tenant, role) \u003d self._get_role_params()"},{"line_number":200,"context_line":"        _, _ \u003d self.client.assign_user_role(tenant[\u0027id\u0027],"},{"line_number":201,"context_line":"                                            user[\u0027id\u0027],"},{"line_number":202,"context_line":"                                            role[\u0027id\u0027])"},{"line_number":203,"context_line":"        non_existent_tenant \u003d str(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_acc156e6","line":200,"in_reply_to":"7adec928_ac6316b0","updated":"2014-05-08 08:30:52.000000000","message":"ditto","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"}],"tempest/api/identity/admin/test_services.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bc005af22ddd0e26f8d19c11bdb770e4f4addf0b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.addCleanup(self._del_service, service_data[\u0027id\u0027])"},{"line_number":46,"context_line":"        self.assertEqual(200, resp.status)"},{"line_number":47,"context_line":"        # Verifying response body of create service"},{"line_number":48,"context_line":"        expected \u003d {\u0027name\u0027: name, \u0027type\u0027: type, \u0027description\u0027: description}"},{"line_number":49,"context_line":"        for key in [\u0027name\u0027, \u0027type\u0027, \u0027description\u0027]:"},{"line_number":50,"context_line":"            self.assertIn(key, service_data)"},{"line_number":51,"context_line":"            self.assertEqual(expected[key], service_data[key])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_0ce7aa13","line":48,"updated":"2014-05-08 08:11:35.000000000","message":"self.assertIn(\u0027id\u0027, service_data) is missed. add this may be as it is","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"a7a6b4cb31845eed131a1b6a6d2f62f8277ae56c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.addCleanup(self._del_service, service_data[\u0027id\u0027])"},{"line_number":46,"context_line":"        self.assertEqual(200, resp.status)"},{"line_number":47,"context_line":"        # Verifying response body of create service"},{"line_number":48,"context_line":"        expected \u003d {\u0027name\u0027: name, \u0027type\u0027: type, \u0027description\u0027: description}"},{"line_number":49,"context_line":"        for key in [\u0027name\u0027, \u0027type\u0027, \u0027description\u0027]:"},{"line_number":50,"context_line":"            self.assertIn(key, service_data)"},{"line_number":51,"context_line":"            self.assertEqual(expected[key], service_data[key])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_0cb08a8a","line":48,"in_reply_to":"7adec928_0ce7aa13","updated":"2014-05-08 08:30:52.000000000","message":"Okie...","commit_id":"cf5a4f6b2bc505fb1d5047e66bc252160de3f724"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"2571aede76dc28bb3968b698ba4659fe0461320a","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        expected \u003d {\u0027name\u0027: name, \u0027type\u0027: type}"},{"line_number":70,"context_line":"        for key, value in expected.iteritems():"},{"line_number":71,"context_line":"            self.assertIn(key, service)"},{"line_number":72,"context_line":"            self.assertEqual(value, service[key])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":75,"context_line":"    def test_list_services(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_404a5cad","line":72,"updated":"2014-05-21 07:32:16.000000000","message":"I can see that in test_create_get_delete_service and test_create_service_without_description there is checking with almost the same structure: checks assertIn and assertEqual in the loop. My suggestion is to create help method that will do it something like this\n\n    def check(expected, checked):\n         for key, value in expected.iteritems():\n              self.assertIn(key, checked)\n              self.assertEqual(value, checked[key])","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"d53b5deda2091c4844d0f0cf61e8b87a831dc072","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        expected \u003d {\u0027name\u0027: name, \u0027type\u0027: type}"},{"line_number":70,"context_line":"        for key, value in expected.iteritems():"},{"line_number":71,"context_line":"            self.assertIn(key, service)"},{"line_number":72,"context_line":"            self.assertEqual(value, service[key])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":75,"context_line":"    def test_list_services(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_46b51430","line":72,"in_reply_to":"7adec928_404a5cad","updated":"2014-05-21 08:13:42.000000000","message":"Okie..I will do that.\nThanks.","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cadd4108d1b42c0781353449f6c6aebe3793de7d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertRaises(exceptions.NotFound, self.client.get_service,"},{"line_number":33,"context_line":"                          service_id)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _check(self, expected, actual, keys):"},{"line_number":36,"context_line":"        for key in keys:"},{"line_number":37,"context_line":"            self.assertIn(key, actual)"},{"line_number":38,"context_line":"            self.assertEqual(expected[key], actual[key])"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adec928_9a78302d","line":35,"updated":"2014-05-22 08:43:24.000000000","message":"Please move this function to \"BaseIdentityAdminTest\" so that it can be shared among others.","commit_id":"8d601c30a0ffd7305b84380fbaab6706a435db2c"}],"tempest/api/identity/admin/test_tokens.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"2571aede76dc28bb3968b698ba4659fe0461320a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.assertEqual(token_id, token_details[\u0027token\u0027][\u0027id\u0027])"},{"line_number":51,"context_line":"        self.assertEqual(user[\u0027id\u0027], token_details[\u0027user\u0027][\u0027id\u0027])"},{"line_number":52,"context_line":"        self.assertEqual(user_name, token_details[\u0027user\u0027][\u0027name\u0027])"},{"line_number":53,"context_line":"        self.assertEqual(tenant[\u0027name\u0027],"},{"line_number":54,"context_line":"                         token_details[\u0027token\u0027][\u0027tenant\u0027][\u0027name\u0027])"},{"line_number":55,"context_line":"        # then delete the token"},{"line_number":56,"context_line":"        resp, body \u003d self.client.delete_token(token_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_0085b4ac","line":53,"updated":"2014-05-21 07:32:16.000000000","message":"Why don\u0027t you also optimize this lines 49-53?","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"d53b5deda2091c4844d0f0cf61e8b87a831dc072","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.assertEqual(token_id, token_details[\u0027token\u0027][\u0027id\u0027])"},{"line_number":51,"context_line":"        self.assertEqual(user[\u0027id\u0027], token_details[\u0027user\u0027][\u0027id\u0027])"},{"line_number":52,"context_line":"        self.assertEqual(user_name, token_details[\u0027user\u0027][\u0027name\u0027])"},{"line_number":53,"context_line":"        self.assertEqual(tenant[\u0027name\u0027],"},{"line_number":54,"context_line":"                         token_details[\u0027token\u0027][\u0027tenant\u0027][\u0027name\u0027])"},{"line_number":55,"context_line":"        # then delete the token"},{"line_number":56,"context_line":"        resp, body \u003d self.client.delete_token(token_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_0664ece3","line":53,"in_reply_to":"7adec928_0085b4ac","updated":"2014-05-21 08:13:42.000000000","message":"I don\u0027t see much optimization here.\nonly Lines : 51 and 52 : can be optimized as they follow similar format.\nNot sure about lines : 50, 53\nMay be you can suggest something.\nThank You.","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"1e66bf6bdb3a9798ad0cf7373f05d89345c08d23","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.assertEqual(token_id, token_details[\u0027token\u0027][\u0027id\u0027])"},{"line_number":51,"context_line":"        self.assertEqual(user[\u0027id\u0027], token_details[\u0027user\u0027][\u0027id\u0027])"},{"line_number":52,"context_line":"        self.assertEqual(user_name, token_details[\u0027user\u0027][\u0027name\u0027])"},{"line_number":53,"context_line":"        self.assertEqual(tenant[\u0027name\u0027],"},{"line_number":54,"context_line":"                         token_details[\u0027token\u0027][\u0027tenant\u0027][\u0027name\u0027])"},{"line_number":55,"context_line":"        # then delete the token"},{"line_number":56,"context_line":"        resp, body \u003d self.client.delete_token(token_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_615d9aec","line":53,"in_reply_to":"7adec928_0664ece3","updated":"2014-05-21 08:51:01.000000000","message":"May be it reliable to do make list and then iterate over them:\n\n   l \u003d [(token_id, token_details[\u0027token\u0027][\u0027id\u0027]), (user[\u0027id\u0027],  token_details[\u0027user\u0027][\u0027id\u0027]),\n         (user_name, token_details[\u0027user\u0027][\u0027name\u0027]), tenant[\u0027name\u0027], \n          token_details[\u0027token\u0027][\u0027tenant\u0027][\u0027name\u0027])]\n   for (actual, expected) in l:\n        self.assertEqual(actual, expected)\n\nBut yes, I see there is no mush optimization here. So this could be leave as it is now.","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"}],"tempest/api/identity/admin/test_users.py":[{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"111a05bcea212c75237debe45aa9289a44d030bd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.data.users.append(user)"},{"line_number":54,"context_line":"        self.assertEqual(\u0027200\u0027, resp[\u0027status\u0027])"},{"line_number":55,"context_line":"        for key in [\u0027name\u0027, \u0027email\u0027, \u0027enabled\u0027]:"},{"line_number":56,"context_line":"            self.assertEqual(expected[key], str(user[key]).lower())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":59,"context_line":"    def test_update_user(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_5f0b3a7c","line":56,"updated":"2014-05-20 11:23:28.000000000","message":"Case-insensitive compare is just a hack due to xml/json confusion around booleans I think. It should only be used for enabled as in the original version of this code.","commit_id":"ec73a4aad09d774de0dc4281b911ee5fa0fb2c55"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"01da3647269d75ff895e7330c93f9583b9ddd322","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.data.users.append(user)"},{"line_number":54,"context_line":"        self.assertEqual(\u0027200\u0027, resp[\u0027status\u0027])"},{"line_number":55,"context_line":"        for key in [\u0027name\u0027, \u0027email\u0027, \u0027enabled\u0027]:"},{"line_number":56,"context_line":"            self.assertEqual(expected[key], str(user[key]).lower())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":59,"context_line":"    def test_update_user(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_acaa4183","line":56,"in_reply_to":"7adec928_5f0b3a7c","updated":"2014-05-21 03:12:33.000000000","message":"Done","commit_id":"ec73a4aad09d774de0dc4281b911ee5fa0fb2c55"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"2571aede76dc28bb3968b698ba4659fe0461320a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        resp, updated_user \u003d self.client.get_user(user[\u0027id\u0027])"},{"line_number":83,"context_line":"        # Assert response body of GET after updating"},{"line_number":84,"context_line":"        for key, value in user2.iteritems():"},{"line_number":85,"context_line":"            self.assertEqual(value, updated_user[key])"},{"line_number":86,"context_line":"        self.assertEqual(\u0027false\u0027, str(updated_user[\u0027enabled\u0027]).lower())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_5bfed106","line":85,"updated":"2014-05-21 07:32:16.000000000","message":"Also suggest to make help function.\n\n     def check(name, email, user):\n         expected \u003d {\u0027name\u0027: name, \u0027user\u0027:user}\n         for key, value in expected.iteritems():\n               self.assertEqual(value, user[key])","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"},{"author":{"_account_id":10966,"name":"Abhijeet Jain","email":"abhijeetjpjain@gmail.com","username":"Abhijeet.Jain"},"change_message_id":"d53b5deda2091c4844d0f0cf61e8b87a831dc072","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        resp, updated_user \u003d self.client.get_user(user[\u0027id\u0027])"},{"line_number":83,"context_line":"        # Assert response body of GET after updating"},{"line_number":84,"context_line":"        for key, value in user2.iteritems():"},{"line_number":85,"context_line":"            self.assertEqual(value, updated_user[key])"},{"line_number":86,"context_line":"        self.assertEqual(\u0027false\u0027, str(updated_user[\u0027enabled\u0027]).lower())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_66cf70b4","line":85,"in_reply_to":"7adec928_5bfed106","updated":"2014-05-21 08:13:42.000000000","message":"would that be good to create such function juts for checking the response.\nJust Confirming.","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"1e66bf6bdb3a9798ad0cf7373f05d89345c08d23","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        resp, updated_user \u003d self.client.get_user(user[\u0027id\u0027])"},{"line_number":83,"context_line":"        # Assert response body of GET after updating"},{"line_number":84,"context_line":"        for key, value in user2.iteritems():"},{"line_number":85,"context_line":"            self.assertEqual(value, updated_user[key])"},{"line_number":86,"context_line":"        self.assertEqual(\u0027false\u0027, str(updated_user[\u0027enabled\u0027]).lower())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_6694d0e8","line":85,"in_reply_to":"7adec928_66cf70b4","updated":"2014-05-21 08:51:01.000000000","message":"i\u0027m not clear understand what you asking about.","commit_id":"ed8871f6d6fc6536d7d9234c1164f7b9ad425b90"}],"tempest/test.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"3d20d8216c682907c7949cdff88e9d5d2373620d","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    def assertNotEmpty(self, list, msg\u003dNone):"},{"line_number":376,"context_line":"        self.assertTrue(len(list) \u003e 0, msg)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def _check_equal(self, expected, actual, keys):"},{"line_number":379,"context_line":"        \"\"\""},{"line_number":380,"context_line":"        This function checks whether the value of expected is equal"},{"line_number":381,"context_line":"        to the actual for all the keys provided."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_cfa0d192","line":378,"updated":"2014-06-11 20:44:17.000000000","message":"_check_equal is not used in this class, so it would be better to use a name not starting with \"_\" and a bit more descriptive about what it\u0027s being checked. \n\nassertDictMatchOnKeys?\n\nAlso the parameter names are a bit confusing for me because expected is not in fact what is expected, only a subset of it indicated by keys.","commit_id":"88cf45af55c81c8a3252e14a1bf3f01aa9a04400"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"3d20d8216c682907c7949cdff88e9d5d2373620d","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        @param actual : the actual response"},{"line_number":384,"context_line":"        @param keys : list of keys to validate response"},{"line_number":385,"context_line":"        \"\"\""},{"line_number":386,"context_line":"        for key in keys:"},{"line_number":387,"context_line":"            self.assertIn(key, actual)"},{"line_number":388,"context_line":"            self.assertEqual(expected[key], actual[key])"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_ef72ed48","line":386,"updated":"2014-06-11 20:44:17.000000000","message":"This does not work well if not all keys are in expected.\n\nWhat about something like this:\n\nfiltered_expected \u003d dict((k, v) for (k, v) in expected.iteritems() if k in keys) \n\nfiltered_actual \u003d dict((k, v) for (k, v) in \nactual.iteritems() if k in keys) \n\nassertEqual(filter_expected, filtered_actual)","commit_id":"88cf45af55c81c8a3252e14a1bf3f01aa9a04400"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"3d20d8216c682907c7949cdff88e9d5d2373620d","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        This function validates if all the provided keys are present"},{"line_number":393,"context_line":"        in the given dictionary"},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        for key in keys:"},{"line_number":396,"context_line":"            self.assertIn(key, dict)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_6fa89d8c","line":395,"updated":"2014-06-11 20:44:17.000000000","message":"You could also \n\nassertTrue(all(x in dict.keys() for x in keys))","commit_id":"88cf45af55c81c8a3252e14a1bf3f01aa9a04400"}]}
