diff options
author | Trygve Aaberge <trygveaa@gmail.com> | 2023-09-16 16:24:52 +0200 |
---|---|---|
committer | Trygve Aaberge <trygveaa@gmail.com> | 2024-02-18 11:32:54 +0100 |
commit | 0b46f31f14e9a69568535b2c73bc00fc396e2d71 (patch) | |
tree | 5aa4e44a92107d182da91543f784bebcedd53347 /tests | |
parent | 748991ae4d0bf3726b4a1eeb851b2d3a6446b2bb (diff) | |
download | wee-slack-0b46f31f14e9a69568535b2c73bc00fc396e2d71.tar.gz |
Use hook_url for http requests when available
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_http_request.py | 179 |
1 files changed, 133 insertions, 46 deletions
diff --git a/tests/test_http_request.py b/tests/test_http_request.py index 1a0b4a0..42d2058 100644 --- a/tests/test_http_request.py +++ b/tests/test_http_request.py @@ -4,12 +4,12 @@ from unittest.mock import MagicMock, patch import pytest import weechat -from slack.http import HttpError, http_request -from slack.task import FutureProcess, FutureTimer, weechat_task_cb +from slack.http import HttpError, http_request, http_request_process, http_request_url +from slack.task import FutureProcess, FutureTimer, FutureUrl, weechat_task_cb from slack.util import get_callback_name -@patch.object(weechat, "hook_process_hashtable") +@patch.object(weechat, "hook_url") def test_http_request_success(mock_method: MagicMock): url = "http://example.com" options = {"option": "1"} @@ -17,6 +17,33 @@ def test_http_request_success(mock_method: MagicMock): coroutine = http_request(url, options, timeout) future = coroutine.send(None) + assert isinstance(future, FutureUrl) + + mock_method.assert_called_once_with( + url, + options, + timeout, + get_callback_name(weechat_task_cb), + future.id, + ) + + future.set_result( + (url, options, {"response_code": "200", "headers": "", "output": "response"}) + ) + + with pytest.raises(StopIteration) as excinfo: + coroutine.send(None) + assert excinfo.value.value == "response" + + +@patch.object(weechat, "hook_process_hashtable") +def test_http_request_process_success(mock_method: MagicMock): + url = "http://example.com" + options = {"option": "1"} + timeout = 123 + coroutine = http_request_process(url, options, timeout) + + future = coroutine.send(None) assert isinstance(future, FutureProcess) mock_method.assert_called_once_with( @@ -27,18 +54,34 @@ def test_http_request_success(mock_method: MagicMock): future.id, ) - response = "response" - body = f"HTTP/2 200\r\n\r\n{response}" + body = f"HTTP/2 200\r\n\r\nresponse" future.set_result(("", 0, body, "")) with pytest.raises(StopIteration) as excinfo: coroutine.send(None) - assert excinfo.value.value == response + assert excinfo.value.value == (200, "HTTP/2 200", "response") + + +def test_http_request_url_error(): + url = "http://example.com" + coroutine = http_request_url(url, {}, 0) + + future = coroutine.send(None) + assert isinstance(future, FutureUrl) + future.set_result((url, {}, {"error": "error"})) + + with pytest.raises(HttpError) as excinfo: + coroutine.send(None) + + assert excinfo.value.url == url + assert excinfo.value.return_code == None + assert excinfo.value.http_status_code == None + assert excinfo.value.error == "error" -def test_http_request_error_process_return_code(): +def test_http_request_process_error_return_code(): url = "http://example.com" - coroutine = http_request(url, {}, 0, max_retries=0) + coroutine = http_request_process(url, {}, 0) future = coroutine.send(None) assert isinstance(future, FutureProcess) @@ -53,9 +96,9 @@ def test_http_request_error_process_return_code(): assert excinfo.value.error == "" -def test_http_request_error_process_stderr(): +def test_http_request_process_error_stderr(): url = "http://example.com" - coroutine = http_request(url, {}, 0, max_retries=0) + coroutine = http_request_process(url, {}, 0) future = coroutine.send(None) assert isinstance(future, FutureProcess) @@ -70,24 +113,24 @@ def test_http_request_error_process_stderr(): assert excinfo.value.error == "err" -def test_http_request_error_process_http(): +def test_http_request_error_http_status(): url = "http://example.com" - coroutine = http_request(url, {}, 0, max_retries=0) + coroutine = http_request(url, {}, 0) future = coroutine.send(None) - assert isinstance(future, FutureProcess) + assert isinstance(future, FutureUrl) - response = "response" - body = f"HTTP/2 400\r\n\r\n{response}" - future.set_result(("", 0, body, "")) + future.set_result( + (url, {}, {"response_code": "400", "headers": "", "output": "response"}) + ) with pytest.raises(HttpError) as excinfo: coroutine.send(None) assert excinfo.value.url == url - assert excinfo.value.return_code == 0 + assert excinfo.value.return_code == None assert excinfo.value.http_status_code == 400 - assert excinfo.value.error == response + assert excinfo.value.error == "response" def test_http_request_error_retry_success(): @@ -95,23 +138,23 @@ def test_http_request_error_retry_success(): coroutine = http_request(url, {}, 0, max_retries=2) future_1 = coroutine.send(None) - assert isinstance(future_1, FutureProcess) - future_1.set_result(("", -2, "", "")) + assert isinstance(future_1, FutureUrl) + future_1.set_result((url, {}, {"error": "error"})) future_2 = coroutine.send(None) assert isinstance(future_2, FutureTimer) future_2.set_result((0,)) future_3 = coroutine.send(None) - assert isinstance(future_3, FutureProcess) + assert isinstance(future_3, FutureUrl) - response = "response" - body = f"HTTP/2 200\r\n\r\n{response}" - future_3.set_result(("", 0, body, "")) + future_3.set_result( + (url, {}, {"response_code": "200", "headers": "", "output": "response"}) + ) with pytest.raises(StopIteration) as excinfo: coroutine.send(None) - assert excinfo.value.value == response + assert excinfo.value.value == "response" def test_http_request_error_retry_error(): @@ -119,41 +162,71 @@ def test_http_request_error_retry_error(): coroutine = http_request(url, {}, 0, max_retries=2) future_1 = coroutine.send(None) - assert isinstance(future_1, FutureProcess) - future_1.set_result(("", -2, "", "")) + assert isinstance(future_1, FutureUrl) + future_1.set_result((url, {}, {"error": "error"})) future_2 = coroutine.send(None) assert isinstance(future_2, FutureTimer) future_2.set_result((0,)) future_3 = coroutine.send(None) - assert isinstance(future_3, FutureProcess) - future_3.set_result(("", -2, "", "")) + assert isinstance(future_3, FutureUrl) + future_3.set_result((url, {}, {"error": "error"})) future_4 = coroutine.send(None) assert isinstance(future_4, FutureTimer) future_4.set_result((0,)) future_5 = coroutine.send(None) - assert isinstance(future_5, FutureProcess) - future_5.set_result(("", -2, "", "")) + assert isinstance(future_5, FutureUrl) + future_5.set_result((url, {}, {"error": "error"})) with pytest.raises(HttpError) as excinfo: coroutine.send(None) assert excinfo.value.url == url - assert excinfo.value.return_code == -2 + assert excinfo.value.return_code == None assert excinfo.value.http_status_code == None - assert excinfo.value.error == "" + assert excinfo.value.error == "error" -def test_http_request_multiple_headers(): +def test_http_request_url_multiple_headers(): url = "http://example.com" - coroutine = http_request(url, {}, 0) + coroutine = http_request_url(url, {}, 0) + future = coroutine.send(None) + assert isinstance(future, FutureUrl) + + headers = ( + dedent( + f""" + HTTP/1.1 200 Connection established + + HTTP/2 200 + content-type: application/json; charset=utf-8 + """ + ) + .strip() + .replace("\n", "\r\n") + ) + future.set_result( + (url, {}, {"response_code": "200", "headers": headers, "output": "response"}) + ) + + with pytest.raises(StopIteration) as excinfo: + coroutine.send(future) + assert excinfo.value.value == ( + 200, + "2 200\r\ncontent-type: application/json; charset=utf-8", + "response", + ) + + +def test_http_request_process_multiple_headers(): + url = "http://example.com" + coroutine = http_request_process(url, {}, 0) future = coroutine.send(None) assert isinstance(future, FutureProcess) - response = "response" body = ( dedent( f""" @@ -162,7 +235,7 @@ def test_http_request_multiple_headers(): HTTP/2 200 content-type: application/json; charset=utf-8 - {response} + response """ ) .strip() @@ -172,7 +245,11 @@ def test_http_request_multiple_headers(): with pytest.raises(StopIteration) as excinfo: coroutine.send(future) - assert excinfo.value.value == response + assert excinfo.value.value == ( + 200, + "2 200\r\ncontent-type: application/json; charset=utf-8", + "response", + ) @patch.object(weechat, "hook_timer") @@ -181,10 +258,19 @@ def test_http_request_ratelimit(mock_method: MagicMock): coroutine = http_request(url, {}, 0) future_1 = coroutine.send(None) - assert isinstance(future_1, FutureProcess) - - body = "HTTP/2 429\r\nRetry-After: 12\r\n\r\n" - future_1.set_result(("", 0, body, "")) + assert isinstance(future_1, FutureUrl) + + future_1.set_result( + ( + url, + {}, + { + "response_code": "429", + "headers": "HTTP/2 429\r\nRetry-After: 12", + "output": "response", + }, + ) + ) future_2 = coroutine.send(None) assert isinstance(future_2, FutureTimer) @@ -195,11 +281,12 @@ def test_http_request_ratelimit(mock_method: MagicMock): ) future_3 = coroutine.send(None) - assert isinstance(future_3, FutureProcess) + assert isinstance(future_3, FutureUrl) - response = "response" - future_3.set_result(("", 0, f"HTTP/2 200\r\n\r\n{response}", "")) + future_3.set_result( + (url, {}, {"response_code": "200", "headers": "", "output": "response"}) + ) with pytest.raises(StopIteration) as excinfo: coroutine.send(None) - assert excinfo.value.value == response + assert excinfo.value.value == "response" |