diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b7a1e1f..4edd2b6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: exclude: helm/ args: [ --unsafe ] - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: "v0.11.2" + rev: "v0.11.11" hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] diff --git a/README.rst b/README.rst index b693dd7..e19a3d0 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,12 @@ mocket /mɔˈkɛt/ .. image:: https://img.shields.io/pypi/dm/mocket :target: https://pypistats.org/packages/mocket +.. image:: mocket.png + :height: 256px + :width: 256px + :alt: Mocket logo + :align: center + A socket mock framework ------------------------- @@ -101,7 +107,7 @@ As second step, we create an `example.py` file as the following one: import json from mocket import mocketize - from mocket.mockhttp import Entry + from mocket.mocks.mockhttp import Entry import requests import pytest @@ -294,7 +300,7 @@ Example: import pytest from mocket import async_mocketize - from mocket.mockhttp import Entry + from mocket.mocks.mockhttp import Entry from mocket.plugins.aiohttp_connector import MocketTCPConnector diff --git a/mocket.png b/mocket.png new file mode 100644 index 0000000..08498b4 Binary files /dev/null and b/mocket.png differ diff --git a/mocket/__init__.py b/mocket/__init__.py index e4bc008..5c3e7f0 100644 --- a/mocket/__init__.py +++ b/mocket/__init__.py @@ -31,4 +31,4 @@ "FakeSSLContext", ) -__version__ = "3.13.6" +__version__ = "3.13.7" diff --git a/mocket/socket.py b/mocket/socket.py index f8f77da..496c912 100644 --- a/mocket/socket.py +++ b/mocket/socket.py @@ -170,6 +170,11 @@ def makefile(self, mode: str = "r", bufsize: int = -1) -> MocketSocketIO: def get_entry(self, data: bytes) -> MocketEntry | None: return Mocket.get_entry(self._host, self._port, data) + def sendto(self, data: ReadableBuffer, address: Address | None = None) -> int: + self.connect(address) + self.sendall(data) + return len(data) + def sendall(self, data, entry=None, *args, **kwargs): if entry is None: entry = self.get_entry(data) @@ -204,6 +209,11 @@ def recv_into( buffer[: len(data)] = data return len(data) + def recvfrom( + self, buffersize: int, flags: int | None = None + ) -> tuple[bytes, _RetAddress]: + return self.recv(buffersize, flags), self._address + def recv(self, buffersize: int, flags: int | None = None) -> bytes: r_fd, _ = Mocket.get_pair((self._host, self._port)) if r_fd: diff --git a/pyproject.toml b/pyproject.toml index 5349ad6..66b394b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ dependencies = [ dynamic = ["version"] [project.urls] -Homepage = "https://github.com/mindflayer/python-mocket" +Homepage = "https://pypi.org/project/mocket" Repository = "https://github.com/mindflayer/python-mocket" [project.optional-dependencies] diff --git a/tests/test_socket.py b/tests/test_socket.py index 112a908..4c362f5 100644 --- a/tests/test_socket.py +++ b/tests/test_socket.py @@ -2,6 +2,7 @@ import pytest +from mocket import Mocket, MocketEntry, mocketize from mocket.socket import MocketSocket @@ -11,3 +12,21 @@ def test_blocking_socket(blocking): sock.connect(("locahost", 1234)) sock.setblocking(blocking) assert sock.getblocking() is blocking + + +@mocketize +def test_udp_socket(): + host = "127.0.0.1" + port = 9999 + request_data = b"ping" + response_data = b"pong" + + Mocket.register(MocketEntry((host, port), [response_data])) + + # Your UDP client code + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.sendto(request_data, (host, port)) + data, address = sock.recvfrom(1024) + + assert data == response_data + assert address == (host, port)