# Copyright 2026 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import sys
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch


git_repo_path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
utils_path = os.path.join(git_repo_path, "utils")
if utils_path not in sys.path:
    sys.path.append(utils_path)

import check_inits  # noqa: E402


class CheckInitsTest(unittest.TestCase):
    def test_ignored_models_are_not_reexported(self):
        with tempfile.TemporaryDirectory() as tmp:
            models = Path(tmp)
            init = models / "__init__.py"
            init.touch()
            for module_path, export in {
                "bert/configuration_bert.py": "BertConfig",
                "deprecated/old/configuration_old.py": "OldConfig",
                "_private/configuration_private.py": "PrivateConfig",
            }.items():
                module = models / module_path
                module.parent.mkdir(parents=True)
                module.write_text(f'__all__ = ["{export}"]\n', encoding="utf-8")
            with patch.object(check_inits, "MODELS_INIT_PATH", init):
                self.assertEqual(check_inits.get_import_structure(), {"bert": {"configuration_bert"}})

    def test_generation_preserves_license_and_is_idempotent(self):
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            models = root / "src" / "transformers" / "models"
            model = models / "example"
            model.mkdir(parents=True)
            init = model / "__init__.py"
            license_header = "# Copyright 2020 Example authors.\n# Licensed under Apache 2.0.\n"
            init.write_text(license_header + "\n", encoding="utf-8")

            with patch.object(check_inits, "REPO_ROOT", root), patch.object(check_inits, "MODELS_PATH", models):
                kwargs = {
                    "init_path": init,
                    "import_lines": ["from .configuration_example import *"],
                    "module_names": ["configuration_example"],
                }
                generated = check_inits.generate_init(**kwargs)

                expected = """#                🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
#           This file was automatically generated from the modules in `src/transformers/models/example`.
#           Do NOT edit this file manually as any edits will be overwritten by auto-generation of the file.
#                       A module is picked up once it exports a name through `__all__`.
#                   Regenerate the file with: `python utils/check_inits.py --fix_and_overwrite`
#                🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
# Copyright 2020 Example authors.
# Licensed under Apache 2.0.
from typing import TYPE_CHECKING

from ...utils import _LazyModule
from ...utils.import_utils import define_import_structure


if TYPE_CHECKING:
    from .configuration_example import *
else:
    import sys

    _file = globals()["__file__"]
    sys.modules[__name__] = _LazyModule(__name__, _file, define_import_structure(_file), module_spec=__spec__)
"""
                self.assertEqual(expected, generated)

                # check idempotent
                init.write_text(generated, encoding="utf-8")
                self.assertEqual(check_inits.generate_init(**kwargs), generated)

    def test_new_init_inherits_module_license(self):
        with tempfile.TemporaryDirectory() as tmp:
            model = Path(tmp)
            header = "# Copyright 2026 Model authors.\n"
            (model / "configuration_example.py").write_text(header + "__all__ = []\n", encoding="utf-8")
            self.assertEqual(check_inits.get_license_header(model / "__init__.py", ["configuration_example"]), header)
