From c59c8d6dc63d19bf01da9d0cd34c05837cb14219 Mon Sep 17 00:00:00 2001 From: Heewon Oh Date: Wed, 3 Jun 2026 21:39:47 +0900 Subject: [PATCH] fix(test): mock httpx.request instead of requests.request in make_request tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v1.6.1에서 KISClient.make_request가 requests → httpx로 교체되었으나 (commit 52cb530) 테스트의 mock 타겟이 그대로 requests.request에 머물러 실제 httpx 호출이 발생, 인증 실패로 JSON_DECODE_ERROR가 반환되며 make_request 계열 테스트들이 의도와 다르게 통과/실패하던 문제 수정. 변경: - tests/unit/test_client.py: 6개 @patch("requests.request") → httpx.request. 토큰 갱신용 @patch("requests.post")는 client.py:480이 여전히 requests.post를 쓰므로 유지. - tests/unit/test_client_comprehensive.py: 7개 with patch("requests.request") → httpx.request. 결과: test_client.py 22 passed, test_client_comprehensive.py 36 passed (58/58). --- tests/unit/test_client.py | 12 ++++++------ tests/unit/test_client_comprehensive.py | 26 ++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 27da2ab..36e25ad 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -183,7 +183,7 @@ def test_check_and_refresh_token_invalid_format(self, mock_get_tr_env, mock_auth @patch("kis_agent.core.client.auth") @patch("kis_agent.core.client.getTREnv") - @patch("requests.request") + @patch("httpx.request") def test_make_request_success(self, mock_request, mock_get_tr_env, mock_auth): """API 요청 성공""" mock_auth.return_value = { @@ -221,7 +221,7 @@ def test_make_request_success(self, mock_request, mock_get_tr_env, mock_auth): @patch("kis_agent.core.client.auth") @patch("kis_agent.core.client.getTREnv") - @patch("requests.request") + @patch("httpx.request") def test_make_request_json_decode_error( self, mock_request, mock_get_tr_env, mock_auth ): @@ -259,7 +259,7 @@ def test_make_request_json_decode_error( @patch("kis_agent.core.client.auth") @patch("kis_agent.core.client.getTREnv") - @patch("requests.request") + @patch("httpx.request") def test_make_request_no_rt_cd(self, mock_request, mock_get_tr_env, mock_auth): """rt_cd 없는 응답 처리""" mock_auth.return_value = { @@ -289,7 +289,7 @@ def test_make_request_no_rt_cd(self, mock_request, mock_get_tr_env, mock_auth): @patch("kis_agent.core.client.auth") @patch("kis_agent.core.client.getTREnv") - @patch("requests.request") + @patch("httpx.request") def test_make_request_api_error(self, mock_request, mock_get_tr_env, mock_auth): """API 오류 응답 처리""" mock_auth.return_value = { @@ -323,7 +323,7 @@ def test_make_request_api_error(self, mock_request, mock_get_tr_env, mock_auth): @patch("kis_agent.core.client.auth") @patch("kis_agent.core.client.getTREnv") - @patch("requests.request") + @patch("httpx.request") def test_make_request_http_error_with_retry( self, mock_request, mock_get_tr_env, mock_auth ): @@ -363,7 +363,7 @@ def test_make_request_http_error_with_retry( @patch("kis_agent.core.client.auth") @patch("kis_agent.core.client.getTREnv") - @patch("requests.request") + @patch("httpx.request") def test_make_request_exception_handling( self, mock_request, mock_get_tr_env, mock_auth ): diff --git a/tests/unit/test_client_comprehensive.py b/tests/unit/test_client_comprehensive.py index cee2909..88f8714 100644 --- a/tests/unit/test_client_comprehensive.py +++ b/tests/unit/test_client_comprehensive.py @@ -354,7 +354,7 @@ def test_make_request_success(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = { @@ -392,7 +392,7 @@ def test_make_request_json_decode_error(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 # json.JSONDecodeError를 발생시켜야 함 @@ -426,7 +426,7 @@ def test_make_request_no_rt_cd(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {"data": "no_rt_cd"} @@ -456,7 +456,7 @@ def test_make_request_api_error(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = { @@ -508,7 +508,7 @@ def side_effect(*args, **kwargs): } return mock_response - with patch("requests.request", side_effect=side_effect): + with patch("httpx.request", side_effect=side_effect): client = client_module.KISClient( enable_rate_limiter=False, verbose=False ) @@ -552,7 +552,7 @@ def side_effect(*args, **kwargs): } return mock_response - with patch("requests.request", side_effect=side_effect), patch( + with patch("httpx.request", side_effect=side_effect), patch( "time.sleep" ): # 대기 시간 건너뛰기 client = client_module.KISClient( @@ -578,7 +578,7 @@ def test_make_request_http_error(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 500 mock_response.json.return_value = { @@ -612,7 +612,7 @@ def test_make_request_request_exception(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_request.side_effect = requests.exceptions.ConnectionError( "Connection failed" ) @@ -640,7 +640,7 @@ def test_make_request_post_method(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {"rt_cd": "0"} @@ -672,7 +672,7 @@ def test_make_request_verbose_logging(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {"rt_cd": "0", "output": {}} @@ -809,7 +809,7 @@ def test_get_kospi200_index(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = { @@ -982,7 +982,7 @@ def test_rate_limiter_report_success(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {"rt_cd": "0"} @@ -1016,7 +1016,7 @@ def test_rate_limiter_report_error(self): mock_tr_env.my_token = "Bearer token" mock_get_tr_env.return_value = mock_tr_env - with patch("requests.request") as mock_request: + with patch("httpx.request") as mock_request: mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {