#!/usr/bin/env python3
"""
utils/env_loader.py - load_env_keys() 단위 테스트

테스트 항목:
- .env.keys 파일 정상 로드 및 반환값 확인
- 파일 없을 때 예외 없이 0 반환 확인
- 기존 환경변수 덮어쓰지 않음 확인 (setdefault 동작)
- 따옴표로 감싸진 값 파싱 확인
- 주석 및 빈 줄 무시 확인
"""

import os
import sys
from pathlib import Path

import pytest

sys.path.insert(0, str(Path(__file__).parent.parent))

from utils.env_loader import load_env_keys


class TestLoadEnvKeysNormalLoad:
    """정상적인 .env.keys 파일 로드 테스트"""

    def test_loads_variables_and_returns_count(self, tmp_path, monkeypatch):
        """export KEY=value 형식 두 줄 로드 후 반환값 2, 환경변수 설정 확인"""
        env_file = tmp_path / ".env.keys"
        env_file.write_text("export KEY1=value1\nexport KEY2=value2\n")

        # 환경변수 오염 방지: 테스트 후 cleanup
        monkeypatch.delenv("KEY1", raising=False)
        monkeypatch.delenv("KEY2", raising=False)

        result = load_env_keys(str(env_file))

        assert result == 2
        assert os.environ["KEY1"] == "value1"
        assert os.environ["KEY2"] == "value2"


class TestLoadEnvKeysMissingFile:
    """파일이 없을 때 동작 테스트"""

    def test_missing_file_returns_zero_without_exception(self, tmp_path):
        """존재하지 않는 경로 전달 시 예외 없이 0 반환"""
        nonexistent = str(tmp_path / "does_not_exist.env.keys")

        result = load_env_keys(nonexistent)

        assert result == 0


class TestLoadEnvKeysNoOverwrite:
    """기존 환경변수를 덮어쓰지 않는 동작 테스트 (setdefault)"""

    def test_existing_env_var_not_overwritten(self, tmp_path, monkeypatch):
        """이미 설정된 환경변수는 .env.keys 값으로 덮어쓰지 않음"""
        monkeypatch.setenv("EXISTING_KEY", "original")

        env_file = tmp_path / ".env.keys"
        env_file.write_text("export EXISTING_KEY=overwritten\n")

        load_env_keys(str(env_file))

        assert os.environ["EXISTING_KEY"] == "original"


class TestLoadEnvKeysQuotedValues:
    """따옴표로 감싸진 값 파싱 테스트"""

    def test_double_quoted_value_stripped(self, tmp_path, monkeypatch):
        """export QUOTED1="hello world" → QUOTED1 == "hello world" (따옴표 제거)"""
        monkeypatch.delenv("QUOTED1", raising=False)
        monkeypatch.delenv("QUOTED2", raising=False)

        env_file = tmp_path / ".env.keys"
        env_file.write_text("export QUOTED1=\"hello world\"\nexport QUOTED2='single quoted'\n")

        result = load_env_keys(str(env_file))

        assert result == 2
        assert os.environ["QUOTED1"] == "hello world"
        assert os.environ["QUOTED2"] == "single quoted"


class TestLoadEnvKeysCommentsAndBlankLines:
    """주석과 빈 줄 무시 테스트"""

    def test_comments_and_blank_lines_ignored(self, tmp_path, monkeypatch):
        """# 주석 및 빈 줄은 건너뛰고 유효한 변수만 로드, 반환값 1"""
        monkeypatch.delenv("VALID", raising=False)

        env_file = tmp_path / ".env.keys"
        env_file.write_text("# comment\n\nexport VALID=yes\n")

        result = load_env_keys(str(env_file))

        assert result == 1
        assert os.environ["VALID"] == "yes"


if __name__ == "__main__":
    pytest.main([__file__, "-v"])
