fix(signal_v2-phase3a): V1 KIS env pattern + test isolation fix

config.py: kis_env_type (virtual/real) + KIS_REAL_*/KIS_VIRTUAL_* env
variables (V1 호환). kis_app_key/kis_app_secret/kis_account properties
auto-select based on env type.

main.py: KIS not-configured warning uses descriptive message including
env type + expected var name.

test_main.py: monkeypatch load_dotenv to no-op + setenv empty string
(instead of delenv) — defeats .env re-read on importlib.reload.
Pre-existing test_startup_warns_if_webai_api_key_missing also fixed.

33/33 tests pass (was 31/33).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-16 10:25:58 +09:00
parent d85512d036
commit b690900cfc
3 changed files with 39 additions and 12 deletions

View File

@@ -20,13 +20,14 @@ class Settings:
db_path: Path = field(
default_factory=lambda: Path(__file__).parent / "data" / "signal_v2.db"
)
# Phase 3a additions
kis_app_key: str = field(default_factory=lambda: os.getenv("KIS_APP_KEY", "").strip())
kis_app_secret: str = field(default_factory=lambda: os.getenv("KIS_APP_SECRET", "").strip())
kis_account: str = field(default_factory=lambda: os.getenv("KIS_ACCOUNT", "").strip())
kis_is_virtual: bool = field(
default_factory=lambda: os.getenv("KIS_IS_VIRTUAL", "true").lower() == "true"
)
# KIS — V1 호환 패턴 (KIS_ENV_TYPE virtual/real)
kis_env_type: str = field(default_factory=lambda: os.getenv("KIS_ENV_TYPE", "virtual").lower())
kis_real_app_key: str = field(default_factory=lambda: os.getenv("KIS_REAL_APP_KEY", "").strip())
kis_real_app_secret: str = field(default_factory=lambda: os.getenv("KIS_REAL_APP_SECRET", "").strip())
kis_real_account: str = field(default_factory=lambda: os.getenv("KIS_REAL_ACCOUNT", "").strip())
kis_virtual_app_key: str = field(default_factory=lambda: os.getenv("KIS_VIRTUAL_APP_KEY", "").strip())
kis_virtual_app_secret: str = field(default_factory=lambda: os.getenv("KIS_VIRTUAL_APP_SECRET", "").strip())
kis_virtual_account: str = field(default_factory=lambda: os.getenv("KIS_VIRTUAL_ACCOUNT", "").strip())
v1_token_path: Path = field(
default_factory=lambda: Path(
os.getenv("V1_TOKEN_PATH",
@@ -34,6 +35,22 @@ class Settings:
)
)
@property
def kis_is_virtual(self) -> bool:
return self.kis_env_type != "real"
@property
def kis_app_key(self) -> str:
return self.kis_real_app_key if self.kis_env_type == "real" else self.kis_virtual_app_key
@property
def kis_app_secret(self) -> str:
return self.kis_real_app_secret if self.kis_env_type == "real" else self.kis_virtual_app_secret
@property
def kis_account(self) -> str:
return self.kis_real_account if self.kis_env_type == "real" else self.kis_virtual_account
def get_settings() -> Settings:
return Settings()