Skip to content

Commit 21d788c

Browse files
committed
move decorator to local_test_server.py. Use decorator in real_call_test. Add tests for https & redirect.
1 parent 9a33321 commit 21d788c

File tree

3 files changed

+52
-44
lines changed

3 files changed

+52
-44
lines changed

tests/files_test.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,13 @@
55
"""Post Files Tests"""
66
# pylint: disable=line-too-long
77

8-
import functools
98
import re
10-
import socketserver
11-
import threading
12-
import time
139
from unittest import mock
1410

1511
import mocket
1612
import pytest
1713
import requests as python_requests
18-
from local_test_server import LocalTestServerHandler
19-
20-
21-
def uses_local_server(func):
22-
@functools.wraps(func)
23-
def wrapper(*args, **kwargs):
24-
with socketserver.TCPServer(("127.0.0.1", 5000), LocalTestServerHandler) as server:
25-
server_thread = threading.Thread(target=server.serve_forever)
26-
server_thread.daemon = True
27-
server_thread.start()
28-
time.sleep(2) # Give the server some time to start
29-
30-
result = func(*args, **kwargs)
31-
32-
server.shutdown()
33-
server.server_close()
34-
time.sleep(2)
35-
return result
36-
37-
return wrapper
14+
from local_test_server import uses_local_server
3815

3916

4017
@pytest.fixture
@@ -44,7 +21,6 @@ def log_stream():
4421

4522
@pytest.fixture
4623
def post_url():
47-
# return "https://httpbin.org/post"
4824
return "http://127.0.0.1:5000/post"
4925

5026

@@ -192,6 +168,7 @@ def test_post_files_file( # pylint: disable=unused-argument
192168
assert sent.endswith(actual_request_post)
193169

194170

171+
@uses_local_server
195172
def test_post_files_complex( # pylint: disable=unused-argument
196173
sock, requests, log_stream, post_url, request_logging
197174
):

tests/local_test_server.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,37 @@
11
# SPDX-FileCopyrightText: 2025 Tim Cocks
22
#
33
# SPDX-License-Identifier: MIT
4+
import functools
45
import json
6+
import socketserver
7+
import threading
8+
import time
59
from http.server import SimpleHTTPRequestHandler
610

711

12+
def uses_local_server(func):
13+
@functools.wraps(func)
14+
def wrapper(*args, **kwargs):
15+
with ReusableAddressTCPServer(("127.0.0.1", 5000), LocalTestServerHandler) as server:
16+
server_thread = threading.Thread(target=server.serve_forever)
17+
server_thread.daemon = True
18+
server_thread.start()
19+
time.sleep(2) # Give the server some time to start
20+
21+
result = func(*args, **kwargs)
22+
23+
server.shutdown()
24+
server.server_close()
25+
return result
26+
27+
return wrapper
28+
29+
30+
class ReusableAddressTCPServer(socketserver.TCPServer):
31+
# Enable SO_REUSEADDR
32+
allow_reuse_address = True
33+
34+
835
class LocalTestServerHandler(SimpleHTTPRequestHandler):
936
def do_POST(self):
1037
if self.path == "/post":

tests/real_call_test.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212

1313
import adafruit_connection_manager
1414
import pytest
15-
from local_test_server import LocalTestServerHandler
15+
from local_test_server import uses_local_server
1616

1717
import adafruit_requests
1818

1919

20+
@uses_local_server
2021
def test_gets():
2122
path_index = 0
2223
status_code_index = 1
@@ -28,25 +29,28 @@ def test_gets():
2829
("status/204", 204, "", None),
2930
]
3031

31-
with socketserver.TCPServer(("127.0.0.1", 5000), LocalTestServerHandler) as server:
32-
server_thread = threading.Thread(target=server.serve_forever)
33-
server_thread.daemon = True
34-
server_thread.start()
32+
for case in cases:
33+
requests = adafruit_requests.Session(socket, ssl.create_default_context())
34+
with requests.get(f"http://127.0.0.1:5000/{case[path_index]}") as response:
35+
assert response.status_code == case[status_code_index]
36+
if case[text_result_index] is not None:
37+
assert response.text == case[text_result_index]
38+
if case[json_keys_index] is not None:
39+
for key, value in case[json_keys_index].items():
40+
assert response.json()[key] == value
3541

36-
time.sleep(2) # Give the server some time to start
42+
adafruit_connection_manager.connection_manager_close_all(release_references=True)
3743

38-
for case in cases:
39-
requests = adafruit_requests.Session(socket, ssl.create_default_context())
40-
with requests.get(f"http://127.0.0.1:5000/{case[path_index]}") as response:
41-
assert response.status_code == case[status_code_index]
42-
if case[text_result_index] is not None:
43-
assert response.text == case[text_result_index]
44-
if case[json_keys_index] is not None:
45-
for key, value in case[json_keys_index].items():
46-
assert response.json()[key] == value
4744

48-
adafruit_connection_manager.connection_manager_close_all(release_references=True)
45+
def test_http_to_https_redirect():
46+
url = "http://www.adafruit.com/api/quotes.php"
47+
requests = adafruit_requests.Session(socket, ssl.create_default_context())
48+
with requests.get(url) as response:
49+
assert response.status_code == 200
4950

50-
server.shutdown()
51-
server.server_close()
52-
time.sleep(2)
51+
52+
def test_https_direct():
53+
url = "https://www.adafruit.com/api/quotes.php"
54+
requests = adafruit_requests.Session(socket, ssl.create_default_context())
55+
with requests.get(url) as response:
56+
assert response.status_code == 200

0 commit comments

Comments
 (0)