Skip to content

Commit 29e723f

Browse files
authored
test: do not depend on example.com (#287)
1 parent f667863 commit 29e723f

File tree

4 files changed

+107
-24
lines changed

4 files changed

+107
-24
lines changed

tests/__init__.py

Whitespace-only changes.

tests/conftest.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414

1515
import sys
1616
import os
17+
import socket
18+
from typing import Generator, Optional, Type
19+
import pytest
20+
import threading
21+
import http.server
22+
import socketserver
1723

1824
pytest_plugins = ["pytester"]
1925

@@ -29,3 +35,72 @@
2935
playwright_browser_path = f"{user_profile}\\AppData\\Local\\ms-playwright"
3036

3137
os.environ["PLAYWRIGHT_BROWSERS_PATH"] = playwright_browser_path
38+
39+
40+
class HTTPTestServer:
41+
PREFIX = ""
42+
EMPTY_PAGE = ""
43+
44+
def __init__(self) -> None:
45+
self._server: Optional[socketserver.TCPServer] = None
46+
self._server_thread: Optional[threading.Thread] = None
47+
self._port: int = 0
48+
49+
def start(self) -> None:
50+
"""Start the test server."""
51+
52+
# Efficiently find an available port using a raw socket
53+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
54+
s.bind(("localhost", 0))
55+
self._port = s.getsockname()[1]
56+
57+
# Create the actual server
58+
self._server = socketserver.TCPServer(
59+
("localhost", self._port), self._create_handler()
60+
)
61+
self._server_thread = threading.Thread(target=self._server.serve_forever)
62+
self._server_thread.daemon = True
63+
self._server_thread.start()
64+
65+
self.PREFIX = f"http://localhost:{self._port}"
66+
self.EMPTY_PAGE = f"{self.PREFIX}/empty.html"
67+
self.CROSS_PROCESS_PREFIX = f"http://127.0.0.1:{self._port}"
68+
69+
def stop(self) -> None:
70+
"""Stop the test server."""
71+
if self._server:
72+
self._server.shutdown()
73+
self._server.server_close()
74+
75+
def _create_handler(self) -> Type[http.server.SimpleHTTPRequestHandler]:
76+
"""Create a request handler class."""
77+
78+
class SimpleHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
79+
def do_GET(self) -> None:
80+
"""Handle GET requests and return simple HTML with the path."""
81+
self.send_response(200)
82+
self.send_header("Content-type", "text/html")
83+
self.end_headers()
84+
85+
html_content = f"""<!DOCTYPE html>
86+
<html>
87+
<head>
88+
<title>Test Server</title>
89+
</head>
90+
<body>
91+
<h1>Test Server Response</h1>
92+
<p>Path: {self.path}</p>
93+
<span id="foo">bar</span>
94+
</body>
95+
</html>"""
96+
self.wfile.write(html_content.encode("utf-8"))
97+
98+
return SimpleHTTPRequestHandler
99+
100+
101+
@pytest.fixture(scope="session")
102+
def test_server() -> Generator[HTTPTestServer, None, None]:
103+
server = HTTPTestServer()
104+
server.start()
105+
yield server
106+
server.stop()

tests/test_asyncio.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import pytest
2121

22+
from tests.conftest import HTTPTestServer
23+
2224

2325
@pytest.fixture
2426
def pytester(pytester: pytest.Pytester) -> pytest.Pytester:
@@ -257,37 +259,39 @@ async def test_is_webkit(page, browser_name, is_chromium, is_firefox, is_webkit)
257259
result.assert_outcomes(passed=1)
258260

259261

260-
def test_goto(testdir: pytest.Testdir) -> None:
262+
def test_goto(testdir: pytest.Testdir, test_server: HTTPTestServer) -> None:
261263
testdir.makepyfile(
262-
"""
264+
f"""
263265
import pytest
264266
@pytest.mark.asyncio
265267
async def test_base_url(page, base_url):
266-
assert base_url == "https://example.com"
268+
assert base_url == "{test_server.PREFIX}"
267269
await page.goto("/foobar")
268-
assert page.url == "https://example.com/foobar"
269-
await page.goto("https://example.org")
270-
assert page.url == "https://example.org/"
270+
assert page.url == "{test_server.PREFIX}/foobar"
271+
await page.goto("{test_server.CROSS_PROCESS_PREFIX}")
272+
assert page.url == "{test_server.CROSS_PROCESS_PREFIX}/"
271273
"""
272274
)
273-
result = testdir.runpytest("--base-url", "https://example.com")
275+
result = testdir.runpytest("--base-url", test_server.PREFIX)
274276
result.assert_outcomes(passed=1)
275277

276278

277-
def test_base_url_via_fixture(testdir: pytest.Testdir) -> None:
279+
def test_base_url_via_fixture(
280+
testdir: pytest.Testdir, test_server: HTTPTestServer
281+
) -> None:
278282
testdir.makepyfile(
279-
"""
283+
f"""
280284
import pytest
281285
282286
@pytest.fixture(scope="session")
283287
def base_url():
284-
return "https://example.com"
288+
return "{test_server.PREFIX}"
285289
286290
@pytest.mark.asyncio
287291
async def test_base_url(page, base_url):
288-
assert base_url == "https://example.com"
292+
assert base_url == "{test_server.PREFIX}"
289293
await page.goto("/foobar")
290-
assert page.url == "https://example.com/foobar"
294+
assert page.url == "{test_server.PREFIX}/foobar"
291295
"""
292296
)
293297
result = testdir.runpytest()

tests/test_sync.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import pytest
2222

23+
from tests.conftest import HTTPTestServer
24+
2325

2426
@pytest.fixture
2527
def pytester(pytester: pytest.Pytester) -> pytest.Pytester:
@@ -283,34 +285,36 @@ def test_is_webkit(page, browser_name, is_chromium, is_firefox, is_webkit):
283285
result.assert_outcomes(passed=1)
284286

285287

286-
def test_goto(testdir: pytest.Testdir) -> None:
288+
def test_goto(testdir: pytest.Testdir, test_server: HTTPTestServer) -> None:
287289
testdir.makepyfile(
288-
"""
290+
f"""
289291
def test_base_url(page, base_url):
290-
assert base_url == "https://example.com"
292+
assert base_url == "{test_server.PREFIX}"
291293
page.goto("/foobar")
292-
assert page.url == "https://example.com/foobar"
293-
page.goto("https://example.org")
294-
assert page.url == "https://example.org/"
294+
assert page.url == "{test_server.PREFIX}/foobar"
295+
page.goto("{test_server.CROSS_PROCESS_PREFIX}")
296+
assert page.url == "{test_server.CROSS_PROCESS_PREFIX}/"
295297
"""
296298
)
297-
result = testdir.runpytest("--base-url", "https://example.com")
299+
result = testdir.runpytest("--base-url", test_server.PREFIX)
298300
result.assert_outcomes(passed=1)
299301

300302

301-
def test_base_url_via_fixture(testdir: pytest.Testdir) -> None:
303+
def test_base_url_via_fixture(
304+
testdir: pytest.Testdir, test_server: HTTPTestServer
305+
) -> None:
302306
testdir.makepyfile(
303-
"""
307+
f"""
304308
import pytest
305309
306310
@pytest.fixture(scope="session")
307311
def base_url():
308-
return "https://example.com"
312+
return "{test_server.PREFIX}"
309313
310314
def test_base_url(page, base_url):
311-
assert base_url == "https://example.com"
315+
assert base_url == "{test_server.PREFIX}"
312316
page.goto("/foobar")
313-
assert page.url == "https://example.com/foobar"
317+
assert page.url == "{test_server.PREFIX}/foobar"
314318
"""
315319
)
316320
result = testdir.runpytest()

0 commit comments

Comments
 (0)