)]}'
{"etc/mapping_engine_test_rules.json":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"299b2e9dfd719a58f7b3b30ff691bf22f95db04f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3f79a3b5_e3192023","line":30,"updated":"2018-09-27 08:51:48.000000000","message":"no, do not add file here. See keystone.tests.unit.mapping_fixtures.py for example.","commit_id":"492711d9ad54239fe18226dca4ae13bd37845c9b"}],"keystone/cmd/cli.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"f796661d473dc2a3bd60f5b8be543426a9ce5d5a","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        assertion_dict \u003d {}"},{"line_number":1051,"context_line":"        prefix \u003d CONF.command.prefix"},{"line_number":1052,"context_line":"        for line_num, line in enumerate(assertion, 1):"},{"line_number":1053,"context_line":"            line \u003d str(line.strip())"},{"line_number":1054,"context_line":"            if line \u003d\u003d \u0027\u0027:"},{"line_number":1055,"context_line":"                continue"},{"line_number":1056,"context_line":"            k, v \u003d split(line, line_num)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_d89ad86d","line":1053,"range":{"start_line":1053,"start_character":19,"end_line":1053,"end_character":22},"updated":"2018-09-27 01:33:13.000000000","message":"why this? I assume \"line\" here is string already?","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"59aee11855ad9506c41cadfa4f78c60434b1f3c1","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        assertion_dict \u003d {}"},{"line_number":1051,"context_line":"        prefix \u003d CONF.command.prefix"},{"line_number":1052,"context_line":"        for line_num, line in enumerate(assertion, 1):"},{"line_number":1053,"context_line":"            line \u003d str(line.strip())"},{"line_number":1054,"context_line":"            if line \u003d\u003d \u0027\u0027:"},{"line_number":1055,"context_line":"                continue"},{"line_number":1056,"context_line":"            k, v \u003d split(line, line_num)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_a3148842","line":1053,"range":{"start_line":1053,"start_character":19,"end_line":1053,"end_character":22},"in_reply_to":"3f79a3b5_d89ad86d","updated":"2018-09-27 08:38:12.000000000","message":"Done","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ee73a7c389bf315e7373a5a6a08c44e9690f0989","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"        try:"},{"line_number":1022,"context_line":"            with open(path, \"rb\") as file:"},{"line_number":1023,"context_line":"                self.rules \u003d jsonutils.load(file)"},{"line_number":1024,"context_line":"        except ValueError as e:"},{"line_number":1025,"context_line":"            raise SystemExit(_(\u0027Error while parsing rules \u0027"},{"line_number":1026,"context_line":"                               \u0027%(path)s: %(err)s\u0027) % {\u0027path\u0027: path, \u0027err\u0027: e})"},{"line_number":1027,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_441233ff","line":1024,"updated":"2018-09-28 19:47:13.000000000","message":"It doesn\u0027t look like this is tested, but we should be able to with some invalid input, which is something we can do in a follow on.","commit_id":"94e6b284110d1263da6d9c7ff9eb1ea4b1c835eb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ee73a7c389bf315e7373a5a6a08c44e9690f0989","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"        try:"},{"line_number":1031,"context_line":"            with open(path) as file:"},{"line_number":1032,"context_line":"                self.assertion \u003d file.read().strip()"},{"line_number":1033,"context_line":"        except IOError as e:"},{"line_number":1034,"context_line":"            raise SystemExit(_(\"Error while opening file \""},{"line_number":1035,"context_line":"                               \"%(path)s: %(err)s\") % {\u0027path\u0027: path, \u0027err\u0027: e})"},{"line_number":1036,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_84e12bff","line":1033,"updated":"2018-09-28 19:47:13.000000000","message":"We should be able to test this with a mock to simulate a system issue opening the file. Or we could try and trigger this exception using a file that doesn\u0027t exist.","commit_id":"94e6b284110d1263da6d9c7ff9eb1ea4b1c835eb"}],"keystone/tests/unit/test_cli.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7f1b73e1ea7aa66671b294019cf6a93dfacff76a","unresolved":false,"context_lines":[{"line_number":1718,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_sql.conf\u0027))"},{"line_number":1719,"context_line":"        return config_files"},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"    def test_mapping_engine_tester(self):"},{"line_number":1722,"context_line":"        fd_dir \u003d self.useFixture(fixtures.TempDir())"},{"line_number":1723,"context_line":"        fd_file \u003d os.path.join(fd_dir.path, \u0027sample.json\u0027)"},{"line_number":1724,"context_line":"        with open(fd_file, \u0027w\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_f7948fe9","line":1721,"updated":"2018-09-26 13:49:07.000000000","message":"You should have at least 2 sets pof tests:  positive tests and negative tests.  THe positive test should run through valid inputs and make sure they are accepted.  The Negative tests ensure invalid inputs are rejected.  Assert on the return codes.","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"f796661d473dc2a3bd60f5b8be543426a9ce5d5a","unresolved":false,"context_lines":[{"line_number":1718,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_sql.conf\u0027))"},{"line_number":1719,"context_line":"        return config_files"},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"    def test_mapping_engine_tester(self):"},{"line_number":1722,"context_line":"        fd_dir \u003d self.useFixture(fixtures.TempDir())"},{"line_number":1723,"context_line":"        fd_file \u003d os.path.join(fd_dir.path, \u0027sample.json\u0027)"},{"line_number":1724,"context_line":"        with open(fd_file, \u0027w\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_58d9e853","line":1721,"in_reply_to":"3f79a3b5_f7948fe9","updated":"2018-09-27 01:33:13.000000000","message":"++","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"59aee11855ad9506c41cadfa4f78c60434b1f3c1","unresolved":false,"context_lines":[{"line_number":1718,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_sql.conf\u0027))"},{"line_number":1719,"context_line":"        return config_files"},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":"    def test_mapping_engine_tester(self):"},{"line_number":1722,"context_line":"        fd_dir \u003d self.useFixture(fixtures.TempDir())"},{"line_number":1723,"context_line":"        fd_file \u003d os.path.join(fd_dir.path, \u0027sample.json\u0027)"},{"line_number":1724,"context_line":"        with open(fd_file, \u0027w\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_e0059616","line":1721,"in_reply_to":"3f79a3b5_f7948fe9","updated":"2018-09-27 08:38:12.000000000","message":"Added the negative test too. As the engine raises validation error on wrong input, I am a little confused about return codes.","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7f1b73e1ea7aa66671b294019cf6a93dfacff76a","unresolved":false,"context_lines":[{"line_number":1723,"context_line":"        fd_file \u003d os.path.join(fd_dir.path, \u0027sample.json\u0027)"},{"line_number":1724,"context_line":"        with open(fd_file, \u0027w\u0027) as f:"},{"line_number":1725,"context_line":"            f.write(jsonutils.dumps("},{"line_number":1726,"context_line":"                {"},{"line_number":1727,"context_line":"                    \"rules\": ["},{"line_number":1728,"context_line":"                        {"},{"line_number":1729,"context_line":"                            \u0027local\u0027: ["}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_97ae7b7f","line":1726,"updated":"2018-09-26 13:49:07.000000000","message":"See if you can add the file to the fixtures instead of generating the file here. Look at how the other tests (like policy) get their data files.","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"59aee11855ad9506c41cadfa4f78c60434b1f3c1","unresolved":false,"context_lines":[{"line_number":1723,"context_line":"        fd_file \u003d os.path.join(fd_dir.path, \u0027sample.json\u0027)"},{"line_number":1724,"context_line":"        with open(fd_file, \u0027w\u0027) as f:"},{"line_number":1725,"context_line":"            f.write(jsonutils.dumps("},{"line_number":1726,"context_line":"                {"},{"line_number":1727,"context_line":"                    \"rules\": ["},{"line_number":1728,"context_line":"                        {"},{"line_number":1729,"context_line":"                            \u0027local\u0027: ["}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_03069c1d","line":1726,"in_reply_to":"3f79a3b5_97ae7b7f","updated":"2018-09-27 08:38:12.000000000","message":"Done","commit_id":"949684544091aa77f3e56db7a3abcc93976b4ee2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ee73a7c389bf315e7373a5a6a08c44e9690f0989","unresolved":false,"context_lines":[{"line_number":1710,"context_line":"        self.useFixture(database.Database())"},{"line_number":1711,"context_line":"        self.config_fixture \u003d self.useFixture(oslo_config.fixture.Config(CONF))"},{"line_number":1712,"context_line":"        self.config_fixture.register_cli_opt(cli.command_opt)"},{"line_number":1713,"context_line":"        # For unit tests that should not throw any erorrs,"},{"line_number":1714,"context_line":"        # Use the argument parser to test that the combinations work"},{"line_number":1715,"context_line":"        parser_test \u003d argparse.ArgumentParser()"},{"line_number":1716,"context_line":"        subparsers \u003d parser_test.add_subparsers()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_8e6e2c94","line":1713,"range":{"start_line":1713,"start_character":51,"end_line":1713,"end_character":57},"updated":"2018-09-28 19:47:13.000000000","message":"For a followup: errors*","commit_id":"94e6b284110d1263da6d9c7ff9eb1ea4b1c835eb"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"6c53d913dee23043381742de057204a52997bb49","unresolved":false,"context_lines":[{"line_number":1742,"context_line":"        self.useFixture(fixtures.MockPatchObject("},{"line_number":1743,"context_line":"            CONF, \u0027command\u0027, self.FakeConfCommand(self)))"},{"line_number":1744,"context_line":"        mapping_engine \u003d cli.MappingEngineTester()"},{"line_number":1745,"context_line":"        mapping_engine.main()"},{"line_number":1746,"context_line":""},{"line_number":1747,"context_line":"    def test_mapping_engine_tester_with_invalid_data(self):"},{"line_number":1748,"context_line":"        tempfilejson \u003d self.useFixture(temporaryfile.SecureTempFile())"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_b237d7fe","line":1745,"updated":"2018-09-28 08:02:56.000000000","message":"Would be nice to check not just that it doesn\u0027t explode but also that it produces the right value, for example checking that the right group ID is in the output.","commit_id":"94e6b284110d1263da6d9c7ff9eb1ea4b1c835eb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ee73a7c389bf315e7373a5a6a08c44e9690f0989","unresolved":false,"context_lines":[{"line_number":1742,"context_line":"        self.useFixture(fixtures.MockPatchObject("},{"line_number":1743,"context_line":"            CONF, \u0027command\u0027, self.FakeConfCommand(self)))"},{"line_number":1744,"context_line":"        mapping_engine \u003d cli.MappingEngineTester()"},{"line_number":1745,"context_line":"        mapping_engine.main()"},{"line_number":1746,"context_line":""},{"line_number":1747,"context_line":"    def test_mapping_engine_tester_with_invalid_data(self):"},{"line_number":1748,"context_line":"        tempfilejson \u003d self.useFixture(temporaryfile.SecureTempFile())"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_64396fd6","line":1745,"in_reply_to":"3f79a3b5_b237d7fe","updated":"2018-09-28 19:47:13.000000000","message":"++","commit_id":"94e6b284110d1263da6d9c7ff9eb1ea4b1c835eb"}]}
