aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorTrygve Aaberge <trygveaa@gmail.com>2023-09-16 16:24:52 +0200
committerTrygve Aaberge <trygveaa@gmail.com>2024-02-18 11:32:54 +0100
commit0b46f31f14e9a69568535b2c73bc00fc396e2d71 (patch)
tree5aa4e44a92107d182da91543f784bebcedd53347 /tests
parent748991ae4d0bf3726b4a1eeb851b2d3a6446b2bb (diff)
downloadwee-slack-0b46f31f14e9a69568535b2c73bc00fc396e2d71.tar.gz
Use hook_url for http requests when available
Diffstat (limited to 'tests')
-rw-r--r--tests/test_http_request.py179
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"