import unittest import sys import JsonDiffTool """ Unit tests for the Json Diff Tool library Updated: 2017-04-24 """ __author__ = "Diego Granados" __copyright__ = "Copyright(c) 2017, Ericsson." __license__ = "New-style BSD" __email__ = "diego.jesus.granados.lopez@ericsson.com" class PathConversionTest(unittest.TestCase): """ Conversions from jsonpath paths to jsonpatch patches used to remove the element pointed by the path """ def testArrayElementConversion(self): self.assertEquals( '[{"op":"remove","path":"/ietf-yang-library:modules-state/module/56"}]', JsonDiffTool.from_path_to_jsonpatch( "/ietf-yang-library:modules-state/module/56" ), "Array element conversion failed!", ) def testMapValueElementConversion(self): self.assertEquals( '[{"op":"remove","path":"/ietf-yang-library:modules-state/module/blablah"}]', JsonDiffTool.from_path_to_jsonpatch( "/ietf-yang-library:modules-state/module/blablah" ), "Array element conversion failed!", ) class JsonDiffToolTest(unittest.TestCase): """ Tests for the tool itself, including both command-line and RIDE keyword invokation style """ def testSimpleDifferenceCountingWithoutFiltering(self): """ Identical documents """ self.assertEquals( 0, JsonDiffTool.Json_Diff_Check_Keyword( "testinput/arrayTwoNames.json", "testinput/arrayTwoNamesCopy.json", "", "", ), "failed! (expected 0 differences)", ) def testEqualFilesWithScrambledArrayOrder(self): """ This is moving an array element from one position to other. RFC 6902 describes this as "moving a value", but this jsonpatch implementation constructs a patch using remove + add. Acceptable though """ self.assertEquals( 2, JsonDiffTool.Json_Diff_Check_Keyword( "testinput/arrayTwoNames.json", "testinput/arrayTwoNamesReversed.json", "", "", ), "failed! (expected 2 differences)", ) def testEqualFilesWithChangedAttributeOrder(self): """ Attributes in different order. It's not a difference """ self.assertEquals( 0, JsonDiffTool.Json_Diff_Check_Keyword( "testinput/setTwoNames.json", "testinput/setTwoNamesReversed.json", "", "", ), "failed! (expected 0 differences)", ) def testSimpleDifferenceSecondFileWithExtraAttrib(self): self.assertEquals( 1, JsonDiffTool.Json_Diff_Check_Keyword( "testinput/setTwoNames.json", "testinput/setTwoNamesExtraAttrib.json", "", "", ), "failed! (expected 1 differences)", ) def testSimpleDifferenceCountingWithoutFiltering(self): """ Example coming from a true daexim export. No prefilters used """ input_argv = [ "-i", "testinput/mainTestCase/odl_backup_operational_before.json", "-f", "testinput/mainTestCase/odl_backup_operational_after.json", ] sys.argv[1:] = input_argv self.assertEquals( 16, JsonDiffTool.Json_Diff_Check(), "main failed! expected 16 differences, result was: " + str(JsonDiffTool.Json_Diff_Check()), ) def testSimpleDifferenceCountingUsingSingleMatchingBeforeFilter(self): """ Using a prefilter for the initial file The prefilter contains one expression only """ input_argv = [ "-i", "testinput/mainTestCase/odl_backup_operational_before.json", "-f", "testinput/mainTestCase/odl_backup_operational_after.json", "-ipf", "testinput/mainTestCase/json_prefilter.conf", "-v", ] sys.argv[1:] = input_argv self.assertEquals( 15, JsonDiffTool.Json_Diff_Check(), "main failed! expected 15 differences, result was: " + str(JsonDiffTool.Json_Diff_Check()), ) def testSimpleDifferenceCountingUsingMatchingBeforeFilterMatchingTwoEntries(self): """ Using a prefilter for the initial file The prefilter contains two expressions """ input_argv = [ "-i", "testinput/mainTestCase/odl_backup_operational_before.json", "-f", "testinput/mainTestCase/odl_backup_operational_after.json", "-ipf", "testinput/mainTestCase/json_prefilter_two_matches.conf", "-v", ] sys.argv[1:] = input_argv self.assertEquals( 14, JsonDiffTool.Json_Diff_Check(), "main failed! expected 14 differences, result was: " + str(JsonDiffTool.Json_Diff_Check()), ) def testSimpleDifferenceCountingUsingSingleMatchingBeforeFilter(self): """ Using a prefilter for both initial and final files """ input_argv = [ "-i", "testinput/mainTestCase/odl_backup_operational_before.json", "-f", "testinput/mainTestCase/odl_backup_operational_after.json", "-ipf", "testinput/mainTestCase/json_prefilter.conf", "-fpf", "testinput/mainTestCase/json_postfilter.conf", "-v", ] sys.argv[1:] = input_argv self.assertEquals( 16, JsonDiffTool.Json_Diff_Check(), "main failed! expected 16 differences, result was: " + str(JsonDiffTool.Json_Diff_Check()), ) def testUsingANonExistingFile(self): """ The second file does not exist. Exception expected """ self.assertRaises( IOError, JsonDiffTool.Json_Diff_Check_Keyword, "testinput/arrayTwoNames.json", "testinput/thisFileDoesNotExist.json", "", "", ) def testNotPassingAMandatoryParameter(self): """ Both initial and final json files are mandatory """ input_argv = ["-f", "testinput/mainTestCase/odl_backup_operational_after.json"] # parser = JsonDiffTool.parseArgs(input_argv) with self.assertRaises(SystemExit) as cm: JsonDiffTool.parse_args(input_argv) # 2 for missing argument self.assertEqual(cm.exception.code, 2) def testUsingNotMatchingFilterExpressions(self): """ Using prefilter files whose expressions match nothing """ input_argv = [ "-i", "testinput/mainTestCase/odl_backup_operational_before.json", "-f", "testinput/mainTestCase/odl_backup_operational_after.json", "-ipf", "testinput/mainTestCase/json_prefilter_zero_matches.conf", "-fpf", "testinput/mainTestCase/json_prefilter_zero_matches.conf", "-v", ] sys.argv[1:] = input_argv self.assertEquals( 16, JsonDiffTool.Json_Diff_Check(), "main failed! expected 16 differences, result was: " + str(JsonDiffTool.Json_Diff_Check()), ) if __name__ == "__main__": unittest.main()