#!/usr/bin/env fuchsia-vendored-python
# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for verify_json_schemas.py"""

from tempfile import TemporaryDirectory
import json
import unittest
from verify_json_schemas import (
    fail_on_breaking_changes,
    SchemaListMismatchError,
    MissingInputError,
    GoldenMismatchError,
)


class VerifyJsonSchemaTests(unittest.TestCase):
    def generate_path(self, base_dir, file_name):
        return base_dir + "/" + file_name

    def test_fail_on_breaking_changes(self):
        data_A = "some_data_A"
        data_B = "some_data_B"
        manifest = {"atoms": []}

        with TemporaryDirectory() as base_dir:
            golden_m = self.generate_path(base_dir, "core.golden")
            manifest["atoms"].append(data_A)
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            current_m = self.generate_path(base_dir, "core")
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a normal case will pass.
            self.assertTrue(
                fail_on_breaking_changes([current_m], [golden_m]) is None
            )

            manifest["atoms"] = []
            manifest["atoms"].append(data_B)
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that schemas with same keys, different values is a non-breaking change.
            self.assertRaises(
                GoldenMismatchError,
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest2 = {"required": ["req1", "req2"]}
            with open(golden_m, "w") as f:
                json.dump(manifest2, f)
            manifest2["required"].append("req3")
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            # Assert that any changes to the values of "required" key are a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*'required' parameters changed on root.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest2["required"].remove("req2")
            manifest2["required"].remove("req3")
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*'required' parameters changed on root.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest2["required"] = "data_string"
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*'required' parameters changed on root.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest2 = {"enum": ["req1"]}
            with open(golden_m, "w") as f:
                json.dump(manifest2, f)
            manifest2["enum"] = ["req2"]
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            # Assert that any changes to the value of an "enum" key is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*'enum' parameters changed on root.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest2["enum"].remove("req2")
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*'enum' parameters changed on root.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest2["enum"] = "data_string"
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*'enum' parameters changed on root.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest2 = {"additionalProperties": True}
            with open(golden_m, "w") as f:
                json.dump(manifest2, f)
            manifest2["additionalProperties"] = False
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            # Changing the value of "additionalProperties" to False is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Value for 'additionalProperties' on root*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            with open(golden_m, "w") as f:
                json.dump(manifest2, f)
            manifest2 = {"additionalProperties": True}
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            # Changing the value of "additionalProperties" to True is a non-breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*New value for 'additionalProperties' on root*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest["atoms"].remove(data_B)
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest["next"] = {"some_key": "some value B"}
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a schema with a key addition at root is a non-breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*New keys of root\:\n\s*\{'next'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest["atoms"] = {"some_key": "some value B"}
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a schema with a key addition beneath root is a non-breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*New keys of root.atoms\:\n\s*\{'some_key.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest2 = {
                "renamed_atoms": {
                    "some_key": "some value B",
                },
                "next": {
                    "some_key": "some value B",
                },
            }
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            # Assert that a schema with a key renamed at root is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root\:\n\s*\{'atoms'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest["atoms"] = {"re_key": "some value B"}
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a schema with a key renamed beneath root is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root.atoms\:\n\s*\{'some_key'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest2 = {
                "next": {
                    "some_key": "some value B",
                }
            }
            with open(current_m, "w") as f:
                json.dump(manifest2, f)
            # Assert that a schema with a key deleted at root is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root\:\n\s*\{'atoms'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest["atoms"] = []
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a schema with a key deleted beneath root is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root.atoms\:\n\s*\{'some_key'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest = {
                "atoms": {"some_key1": "some value B"},
                "next": {"some_key2": "some value B"},
            }
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {
                "atoms": {"some_key2": "some value B"},
                "next": {"some_key1": "some value B"},
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a schema with a key relocated at root is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root.next\:\n\s*\{'some_key2'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root.atoms\:\n\s*\{'some_key1'\}.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            manifest = {
                "atoms": {"some_key": {"key1": 1}},
                "next": {"some_key": {"key2": 2}},
            }
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {
                "atoms": {"some_key": {"key2": 1}},
                "next": {"some_key": {"key1": 2}},
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that a schema with a key relocated beneath root is a breaking change.
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root.atoms.some_key\:\n\s*\{'key1'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            self.assertRaisesRegex(
                GoldenMismatchError,
                ".*Missing keys of root.next.some_key\:\n\s*\{'key2'\}.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )

            mock_gold = "path/to/core.golden"
            ret_str = (
                f"Detected missing JSON Schema {mock_gold}.\n"
                f"Please consult with sdk-dev@fuchsia.dev if you are"
                f" planning to remove a schema.\n"
                f"If you have approval to make this change, remove the "
                f"schema and corresponding golden file from the schema lists.\n"
            )
            # Assert that a nonexistent golden file will not pass.
            self.assertRaises(
                MissingInputError,
                fail_on_breaking_changes,
                [current_m],
                [mock_gold],
            )
            self.assertTrue(
                str(MissingInputError(missing=mock_gold)) == ret_str
            )

            mock_curr = "path/to/core"
            ret_str = (
                f"Detected missing JSON Schema {mock_curr}.\n"
                f"Please consult with sdk-dev@fuchsia.dev if you are"
                f" planning to remove a schema.\n"
                f"If you have approval to make this change, remove the "
                f"schema and corresponding golden file from the schema lists.\n"
            )
            # Assert that a nonexistent current file will not pass.
            self.assertRaises(
                MissingInputError,
                fail_on_breaking_changes,
                [mock_curr],
                [golden_m],
            )
            self.assertTrue(
                str(MissingInputError(missing=mock_curr)) == ret_str
            )

            # Assert that lists of a different size will not pass.
            ret_str = (
                f"Detected that the golden list contains "
                f"a different number of schemas than the current list.\n"
                f"Golden:\n['{golden_m}']\nCurrent:\n['{mock_curr}', '{golden_m}']\n"
                f"Please make sure each schema has a corresponding golden file,"
                f" and vice versa.\n"
            )
            self.assertRaises(
                SchemaListMismatchError,
                fail_on_breaking_changes,
                [mock_curr, current_m],
                [golden_m],
            )
            self.assertTrue(
                str(
                    SchemaListMismatchError(
                        err_type=0,
                        goldens=[golden_m],
                        currents=[mock_curr, golden_m],
                    )
                )
                == ret_str
            )
            self.assertRaises(
                SchemaListMismatchError,
                fail_on_breaking_changes,
                [current_m],
                [mock_gold, golden_m],
            )
            ret_str = (
                f"Detected that the golden list contains "
                f"a different number of schemas than the current list.\n"
                f"Golden:\n[]\nCurrent:\n['{current_m}']\n"
                f"Please make sure each schema has a corresponding golden file,"
                f" and vice versa.\n"
            )
            self.assertRaises(
                SchemaListMismatchError,
                fail_on_breaking_changes,
                [current_m],
                [],
            )
            self.assertTrue(
                str(
                    SchemaListMismatchError(
                        err_type=0, goldens=[], currents=[current_m]
                    )
                )
                == ret_str
            )
            ret_str = (
                f"Detected that the golden list contains "
                f"a different number of schemas than the current list.\n"
                f"Golden:\n['{golden_m}']\nCurrent:\n[]\n"
                f"Please make sure each schema has a corresponding golden file,"
                f" and vice versa.\n"
            )
            self.assertRaises(
                SchemaListMismatchError,
                fail_on_breaking_changes,
                [],
                [golden_m],
            )
            self.assertTrue(
                str(
                    SchemaListMismatchError(
                        err_type=0, goldens=[golden_m], currents=[]
                    )
                )
                == ret_str
            )

            ret_str = (
                f"Detected that filenames in the golden list, ['{current_m}'],"
                f" do not correspond to those in the current list, "
                f"['{current_m}'].\n"
                f"Please make sure each schema has a corresponding golden file,"
                f" and vice versa.\n"
            )
            # Assert that files that would normally pass will fail
            # if the golden files do not have the .golden extension.
            self.assertRaises(
                SchemaListMismatchError,
                fail_on_breaking_changes,
                [current_m],
                [current_m],
            )
            self.assertTrue(
                str(
                    SchemaListMismatchError(
                        err_type=1, goldens=[current_m], currents=[current_m]
                    )
                )
                == ret_str
            )

            manifest = {
                "properties": {
                    "prop1": "data",
                },
                "required": ["prop1"],
            }
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {
                "properties": {"prop1": "data", "prop2": "more_data"},
                "required": ["prop1"],
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that adding an optional parameter is not breaking.
            self.assertRaisesRegex(
                GoldenMismatchError,
                "Non-breaking Changes((\n?)|(.*?))*?Changed parameters on level root.properties\:\n\s*\{'prop2'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest = {
                "properties": {"prop1": "data", "prop2": "more_data"},
                "required": ["prop1", "prop2"],
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that adding a required parameter is breaking.
            self.assertRaisesRegex(
                GoldenMismatchError,
                "Breaking Changes((\n?)|(.*?))*?Changed parameters on level root.properties\:\n\s*\{'prop2'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest = {
                "properties": {
                    "prop2": "data",
                },
                "required": [],
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that removing a 'required' parameter is breaking.
            self.assertRaisesRegex(
                GoldenMismatchError,
                "Breaking Changes((\n?)|(.*?))*?Changed parameters on level root.properties\:\n\s*\{'prop2'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest = {
                "properties": {"prop1": "data", "prop2": "more_data"},
                "required": ["prop1"],
                "additionalProperties": True,
            }
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {
                "properties": {
                    "prop1": "data",
                },
                "required": ["prop1"],
                "additionalProperties": True,
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that removing an optional parameter is not breaking
            # if 'additionalProperties' is True.
            self.assertRaisesRegex(
                GoldenMismatchError,
                "Non-breaking Changes((\n?)|(.*?))*?Changed parameters on level root.properties\:\n\s*\{'prop2'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest = {
                "properties": {"prop1": "data", "prop2": "more_data"},
                "required": ["prop1"],
                "additionalProperties": False,
            }
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {
                "properties": {
                    "prop1": "data",
                },
                "required": ["prop1"],
                "additionalProperties": False,
            }
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that removing an optional parameter is breaking
            # if 'additionalProperties' is False.
            self.assertRaisesRegex(
                GoldenMismatchError,
                "Breaking Changes((\n?)|(.*?))*?Changed parameters on level root.properties\:\n\s*\{'prop2'.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest = {"type": "type_data"}
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {"type": "other_type_data"}
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that changes to 'type' are breaking
            # if the golden value is a string.
            self.assertRaisesRegex(
                GoldenMismatchError,
                "Breaking Changes((\n?)|(.*?))*?Value for 'type' on root should be\:\n\s*type_data.*",
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )
            manifest = {"type": ["type_data"]}
            with open(golden_m, "w") as f:
                json.dump(manifest, f)
            manifest = {"type": ["other_type_data"]}
            with open(current_m, "w") as f:
                json.dump(manifest, f)
            # Assert that changes to 'type' is not breaking
            # if the golden value is not a string.
            self.assertRaises(
                GoldenMismatchError,
                fail_on_breaking_changes,
                [current_m],
                [golden_m],
            )


if __name__ == "__main__":
    unittest.main()
