Skip to content

Commit 5001cbe

Browse files
committed
implement extra options
1 parent 7716cda commit 5001cbe

5 files changed

Lines changed: 78 additions & 1 deletion

File tree

pytest_httpserver/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"BlockingHTTPServer",
1010
"BlockingRequestHandler",
1111
"Error",
12+
"ExtraOptions",
1213
"HTTPServer",
1314
"HTTPServerError",
1415
"HeaderValueMatcher",
@@ -24,6 +25,7 @@
2425
from .httpserver import METHOD_ALL
2526
from .httpserver import URI_DEFAULT
2627
from .httpserver import Error
28+
from .httpserver import ExtraOptions
2729
from .httpserver import HeaderValueMatcher
2830
from .httpserver import HTTPServer
2931
from .httpserver import HTTPServerError

pytest_httpserver/httpserver.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from contextlib import contextmanager
1919
from contextlib import suppress
2020
from copy import copy
21+
from dataclasses import dataclass
2122
from enum import Enum
2223
from http import HTTPStatus
2324
from re import Pattern
@@ -927,6 +928,13 @@ def format_host(host: str) -> str:
927928
return host
928929

929930

931+
@dataclass
932+
class ExtraOptions:
933+
default_waiting_settings: WaitingSettings | None = None
934+
threaded: bool = False
935+
startup_timeout: float | None = None
936+
937+
930938
class HTTPServer(HTTPServerBase): # pylint: disable=too-many-instance-attributes
931939
"""
932940
Server instance which manages handlers to serve pre-defined requests.
@@ -981,6 +989,19 @@ def __init__(
981989
self.startup_timeout = startup_timeout
982990
self._readiness_check_pending = False
983991

992+
@classmethod
993+
def with_extra_options(
994+
cls, host: str, port: int, ssl_context: SSLContext | None, extra_options: ExtraOptions
995+
) -> Self:
996+
return cls(
997+
host,
998+
port,
999+
ssl_context,
1000+
default_waiting_settings=extra_options.default_waiting_settings,
1001+
threaded=extra_options.threaded,
1002+
startup_timeout=extra_options.startup_timeout,
1003+
)
1004+
9841005
def start(self) -> None:
9851006
super().start()
9861007
self._readiness_check_pending = self.startup_timeout is not None

pytest_httpserver/pytest_plugin.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import pytest
77

8+
from .httpserver import ExtraOptions
89
from .httpserver import HTTPServer
910

1011
if TYPE_CHECKING:
@@ -44,18 +45,29 @@ def httpserver_ssl_context() -> None:
4445
return None
4546

4647

48+
@pytest.fixture(scope="session")
49+
def httpserver_extra_options() -> ExtraOptions:
50+
return ExtraOptions()
51+
52+
4753
@pytest.fixture(scope="session")
4854
def make_httpserver(
4955
httpserver_listen_address: tuple[str | None, int | None],
5056
httpserver_ssl_context: SSLContext | None,
57+
httpserver_extra_options: ExtraOptions,
5158
) -> Generator[HTTPServer, None, None]:
5259
host, port = httpserver_listen_address
5360
if not host:
5461
host = HTTPServer.DEFAULT_LISTEN_HOST
5562
if not port:
5663
port = HTTPServer.DEFAULT_LISTEN_PORT
5764

58-
server = HTTPServer(host=host, port=port, ssl_context=httpserver_ssl_context)
65+
server = HTTPServer.with_extra_options(
66+
host=host,
67+
port=port,
68+
ssl_context=httpserver_ssl_context,
69+
extra_options=httpserver_extra_options,
70+
)
5971
server.start()
6072
yield server
6173
server.clear()

tests/test_extra_options.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from inspect import signature
2+
3+
from pytest_httpserver import ExtraOptions
4+
from pytest_httpserver import HTTPServer
5+
from pytest_httpserver import WaitingSettings
6+
7+
8+
def test_httpserver_extra_options():
9+
extra_options = ExtraOptions(
10+
startup_timeout=60,
11+
threaded=True,
12+
default_waiting_settings=WaitingSettings(timeout=5),
13+
)
14+
15+
server = HTTPServer.with_extra_options(
16+
host="localhost",
17+
port=0,
18+
ssl_context=None,
19+
extra_options=extra_options,
20+
)
21+
22+
assert server.startup_timeout == 60
23+
assert server.threaded is True
24+
assert server.default_waiting_settings.timeout == 5
25+
26+
27+
def test_constructor_signature_matches_with_extra_options():
28+
# compares that ExtraOptions default values matches with HTTPServer
29+
# constructor defaults
30+
31+
httpserver_sig = signature(HTTPServer.__init__)
32+
extra_options_sig = signature(ExtraOptions.__init__)
33+
for param_name, extra_param in extra_options_sig.parameters.items():
34+
if param_name == "self":
35+
continue
36+
httpserver_param = httpserver_sig.parameters.get(param_name)
37+
assert httpserver_param is not None, f"Parameter {param_name} missing in HTTPServer"
38+
assert httpserver_param.default == extra_param.default, (
39+
f"Default value for parameter {param_name} does not match: "
40+
f"{httpserver_param.default} != {extra_param.default}"
41+
)

tests/test_release.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ def test_sdist_contents(build: Build, version: str):
216216
"conftest.py",
217217
"examples",
218218
"test_blocking_httpserver.py",
219+
"test_extra_options.py",
219220
"test_handler_errors.py",
220221
"test_headers.py",
221222
"test_hooks.py",

0 commit comments

Comments
 (0)