Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ build = "*"
wheel = "*"
twine = "*"
anaconda-client = "*"
fastapi = "*"

[requires]
python_version = "3"
2 changes: 1 addition & 1 deletion mocket/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@

__all__ = ("async_mocketize", "mocketize", "Mocket", "MocketEntry", "Mocketizer")

__version__ = "3.10.7"
__version__ = "3.10.8"
10 changes: 10 additions & 0 deletions mocket/mocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
true_gethostbyname = socket.gethostbyname
true_gethostname = socket.gethostname
true_getaddrinfo = socket.getaddrinfo
true_socketpair = socket.socketpair
true_ssl_wrap_socket = ssl.wrap_socket
true_ssl_socket = ssl.SSLSocket
true_ssl_context = ssl.SSLContext
Expand Down Expand Up @@ -136,6 +137,13 @@ def create_connection(address, timeout=None, source_address=None):
return s


def socketpair():
"""Returns a real socketpair() used by asyncio loop for supporting calls made by fastapi and similar services."""
import _socket

return _socket.socketpair()


def _hash_request(h, req):
return h(encode_to_bytes("".join(sorted(req.split("\r\n"))))).hexdigest()

Expand Down Expand Up @@ -488,6 +496,7 @@ def enable(namespace=None, truesocket_recording_dir=None):
] = lambda host, port, family=None, socktype=None, proto=None, flags=None: [
(2, 1, 6, "", (host, port))
]
socket.socketpair = socket.__dict__["socketpair"] = socketpair
ssl.wrap_socket = ssl.__dict__["wrap_socket"] = FakeSSLContext.wrap_socket
ssl.SSLContext = ssl.__dict__["SSLContext"] = FakeSSLContext
socket.inet_pton = socket.__dict__["inet_pton"] = lambda family, ip: byte_type(
Expand Down Expand Up @@ -520,6 +529,7 @@ def disable():
socket.gethostname = socket.__dict__["gethostname"] = true_gethostname
socket.gethostbyname = socket.__dict__["gethostbyname"] = true_gethostbyname
socket.getaddrinfo = socket.__dict__["getaddrinfo"] = true_getaddrinfo
socket.socketpair = socket.__dict__["socketpair"] = true_socketpair
ssl.wrap_socket = ssl.__dict__["wrap_socket"] = true_ssl_wrap_socket
ssl.SSLContext = ssl.__dict__["SSLContext"] = true_ssl_context
socket.inet_pton = socket.__dict__["inet_pton"] = true_inet_pton
Expand Down
29 changes: 28 additions & 1 deletion tests/tests37/test_httpx.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import httpx
import pytest
from fastapi import FastAPI
from fastapi.testclient import TestClient

from mocket import Mocketizer, async_mocketize
from mocket import Mocketizer, async_mocketize, mocketize
from mocket.mockhttp import Entry


Expand Down Expand Up @@ -48,3 +50,28 @@ async def test_httpx_fixture(httpx_client):
response = await client.get(url)

assert response.json() == data


def create_app() -> FastAPI:
app = FastAPI()

@app.get("/")
async def read_main() -> dict:
async with httpx.AsyncClient() as client:
r = await client.get("https://example.org/")
return r.json()

return app


@mocketize
def test_call_from_fastapi() -> None:
app = create_app()
client = TestClient(app)

Entry.single_register(Entry.GET, "https://example.org/", body='{"id": 1}')

response = client.get("/")

assert response.status_code == 200
assert response.json() == {"id": 1}