from __future__ import annotations import json import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) import tools.validate_kis_api_credentials_v1 as validator class _FakeCreds: def __init__(self, account: str): self.account = account self.domain = "https://openapi.koreainvestment.com:9443" if account == "real" else "https://openapivts.koreainvestment.com:29443" self.app_key = f"{account}-key" self.app_secret = f"{account}-secret" def test_validate_kis_api_credentials_writes_pass_json(tmp_path, monkeypatch): out = tmp_path / "kis_api_credentials_validation_v1.json" monkeypatch.setenv("KIS_APP_Key_TEST", "mock-key") monkeypatch.setenv("KIS_APP_Secret_TEST", "mock-secret") monkeypatch.setattr(validator, "KisCredentials", type("CredFactory", (), {"load": staticmethod(lambda account: _FakeCreds(account))})) monkeypatch.setattr(validator, "get_current_price", lambda creds, ticker: {"ticker": ticker, "price": 1000}) monkeypatch.setattr(sys, "argv", ["validate_kis_api_credentials_v1.py", "--account", "mock", "--ticker", "005930", "--output", str(out)]) rc = validator.main() payload = json.loads(out.read_text(encoding="utf-8")) assert rc == 0 assert payload["gate"] == "PASS" assert payload["evidence"]["account"] == "mock" assert payload["evidence"]["ticker"] == "005930" def test_validate_kis_api_credentials_fails_when_api_call_errors(tmp_path, monkeypatch): out = tmp_path / "kis_api_credentials_validation_v1.json" monkeypatch.setattr(validator, "KisCredentials", type("CredFactory", (), {"load": staticmethod(lambda account: _FakeCreds(account))})) monkeypatch.setattr(validator, "get_current_price", lambda creds, ticker: (_ for _ in ()).throw(RuntimeError("boom"))) monkeypatch.setattr(sys, "argv", ["validate_kis_api_credentials_v1.py", "--account", "mock", "--ticker", "005930", "--output", str(out)]) rc = validator.main() payload = json.loads(out.read_text(encoding="utf-8")) assert rc == 1 assert payload["gate"] == "FAIL" assert payload["errors"]