"""
Tests for the check-ldr-db pre-commit hook.

Ensures the hook detects any reference to the deprecated shared database,
forcing all data storage through per-user encrypted databases.
"""

import sys
from importlib import import_module
from pathlib import Path


HOOKS_DIR = Path(__file__).parent.parent.parent / ".pre-commit-hooks"
sys.path.insert(0, str(HOOKS_DIR))

hook_module = import_module("check-ldr-db")
check_file_fn = hook_module.check_file_for_ldr_db

# Build the deprecated DB name dynamically so this test file itself
# is not flagged by the check-ldr-db pre-commit hook.
_DEPRECATED_DB = "ldr" + ".db"


def _write_and_check(tmp_path, code: str, filename: str = "module.py"):
    p = tmp_path / filename
    p.write_text(code, encoding="utf-8")
    return check_file_fn(str(p))


class TestDetectsLdrDbUsage:
    """Ensures references to the deprecated shared DB are caught."""

    def test_detects_sqlite_connect(self, tmp_path):
        code = f'conn = sqlite3.connect("{_DEPRECATED_DB}")\n'
        matches = _write_and_check(tmp_path, code)
        assert len(matches) >= 1

    def test_detects_in_path(self, tmp_path):
        code = f'db_path = "/data/{_DEPRECATED_DB}"\n'
        matches = _write_and_check(tmp_path, code)
        assert len(matches) >= 1

    def test_detects_case_insensitive(self, tmp_path):
        code = f'path = "{_DEPRECATED_DB.upper()}"\n'
        matches = _write_and_check(tmp_path, code)
        assert len(matches) >= 1

    def test_detects_in_f_string(self, tmp_path):
        code = f'path = f"{{base}}/{_DEPRECATED_DB}"\n'
        matches = _write_and_check(tmp_path, code)
        assert len(matches) >= 1


class TestAllowsSafePatterns:
    """Ensures comments and safe code are not flagged."""

    def test_allows_comment(self, tmp_path):
        code = f"# The old {_DEPRECATED_DB} is deprecated\n"
        matches = _write_and_check(tmp_path, code)
        assert len(matches) == 0

    def test_allows_docstring_style(self, tmp_path):
        code = f'"""See {_DEPRECATED_DB} migration guide"""\n'
        matches = _write_and_check(tmp_path, code)
        assert len(matches) == 0

    def test_allows_normal_code(self, tmp_path):
        code = """
from database.session_context import get_user_db_session
with get_user_db_session(username) as session:
    pass
"""
        matches = _write_and_check(tmp_path, code)
        assert len(matches) == 0
