)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"bfe3358dfeb3da9d7f552fe259d3c344e362c9c0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Though users can belong to multiple projects, making users"},{"line_number":10,"context_line":"multi-tenant is not considered advisable. This test checks"},{"line_number":11,"context_line":"to make sure that:"},{"line_number":12,"context_line":"1) the user belongs to only one project"},{"line_number":13,"context_line":"2) the name of the user\u0027s project is the same as that stored"},{"line_number":14,"context_line":"   as part of the user\u0027s credentials."},{"line_number":15,"context_line":"Change-Id: I4db28a22148ff16590f296d68a22d13a2353de46"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"7f515b1d_72025371","line":12,"range":{"start_line":12,"start_character":3,"end_line":12,"end_character":39},"updated":"2017-09-28 17:22:11.000000000","message":"This is not clear to me. Even though is may be bad practice to add a use to multiple projects, the API does not prevent it, so I\u0027m not sure what this test verifies.","commit_id":"305315a7fb08f81d588ee3b66cdca85f732e1f5c"}],"tempest/api/identity/admin/v3/test_list_projects.py":[{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"04560ea9fd868bbb31cbd7f1565c24db0c1e2063","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _list_projects_with_params(self, params, key):"},{"line_number":95,"context_line":"        body \u003d self.projects_client.list_projects(params)[\u0027projects\u0027]"},{"line_number":96,"context_line":"        print(\u0027body: \u0027)"},{"line_number":97,"context_line":"        print(body)"},{"line_number":98,"context_line":"        self.assertIn(self.p1[key], map(lambda x: x[key], body))"},{"line_number":99,"context_line":"        print(\u0027p1[key]: \u0027)"},{"line_number":100,"context_line":"        print(self.p1[key])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_9c342a4c","line":97,"range":{"start_line":96,"start_character":0,"end_line":97,"end_character":19},"updated":"2017-09-05 06:39:32.000000000","message":"do not use print. in fact rest_client will log request and response body.","commit_id":"f953f7c9d13ea2d387241085776e7a386e70804a"},{"author":{"_account_id":24728,"name":"megan guiney","email":"meganmguiney@gmail.com","username":"mguiney"},"change_message_id":"3ad7b3ffb078f3c5402211c03b7b82b4951f12ea","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _list_projects_with_params(self, params, key):"},{"line_number":95,"context_line":"        body \u003d self.projects_client.list_projects(params)[\u0027projects\u0027]"},{"line_number":96,"context_line":"        print(\u0027body: \u0027)"},{"line_number":97,"context_line":"        print(body)"},{"line_number":98,"context_line":"        self.assertIn(self.p1[key], map(lambda x: x[key], body))"},{"line_number":99,"context_line":"        print(\u0027p1[key]: \u0027)"},{"line_number":100,"context_line":"        print(self.p1[key])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_92565106","line":97,"range":{"start_line":96,"start_character":0,"end_line":97,"end_character":19},"in_reply_to":"7f287b81_9c342a4c","updated":"2017-09-05 08:01:30.000000000","message":"those were not meant to be left in. I was doing some comparisons between the results yielded from the two different tests, as the new one uses a different client, and left that in. apologies","commit_id":"f953f7c9d13ea2d387241085776e7a386e70804a"}],"tempest/api/identity/v3/test_projects.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"9cc40dd599f613fd4b32d7d834aac864845f4edf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self._list_projects_with_params("},{"line_number":67,"context_line":"            {\u0027name\u0027: self.primary_project_name}, \u0027name\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _list_projects_with_params(self, params, key):"},{"line_number":70,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":71,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":72,"context_line":"        self.assertIn(self.primary_project_name, map(lambda x: x[key], body))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_8aca7c6b","line":69,"updated":"2017-09-06 03:04:32.000000000","message":"My preference is move this inline (not defining a helper) in this case. If we will need this helper, we\u0027ll be able to do it in the future.","commit_id":"f953f7c9d13ea2d387241085776e7a386e70804a"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"04560ea9fd868bbb31cbd7f1565c24db0c1e2063","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self._list_projects_with_params("},{"line_number":67,"context_line":"            {\u0027name\u0027: self.primary_project_name}, \u0027name\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _list_projects_with_params(self, params, key):"},{"line_number":70,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":71,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":72,"context_line":"        self.assertIn(self.primary_project_name, map(lambda x: x[key], body))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_7c029e71","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":34},"updated":"2017-09-05 06:39:32.000000000","message":"no need to define a helper that is used only once","commit_id":"f953f7c9d13ea2d387241085776e7a386e70804a"},{"author":{"_account_id":24728,"name":"megan guiney","email":"meganmguiney@gmail.com","username":"mguiney"},"change_message_id":"3ad7b3ffb078f3c5402211c03b7b82b4951f12ea","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self._list_projects_with_params("},{"line_number":67,"context_line":"            {\u0027name\u0027: self.primary_project_name}, \u0027name\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _list_projects_with_params(self, params, key):"},{"line_number":70,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":71,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":72,"context_line":"        self.assertIn(self.primary_project_name, map(lambda x: x[key], body))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_725c05ed","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":34},"in_reply_to":"7f287b81_7c029e71","updated":"2017-09-05 08:01:30.000000000","message":"My reasoning for creating the generalized helper function was that doing so leaves the door open for possible future tests. i can, of course, change it, but what are your thoughts, given that context, on leaving the generalized version general?","commit_id":"f953f7c9d13ea2d387241085776e7a386e70804a"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"c1c233df76cc801dd2d79753d82829951206609e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    @classmethod"},{"line_number":26,"context_line":"    def resource_setup(cls):"},{"line_number":27,"context_line":"        cls.primary_project_name \u003d cls.os_primary.credentials.project_name"},{"line_number":28,"context_line":"        cls.alt_project_name \u003d cls.os_alt.credentials.project_name"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @decorators.idempotent_id(\u002786128d46-e170-4644-866a-cc487f699e1d\u0027)"},{"line_number":31,"context_line":"    def test_list_projects_returns_only_authorized_projects(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f287b81_e03d9fdd","line":28,"updated":"2017-09-06 05:38:14.000000000","message":"I feel we don\u0027t need to use these class variables, we can use os_primary.credentials.project_name and os_alt.credentials.project_name directly. They are a bit long names, though.","commit_id":"306f2679e46a918418b97a208296149cf1233f9a"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"b542cc9dd67c9844352d543dcee81851aa66e283","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            project_domain_id\u003dproject[\u0027domain_id\u0027])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @decorators.idempotent_id(\u0027caaed452-653a-4efe-ad86-279a4e11b4e9\u0027)"},{"line_number":62,"context_line":"    def test_list_projects_with_name(self):"},{"line_number":63,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":64,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":65,"context_line":"        conf_projects \u003d self.os_primary.credentials.project_name.split()"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff5d4b2f_53c26eeb","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":36},"updated":"2017-09-19 06:56:06.000000000","message":"the testcase name seems not very accurate","commit_id":"03bfca71e5cb4fc45d876ea282f2ffeaaab15dea"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"b542cc9dd67c9844352d543dcee81851aa66e283","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def test_list_projects_with_name(self):"},{"line_number":63,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":64,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":65,"context_line":"        conf_projects \u003d self.os_primary.credentials.project_name.split()"},{"line_number":66,"context_line":"        user_projects \u003d map(lambda x: x[\u0027name\u0027], body)"},{"line_number":67,"context_line":"        self.assertEqual(len(conf_projects), len(user_projects))"},{"line_number":68,"context_line":"        self.assertItemsEqual(conf_projects, user_projects)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff5d4b2f_b3aaca16","line":65,"range":{"start_line":65,"start_character":24,"end_line":65,"end_character":72},"updated":"2017-09-19 06:56:06.000000000","message":"this seems weird, the split() is only to change \u0027demo\u0027 to [\u0027demo\u0027]","commit_id":"03bfca71e5cb4fc45d876ea282f2ffeaaab15dea"},{"author":{"_account_id":24728,"name":"megan guiney","email":"meganmguiney@gmail.com","username":"mguiney"},"change_message_id":"ef1227398f6ad81a257bc653e74a095afbfabcd9","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def test_list_projects_with_name(self):"},{"line_number":63,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":64,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":65,"context_line":"        conf_projects \u003d self.os_primary.credentials.project_name.split()"},{"line_number":66,"context_line":"        user_projects \u003d map(lambda x: x[\u0027name\u0027], body)"},{"line_number":67,"context_line":"        self.assertEqual(len(conf_projects), len(user_projects))"},{"line_number":68,"context_line":"        self.assertItemsEqual(conf_projects, user_projects)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff5d4b2f_dfd2ce34","line":65,"range":{"start_line":65,"start_character":24,"end_line":65,"end_character":72},"in_reply_to":"ff5d4b2f_b3aaca16","updated":"2017-09-19 21:19:01.000000000","message":"the \"split\" is to handle test cases in which a user belongs to more than one project, which, to my understanding, is possible, if not necessarily recommended. All of the test cases I came across","commit_id":"03bfca71e5cb4fc45d876ea282f2ffeaaab15dea"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"b542cc9dd67c9844352d543dcee81851aa66e283","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":65,"context_line":"        conf_projects \u003d self.os_primary.credentials.project_name.split()"},{"line_number":66,"context_line":"        user_projects \u003d map(lambda x: x[\u0027name\u0027], body)"},{"line_number":67,"context_line":"        self.assertEqual(len(conf_projects), len(user_projects))"},{"line_number":68,"context_line":"        self.assertItemsEqual(conf_projects, user_projects)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff5d4b2f_d35bfe51","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":59},"updated":"2017-09-19 06:56:06.000000000","message":"will this always be true if we use pre-previsoned credentials?","commit_id":"03bfca71e5cb4fc45d876ea282f2ffeaaab15dea"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"afc674d56970d2fd2f41a746df0a7d29d5bdb779","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from tempest.api.identity import base"},{"line_number":18,"context_line":"from tempest.lib import decorators"},{"line_number":19,"context_line":"from tempest.lib import exceptions as lib_exc"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f5c4f37_d0909251","line":16,"updated":"2017-09-21 01:41:41.000000000","message":"nit: The addition of this newline seems unnecessary.","commit_id":"a91e90ce65e0d9f965a5c05f2ce3b32c805e8194"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"afc674d56970d2fd2f41a746df0a7d29d5bdb779","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def test_single_tenant_user_list_projects(self):"},{"line_number":64,"context_line":"        body \u003d self.non_admin_users_client.list_user_projects("},{"line_number":65,"context_line":"            self.os_primary.credentials.user_id)[\u0027projects\u0027]"},{"line_number":66,"context_line":"        conf_project \u003d self.os_primary.credentials.project_name"},{"line_number":67,"context_line":"        user_projects \u003d list(map(lambda x: x[\u0027name\u0027], body))"},{"line_number":68,"context_line":"        self.assertEqual(1, len(user_projects))"},{"line_number":69,"context_line":"        self.assertItemsEqual(conf_project, user_projects[0])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f5c4f37_d09e5253","line":66,"updated":"2017-09-21 01:41:41.000000000","message":"nit: This isn\u0027t necessarily a \"conf_project\", maybe `primary_project` or something is more descriptive.","commit_id":"a91e90ce65e0d9f965a5c05f2ce3b32c805e8194"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"afc674d56970d2fd2f41a746df0a7d29d5bdb779","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        conf_project \u003d self.os_primary.credentials.project_name"},{"line_number":67,"context_line":"        user_projects \u003d list(map(lambda x: x[\u0027name\u0027], body))"},{"line_number":68,"context_line":"        self.assertEqual(1, len(user_projects))"},{"line_number":69,"context_line":"        self.assertItemsEqual(conf_project, user_projects[0])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f5c4f37_30836e07","line":69,"updated":"2017-09-21 01:41:41.000000000","message":"Usually I see something like:\n\n    self.assertIn(conf_project, user_projects)\n\nfor this kind of assert.","commit_id":"a91e90ce65e0d9f965a5c05f2ce3b32c805e8194"}]}
