initial
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
import json
|
||||
import os
|
||||
import textwrap
|
||||
|
||||
import pytest
|
||||
import requests as _requests
|
||||
|
||||
BASE_URL = os.environ.get("WP_BASE_URL", "http://localhost/wordpress")
|
||||
|
||||
# Capture every HTTP exchange made during a test so we can print it on failure.
|
||||
_exchanges: list[_requests.Response] = []
|
||||
|
||||
_original_request = _requests.Session.request
|
||||
|
||||
|
||||
def _patched_request(self, method, url, **kwargs):
|
||||
resp = _original_request(self, method, url, **kwargs)
|
||||
_exchanges.append(resp)
|
||||
return resp
|
||||
|
||||
|
||||
_requests.Session.request = _patched_request # type: ignore[method-assign]
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def base_url():
|
||||
return BASE_URL
|
||||
|
||||
|
||||
@pytest.hookimpl(hookwrapper=True)
|
||||
def pytest_runtest_call(item): # noqa: ARG001
|
||||
_exchanges.clear()
|
||||
yield
|
||||
|
||||
|
||||
def _pretty(raw) -> str:
|
||||
try:
|
||||
return json.dumps(json.loads(raw), indent=2)
|
||||
except Exception:
|
||||
return raw if isinstance(raw, str) else raw.decode(errors="replace")
|
||||
|
||||
|
||||
@pytest.hookimpl(hookwrapper=True)
|
||||
def pytest_runtest_makereport(item, call): # noqa: ARG001
|
||||
outcome = yield
|
||||
report = outcome.get_result()
|
||||
|
||||
if not (report.failed and call.when == "call" and _exchanges):
|
||||
return
|
||||
|
||||
lines = []
|
||||
for i, resp in enumerate(_exchanges, 1):
|
||||
req = resp.request
|
||||
lines.append(f"[{i}] {req.method} {req.url}")
|
||||
if req.body:
|
||||
lines.append(textwrap.indent(_pretty(req.body), " req "))
|
||||
lines.append(f" {resp.status_code}")
|
||||
lines.append(textwrap.indent(_pretty(resp.text), " resp "))
|
||||
|
||||
report.sections.append(("HTTP", "\n".join(lines)))
|
||||
Reference in New Issue
Block a user