1
0
forked from pool/python-mocket

Accepting request 1065962 from devel:languages:python

- add these commits as patches from the upstream PR:
    0007-Switching-to-httptools.parser.HttpRequestParser.patch
    0008-Disabling-tests-for-pook-when-testing-Python-3.11.patch
    0009-Removing-DeprecationWarning-all-over-the-place.patch
    0010-Python-3.11-needs-an-async-decorator.patch
    0012-Removing-async-timeout-dependency.patch
    0013-Refactoring-using-event_loop-fixture.patch
    0014-Refactoring-using-tempfile-as-a-context-manager.patch
    0015-Skip-those-tests-and-see-what-happens-to-the-rest.patch
- skip now failing tests, update buildrequires for tests on py 3.11

OBS-URL: https://build.opensuse.org/request/show/1065962
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-mocket?expand=0&rev=25
This commit is contained in:
Dominique Leuenberger 2023-02-18 16:10:14 +00:00 committed by Git OBS Bridge
commit cf1eee5618
10 changed files with 1757 additions and 2 deletions

View File

@ -0,0 +1,150 @@
From dbf7b8d2ce480285ec30c682eb746d912d1304a3 Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Mon, 5 Dec 2022 00:54:16 +0100
Subject: [PATCH 07/15] Switching to `httptools.parser.HttpRequestParser`.
---
Pipfile | 2 +-
mocket/mockhttp.py | 71 +++++++++++++++++++---------
mocket/plugins/httpretty/__init__.py | 10 ++--
tests/main/test_http.py | 2 +-
4 files changed, 56 insertions(+), 29 deletions(-)
Index: mocket-3.10.9/mocket/mockhttp.py
===================================================================
--- mocket-3.10.9.orig/mocket/mockhttp.py
+++ mocket-3.10.9/mocket/mockhttp.py
@@ -3,13 +3,10 @@ import time
from http.server import BaseHTTPRequestHandler
from urllib.parse import parse_qs, unquote, urlsplit
-from .compat import decode_from_bytes, do_the_magic, encode_to_bytes
-from .mocket import Mocket, MocketEntry
+from httptools.parser import HttpRequestParser
-try:
- from http_parser.parser import HttpParser
-except ImportError:
- from http_parser.pyparser import HttpParser
+from .compat import ENCODING, decode_from_bytes, do_the_magic, encode_to_bytes
+from .mocket import Mocket, MocketEntry
try:
import magic
@@ -21,31 +18,59 @@ STATUS = {k: v[0] for k, v in BaseHTTPRe
CRLF = "\r\n"
+class Protocol:
+ def __init__(self):
+ self.url = None
+ self.body = None
+ self.headers = {}
+
+ def on_header(self, name: bytes, value: bytes):
+ self.headers[name.decode("ascii")] = value.decode("ascii")
+
+ def on_body(self, body: bytes):
+ try:
+ self.body = body.decode(ENCODING)
+ except UnicodeDecodeError:
+ self.body = body
+
+ def on_url(self, url: bytes):
+ self.url = url.decode("ascii")
+
+
class Request:
- parser = None
- _body = None
+ _protocol = None
+ _parser = None
def __init__(self, data):
- self.parser = HttpParser()
- self.parser.execute(data, len(data))
-
- self.method = self.parser.get_method()
- self.path = self.parser.get_path()
- self.headers = self.parser.get_headers()
- self.querystring = parse_qs(
- unquote(self.parser.get_query_string()), keep_blank_values=True
- )
- if self.querystring:
- self.path += "?{}".format(self.parser.get_query_string())
+ self._protocol = Protocol()
+ self._parser = HttpRequestParser(self._protocol)
+ self.add_data(data)
def add_data(self, data):
- self.parser.execute(data, len(data))
+ self._parser.feed_data(data)
+
+ @property
+ def method(self):
+ return self._parser.get_method().decode("ascii")
+
+ @property
+ def path(self):
+ return self._protocol.url
+
+ @property
+ def headers(self):
+ return self._protocol.headers
+
+ @property
+ def querystring(self):
+ parts = self._protocol.url.split("?", 1)
+ if len(parts) == 2:
+ return parse_qs(unquote(parts[1]), keep_blank_values=True)
+ return {}
@property
def body(self):
- if self._body is None:
- self._body = decode_from_bytes(self.parser.recv_body())
- return self._body
+ return self._protocol.body
def __str__(self):
return "{} - {} - {}".format(self.method, self.path, self.headers)
Index: mocket-3.10.9/mocket/plugins/httpretty/__init__.py
===================================================================
--- mocket-3.10.9.orig/mocket/plugins/httpretty/__init__.py
+++ mocket-3.10.9/mocket/plugins/httpretty/__init__.py
@@ -1,6 +1,6 @@
from mocket import Mocket, mocketize
from mocket.async_mocket import async_mocketize
-from mocket.compat import byte_type, text_type
+from mocket.compat import ENCODING, byte_type, text_type
from mocket.mockhttp import Entry as MocketHttpEntry
from mocket.mockhttp import Request as MocketHttpRequest
from mocket.mockhttp import Response as MocketHttpResponse
@@ -13,9 +13,11 @@ def httprettifier_headers(headers):
class Request(MocketHttpRequest):
@property
def body(self):
- if self._body is None:
- self._body = self.parser.recv_body()
- return self._body
+ return super().body.encode(ENCODING)
+
+ @property
+ def headers(self):
+ return httprettifier_headers(super().headers)
class Response(MocketHttpResponse):
Index: mocket-3.10.9/tests/main/test_http.py
===================================================================
--- mocket-3.10.9.orig/tests/main/test_http.py
+++ mocket-3.10.9/tests/main/test_http.py
@@ -23,7 +23,7 @@ class HttpTestCase(TestCase):
def assertEqualHeaders(self, first, second, msg=None):
first = {k.lower(): v for k, v in first.items()}
second = {k.lower(): v for k, v in second.items()}
- self.assertEqual(first, second, msg)
+ self.assertDictEqual(first, second, msg)
@pytest.mark.skipif('os.getenv("SKIP_TRUE_HTTP", False)')

View File

@ -0,0 +1,238 @@
From 5e0d8a8b75280372536bc85ea44b82e0acc841c4 Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Mon, 5 Dec 2022 01:08:23 +0100
Subject: [PATCH 08/15] Disabling tests for `pook` when testing Python 3.11
---
mocket/plugins/pook_mock_engine.py | 147 +++++++++++++++--------------
setup.py | 1 +
tests/main/test_pook.py | 47 ++++-----
3 files changed, 102 insertions(+), 93 deletions(-)
diff --git a/mocket/plugins/pook_mock_engine.py b/mocket/plugins/pook_mock_engine.py
index 5b1d207..8df8776 100644
--- a/mocket/plugins/pook_mock_engine.py
+++ b/mocket/plugins/pook_mock_engine.py
@@ -1,71 +1,76 @@
-from pook.engine import MockEngine
-from pook.interceptors.base import BaseInterceptor
-
-from mocket.mocket import Mocket
-from mocket.mockhttp import Entry, Response
-
-
-class MocketPookEntry(Entry):
- pook_request = None
- pook_engine = None
-
- def can_handle(self, data):
- can_handle = super(MocketPookEntry, self).can_handle(data)
-
- if can_handle:
- self.pook_engine.match(self.pook_request)
- return can_handle
-
- @classmethod
- def single_register(cls, method, uri, body='', status=200, headers=None, match_querystring=True):
- entry = cls(
- uri, method, Response(
- body=body, status=status, headers=headers
- ), match_querystring=match_querystring
- )
- Mocket.register(entry)
- return entry
-
-
-class MocketInterceptor(BaseInterceptor):
- @staticmethod
- def activate():
- Mocket.disable()
- Mocket.enable()
-
- @staticmethod
- def disable():
- Mocket.disable()
-
-
-class MocketEngine(MockEngine):
-
- def __init__(self, engine):
- def mocket_mock_fun(*args, **kwargs):
- mock = self.pook_mock_fun(*args, **kwargs)
-
- request = mock._request
- method = request.method
- url = request.rawurl
-
- response = mock._response
- body = response._body
- status = response._status
- headers = response._headers
-
- entry = MocketPookEntry.single_register(method, url, body, status, headers)
- entry.pook_engine = self.engine
- entry.pook_request = request
-
- return mock
-
- # Store plugins engine
- self.engine = engine
- # Store HTTP client interceptors
- self.interceptors = []
- # Self-register MocketInterceptor
- self.add_interceptor(MocketInterceptor)
-
- # mocking pook.mock()
- self.pook_mock_fun = self.engine.mock
- self.engine.mock = mocket_mock_fun
+import platform
+
+if not platform.python_version().startswith("3.11."):
+ # it looks like `pook` is not compatible with Python 3.11
+ from pook.engine import MockEngine
+ from pook.interceptors.base import BaseInterceptor
+
+ from mocket.mocket import Mocket
+ from mocket.mockhttp import Entry, Response
+
+ class MocketPookEntry(Entry):
+ pook_request = None
+ pook_engine = None
+
+ def can_handle(self, data):
+ can_handle = super(MocketPookEntry, self).can_handle(data)
+
+ if can_handle:
+ self.pook_engine.match(self.pook_request)
+ return can_handle
+
+ @classmethod
+ def single_register(
+ cls, method, uri, body="", status=200, headers=None, match_querystring=True
+ ):
+ entry = cls(
+ uri,
+ method,
+ Response(body=body, status=status, headers=headers),
+ match_querystring=match_querystring,
+ )
+ Mocket.register(entry)
+ return entry
+
+ class MocketInterceptor(BaseInterceptor):
+ @staticmethod
+ def activate():
+ Mocket.disable()
+ Mocket.enable()
+
+ @staticmethod
+ def disable():
+ Mocket.disable()
+
+ class MocketEngine(MockEngine):
+ def __init__(self, engine):
+ def mocket_mock_fun(*args, **kwargs):
+ mock = self.pook_mock_fun(*args, **kwargs)
+
+ request = mock._request
+ method = request.method
+ url = request.rawurl
+
+ response = mock._response
+ body = response._body
+ status = response._status
+ headers = response._headers
+
+ entry = MocketPookEntry.single_register(
+ method, url, body, status, headers
+ )
+ entry.pook_engine = self.engine
+ entry.pook_request = request
+
+ return mock
+
+ # Store plugins engine
+ self.engine = engine
+ # Store HTTP client interceptors
+ self.interceptors = []
+ # Self-register MocketInterceptor
+ self.add_interceptor(MocketInterceptor)
+
+ # mocking pook.mock()
+ self.pook_mock_fun = self.engine.mock
+ self.engine.mock = mocket_mock_fun
diff --git a/setup.py b/setup.py
index 544e624..145fced 100644
--- a/setup.py
+++ b/setup.py
@@ -57,6 +57,7 @@ setup(
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Software Development",
diff --git a/tests/main/test_pook.py b/tests/main/test_pook.py
index 2d95d3d..2207e8f 100644
--- a/tests/main/test_pook.py
+++ b/tests/main/test_pook.py
@@ -1,30 +1,33 @@
-import pook
-import requests
+import platform
-from mocket.plugins.pook_mock_engine import MocketEngine
+if not platform.python_version().startswith("3.11."):
+ # it looks like `pook` is not compatible with Python 3.11
+ import pook
+ import requests
-pook.set_mock_engine(MocketEngine)
+ from mocket.plugins.pook_mock_engine import MocketEngine
+ pook.set_mock_engine(MocketEngine)
-@pook.on
-def test_pook_engine():
+ @pook.on
+ def test_pook_engine():
- url = "http://twitter.com/api/1/foobar"
- status = 404
- response_json = {"error": "foo"}
+ url = "http://twitter.com/api/1/foobar"
+ status = 404
+ response_json = {"error": "foo"}
- mock = pook.get(
- url,
- headers={"content-type": "application/json"},
- reply=status,
- response_json=response_json,
- )
- mock.persist()
+ mock = pook.get(
+ url,
+ headers={"content-type": "application/json"},
+ reply=status,
+ response_json=response_json,
+ )
+ mock.persist()
- requests.get(url)
- assert mock.calls == 1
+ requests.get(url)
+ assert mock.calls == 1
- resp = requests.get(url)
- assert resp.status_code == status
- assert resp.json() == response_json
- assert mock.calls == 2
+ resp = requests.get(url)
+ assert resp.status_code == status
+ assert resp.json() == response_json
+ assert mock.calls == 2
--
2.39.1

View File

@ -0,0 +1,188 @@
From 10cf45b071776cd36f9c7070f5d47a26ea010d7d Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Sat, 17 Dec 2022 12:09:48 +0100
Subject: [PATCH 09/15] Removing DeprecationWarning all over the place.
---
README.rst | 14 +++++++-------
tests/main/test_http_aiohttp.py | 16 ++++++++--------
tests/tests37/test_asyncio.py | 2 +-
tests/tests38/test_http_aiohttp.py | 10 +++++-----
4 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/README.rst b/README.rst
index 67cc956..a810dc1 100644
--- a/README.rst
+++ b/README.rst
@@ -249,12 +249,12 @@ Example:
async def main(l):
async with aiohttp.ClientSession(loop=l) as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 200
assert await get_response.text() == '{"origin": "127.0.0.1"}'
- loop = asyncio.get_event_loop()
+ loop = asyncio.new_event_loop()
loop.set_debug(True)
loop.run_until_complete(main(loop))
@@ -278,17 +278,17 @@ Example:
async def main(l):
async with aiohttp.ClientSession(loop=l) as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.post(url, data=body * 6) as post_response:
assert post_response.status == 201
assert await post_response.text() == body * 2
- loop = asyncio.get_event_loop()
+ loop = asyncio.new_event_loop()
loop.run_until_complete(main(loop))
# or again with a unittest.IsolatedAsyncioTestCase
@@ -303,12 +303,12 @@ Example:
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
async with aiohttp.ClientSession() as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.post(url, data=body * 6) as post_response:
assert post_response.status == 201
assert await post_response.text() == body * 2
diff --git a/tests/main/test_http_aiohttp.py b/tests/main/test_http_aiohttp.py
index 076fc93..6cfd2d8 100644
--- a/tests/main/test_http_aiohttp.py
+++ b/tests/main/test_http_aiohttp.py
@@ -20,19 +20,19 @@ class AioHttpEntryTestCase(TestCase):
async def main(_loop):
async with aiohttp.ClientSession(loop=_loop) as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.post(url, data=body * 6) as post_response:
assert post_response.status == 201
assert await post_response.text() == body * 2
assert Mocket.last_request().method == "POST"
assert Mocket.last_request().body == body * 6
- loop = asyncio.get_event_loop()
+ loop = asyncio.new_event_loop()
loop.set_debug(True)
loop.run_until_complete(main(loop))
self.assertEqual(len(Mocket.request_list()), 2)
@@ -46,17 +46,17 @@ class AioHttpEntryTestCase(TestCase):
async def main(_loop):
async with aiohttp.ClientSession(loop=_loop) as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.post(url, data=body * 6) as post_response:
assert post_response.status == 201
assert await post_response.text() == body * 2
- loop = asyncio.get_event_loop()
+ loop = asyncio.new_event_loop()
loop.set_debug(True)
loop.run_until_complete(main(loop))
self.assertEqual(len(Mocket.request_list()), 2)
@@ -72,11 +72,11 @@ class AioHttpEntryTestCase(TestCase):
async def main(_loop):
async with aiohttp.ClientSession(loop=_loop) as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 200
assert await get_response.text() == '{"origin": "127.0.0.1"}'
- loop = asyncio.get_event_loop()
+ loop = asyncio.new_event_loop()
loop.set_debug(True)
loop.run_until_complete(main(loop))
diff --git a/tests/tests37/test_asyncio.py b/tests/tests37/test_asyncio.py
index 9e6e0d4..66f8cc9 100644
--- a/tests/tests37/test_asyncio.py
+++ b/tests/tests37/test_asyncio.py
@@ -33,7 +33,7 @@ class AsyncIoRecordTestCase(TestCase):
writer.close()
await writer.wait_closed()
- loop = asyncio.get_event_loop()
+ loop = asyncio.new_event_loop()
loop.set_debug(True)
loop.run_until_complete(test_asyncio_connection())
diff --git a/tests/tests38/test_http_aiohttp.py b/tests/tests38/test_http_aiohttp.py
index fe3817f..348a7a0 100644
--- a/tests/tests38/test_http_aiohttp.py
+++ b/tests/tests38/test_http_aiohttp.py
@@ -19,12 +19,12 @@ class AioHttpEntryTestCase(IsolatedAsyncioTestCase):
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
async with aiohttp.ClientSession() as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.post(url, data=body * 6) as post_response:
assert post_response.status == 201
assert await post_response.text() == body * 2
@@ -41,12 +41,12 @@ class AioHttpEntryTestCase(IsolatedAsyncioTestCase):
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
async with aiohttp.ClientSession() as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.post(url, data=body * 6) as post_response:
assert post_response.status == 201
assert await post_response.text() == body * 2
@@ -63,7 +63,7 @@ class AioHttpEntryTestCase(IsolatedAsyncioTestCase):
)
async with aiohttp.ClientSession() as session:
- with async_timeout.timeout(3):
+ async with async_timeout.timeout(3):
async with session.get(url) as get_response:
assert get_response.status == 200
assert await get_response.text() == '{"origin": "127.0.0.1"}'
--
2.39.1

View File

@ -0,0 +1,170 @@
From 77f91f7fcff89291e16c2f5b9b7d904b975e1bbe Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Sat, 17 Dec 2022 12:39:31 +0100
Subject: [PATCH 10/15] Python 3.11 needs an async decorator.
---
tests/main/test_http_aiohttp.py | 127 +++++++++++++++++---------------
1 file changed, 66 insertions(+), 61 deletions(-)
Index: mocket-3.10.9/tests/main/test_http_aiohttp.py
===================================================================
--- mocket-3.10.9.orig/tests/main/test_http_aiohttp.py
+++ mocket-3.10.9/tests/main/test_http_aiohttp.py
@@ -1,5 +1,6 @@
import asyncio
import json
+import platform
from unittest import TestCase
import aiohttp
@@ -9,74 +10,78 @@ from mocket.mocket import Mocket, mocket
from mocket.mockhttp import Entry
from mocket.plugins.httpretty import HTTPretty, httprettified
-
-class AioHttpEntryTestCase(TestCase):
- @mocketize
- def test_http_session(self):
- url = "http://httpbin.org/ip"
- body = "asd" * 100
- Entry.single_register(Entry.GET, url, body=body, status=404)
- Entry.single_register(Entry.POST, url, body=body * 2, status=201)
-
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
- assert Mocket.last_request().method == "POST"
- assert Mocket.last_request().body == body * 6
-
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
- self.assertEqual(len(Mocket.request_list()), 2)
-
- @mocketize
- def test_https_session(self):
- url = "https://httpbin.org/ip"
- body = "asd" * 100
- Entry.single_register(Entry.GET, url, body=body, status=404)
- Entry.single_register(Entry.POST, url, body=body * 2, status=201)
-
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
-
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
- self.assertEqual(len(Mocket.request_list()), 2)
-
- @httprettified
- def test_httprettish_session(self):
- url = "https://httpbin.org/ip"
- HTTPretty.register_uri(
- HTTPretty.GET,
- url,
- body=json.dumps(dict(origin="127.0.0.1")),
- )
-
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 200
- assert await get_response.text() == '{"origin": "127.0.0.1"}'
-
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
+if not platform.python_version().startswith("3.11."):
+ # Python 3.11 needs async decorators, or aiohttp
+ # will fail with "Cannot write to closing transport"
+ class AioHttpEntryTestCase(TestCase):
+ @mocketize
+ def test_http_session(self):
+ url = "http://httpbin.org/ip"
+ body = "asd" * 100
+ Entry.single_register(Entry.GET, url, body=body, status=404)
+ Entry.single_register(Entry.POST, url, body=body * 2, status=201)
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(loop=_loop) as session:
+ async with async_timeout.timeout(3):
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with async_timeout.timeout(3):
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+ assert Mocket.last_request().method == "POST"
+ assert Mocket.last_request().body == body * 6
+
+ loop = asyncio.new_event_loop()
+ loop.set_debug(True)
+ loop.run_until_complete(main(loop))
+ self.assertEqual(len(Mocket.request_list()), 2)
+
+ @mocketize
+ def test_https_session(self):
+ url = "https://httpbin.org/ip"
+ body = "asd" * 100
+ Entry.single_register(Entry.GET, url, body=body, status=404)
+ Entry.single_register(Entry.POST, url, body=body * 2, status=201)
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(loop=_loop) as session:
+ async with async_timeout.timeout(3):
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with async_timeout.timeout(3):
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+
+ loop = asyncio.new_event_loop()
+ loop.set_debug(True)
+ loop.run_until_complete(main(loop))
+ self.assertEqual(len(Mocket.request_list()), 2)
+
+ @httprettified
+ def test_httprettish_session(self):
+ url = "https://httpbin.org/ip"
+ HTTPretty.register_uri(
+ HTTPretty.GET,
+ url,
+ body=json.dumps(dict(origin="127.0.0.1")),
+ )
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(loop=_loop) as session:
+ async with async_timeout.timeout(3):
+ async with session.get(url) as get_response:
+ assert get_response.status == 200
+ assert (
+ await get_response.text() == '{"origin": "127.0.0.1"}'
+ )
+
+ loop = asyncio.new_event_loop()
+ loop.set_debug(True)
+ loop.run_until_complete(main(loop))

View File

@ -0,0 +1,354 @@
From 6719547e1d3d5bb672258bc30fed835ddc659ce8 Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Sun, 18 Dec 2022 00:44:02 +0100
Subject: [PATCH 12/15] Removing `async-timeout` dependency.
---
Pipfile | 1 -
README.rst | 54 ++++++------
tests/main/test_http_aiohttp.py | 131 ++++++++++++++---------------
tests/tests38/test_http_aiohttp.py | 48 +++++------
4 files changed, 113 insertions(+), 121 deletions(-)
Index: mocket-3.10.9/README.rst
===================================================================
--- mocket-3.10.9.orig/README.rst
+++ mocket-3.10.9/README.rst
@@ -231,7 +231,6 @@ Example:
import aiohttp
import asyncio
- import async_timeout
from unittest import TestCase
from mocket.plugins.httpretty import httpretty, httprettified
@@ -248,11 +247,12 @@ Example:
)
async def main(l):
- async with aiohttp.ClientSession(loop=l) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 200
- assert await get_response.text() == '{"origin": "127.0.0.1"}'
+ async with aiohttp.ClientSession(
+ loop=l, timeout=aiohttp.ClientTimeout(total=3)
+ ) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 200
+ assert await get_response.text() == '{"origin": "127.0.0.1"}'
loop = asyncio.new_event_loop()
loop.set_debug(True)
@@ -277,16 +277,16 @@ Example:
Entry.single_register(Entry.POST, url, body=body*2, status=201)
async def main(l):
- async with aiohttp.ClientSession(loop=l) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
+ async with aiohttp.ClientSession(
+ loop=l, timeout=aiohttp.ClientTimeout(total=3)
+ ) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
loop = asyncio.new_event_loop()
loop.run_until_complete(main(loop))
@@ -302,18 +302,18 @@ Example:
Entry.single_register(Entry.GET, url, body=body, status=404)
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
- async with aiohttp.ClientSession() as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
- assert Mocket.last_request().method == 'POST'
- assert Mocket.last_request().body == body * 6
+ async with aiohttp.ClientSession(
+ timeout=aiohttp.ClientTimeout(total=3)
+ ) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+ assert Mocket.last_request().method == 'POST'
+ assert Mocket.last_request().body == body * 6
Works well with others
Index: mocket-3.10.9/tests/main/test_http_aiohttp.py
===================================================================
--- mocket-3.10.9.orig/tests/main/test_http_aiohttp.py
+++ mocket-3.10.9/tests/main/test_http_aiohttp.py
@@ -1,87 +1,84 @@
import asyncio
import json
-import platform
from unittest import TestCase
import aiohttp
-import async_timeout
from mocket.mocket import Mocket, mocketize
from mocket.mockhttp import Entry
from mocket.plugins.httpretty import HTTPretty, httprettified
-if not platform.python_version().startswith("3.11."):
- # Python 3.11 needs async decorators, or aiohttp
- # will fail with "Cannot write to closing transport"
- class AioHttpEntryTestCase(TestCase):
- @mocketize
- def test_http_session(self):
- url = "http://httpbin.org/ip"
- body = "asd" * 100
- Entry.single_register(Entry.GET, url, body=body, status=404)
- Entry.single_register(Entry.POST, url, body=body * 2, status=201)
-
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
- assert Mocket.last_request().method == "POST"
- assert Mocket.last_request().body == body * 6
-
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
- self.assertEqual(len(Mocket.request_list()), 2)
-
- @mocketize
- def test_https_session(self):
- url = "https://httpbin.org/ip"
- body = "asd" * 100
- Entry.single_register(Entry.GET, url, body=body, status=404)
- Entry.single_register(Entry.POST, url, body=body * 2, status=201)
-
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
-
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
- self.assertEqual(len(Mocket.request_list()), 2)
-
- @httprettified
- def test_httprettish_session(self):
- url = "https://httpbin.org/ip"
- HTTPretty.register_uri(
- HTTPretty.GET,
- url,
- body=json.dumps(dict(origin="127.0.0.1")),
- )
-
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop) as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 200
- assert (
- await get_response.text() == '{"origin": "127.0.0.1"}'
- )
-
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
+
+class AioHttpEntryTestCase(TestCase):
+ timeout = aiohttp.ClientTimeout(total=3)
+
+ @mocketize
+ def test_http_session(self):
+ url = "http://httpbin.org/ip"
+ body = "asd" * 100
+ Entry.single_register(Entry.GET, url, body=body, status=404)
+ Entry.single_register(Entry.POST, url, body=body * 2, status=201)
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(
+ loop=_loop, timeout=self.timeout
+ ) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+ assert Mocket.last_request().method == "POST"
+ assert Mocket.last_request().body == body * 6
+
+ loop = asyncio.new_event_loop()
+ loop.set_debug(True)
+ loop.run_until_complete(main(loop))
+ self.assertEqual(len(Mocket.request_list()), 2)
+
+ @mocketize
+ def test_https_session(self):
+ url = "https://httpbin.org/ip"
+ body = "asd" * 100
+ Entry.single_register(Entry.GET, url, body=body, status=404)
+ Entry.single_register(Entry.POST, url, body=body * 2, status=201)
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(
+ loop=_loop, timeout=self.timeout
+ ) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+
+ loop = asyncio.new_event_loop()
+ loop.set_debug(True)
+ loop.run_until_complete(main(loop))
+ self.assertEqual(len(Mocket.request_list()), 2)
+
+ @httprettified
+ def test_httprettish_session(self):
+ url = "https://httpbin.org/ip"
+ HTTPretty.register_uri(
+ HTTPretty.GET,
+ url,
+ body=json.dumps(dict(origin="127.0.0.1")),
+ )
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(
+ loop=_loop, timeout=self.timeout
+ ) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 200
+ assert await get_response.text() == '{"origin": "127.0.0.1"}'
+
+ loop = asyncio.new_event_loop()
+ loop.set_debug(True)
+ loop.run_until_complete(main(loop))
Index: mocket-3.10.9/tests/tests38/test_http_aiohttp.py
===================================================================
--- mocket-3.10.9.orig/tests/tests38/test_http_aiohttp.py
+++ mocket-3.10.9/tests/tests38/test_http_aiohttp.py
@@ -2,7 +2,6 @@ import json
from unittest import IsolatedAsyncioTestCase
import aiohttp
-import async_timeout
from mocket.async_mocket import async_mocketize
from mocket.mocket import Mocket
@@ -11,6 +10,8 @@ from mocket.plugins.httpretty import HTT
class AioHttpEntryTestCase(IsolatedAsyncioTestCase):
+ timeout = aiohttp.ClientTimeout(total=3)
+
@async_mocketize
async def test_http_session(self):
url = "http://httpbin.org/ip"
@@ -18,18 +19,16 @@ class AioHttpEntryTestCase(IsolatedAsync
Entry.single_register(Entry.GET, url, body=body, status=404)
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
- async with aiohttp.ClientSession() as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
- assert Mocket.last_request().method == "POST"
- assert Mocket.last_request().body == body * 6
+ async with aiohttp.ClientSession(timeout=self.timeout) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+ assert Mocket.last_request().method == "POST"
+ assert Mocket.last_request().body == body * 6
self.assertEqual(len(Mocket.request_list()), 2)
@@ -40,16 +39,14 @@ class AioHttpEntryTestCase(IsolatedAsync
Entry.single_register(Entry.GET, url, body=body, status=404)
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
- async with aiohttp.ClientSession() as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with async_timeout.timeout(3):
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
+ async with aiohttp.ClientSession(timeout=self.timeout) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
self.assertEqual(len(Mocket.request_list()), 2)
@@ -62,8 +59,7 @@ class AioHttpEntryTestCase(IsolatedAsync
body=json.dumps(dict(origin="127.0.0.1")),
)
- async with aiohttp.ClientSession() as session:
- async with async_timeout.timeout(3):
- async with session.get(url) as get_response:
- assert get_response.status == 200
- assert await get_response.text() == '{"origin": "127.0.0.1"}'
+ async with aiohttp.ClientSession(timeout=self.timeout) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 200
+ assert await get_response.text() == '{"origin": "127.0.0.1"}'

View File

@ -0,0 +1,95 @@
From 63120c44526e31e22c16c9d8029a715eef38e145 Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Tue, 27 Dec 2022 15:38:02 +0100
Subject: [PATCH 13/15] Refactoring using `event_loop` fixture.
---
tests/main/test_http_aiohttp.py | 19 ++++++-------------
tests/tests37/test_asyncio.py | 6 ++----
2 files changed, 8 insertions(+), 17 deletions(-)
diff --git a/tests/main/test_http_aiohttp.py b/tests/main/test_http_aiohttp.py
index a98cb37..ab72397 100644
--- a/tests/main/test_http_aiohttp.py
+++ b/tests/main/test_http_aiohttp.py
@@ -1,4 +1,3 @@
-import asyncio
import json
from unittest import TestCase
@@ -13,7 +12,7 @@ class AioHttpEntryTestCase(TestCase):
timeout = aiohttp.ClientTimeout(total=3)
@mocketize
- def test_http_session(self):
+ def test_http_session(self, event_loop):
url = "http://httpbin.org/ip"
body = "asd" * 100
Entry.single_register(Entry.GET, url, body=body, status=404)
@@ -33,13 +32,11 @@ class AioHttpEntryTestCase(TestCase):
assert Mocket.last_request().method == "POST"
assert Mocket.last_request().body == body * 6
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
+ event_loop.run_until_complete(main(event_loop))
self.assertEqual(len(Mocket.request_list()), 2)
@mocketize
- def test_https_session(self):
+ def test_https_session(self, event_loop):
url = "https://httpbin.org/ip"
body = "asd" * 100
Entry.single_register(Entry.GET, url, body=body, status=404)
@@ -57,13 +54,11 @@ class AioHttpEntryTestCase(TestCase):
assert post_response.status == 201
assert await post_response.text() == body * 2
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
+ event_loop.run_until_complete(main(event_loop))
self.assertEqual(len(Mocket.request_list()), 2)
@httprettified
- def test_httprettish_session(self):
+ def test_httprettish_session(self, event_loop):
url = "https://httpbin.org/ip"
HTTPretty.register_uri(
HTTPretty.GET,
@@ -79,6 +74,4 @@ class AioHttpEntryTestCase(TestCase):
assert get_response.status == 200
assert await get_response.text() == '{"origin": "127.0.0.1"}'
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(main(loop))
+ event_loop.run_until_complete(main(event_loop))
diff --git a/tests/tests37/test_asyncio.py b/tests/tests37/test_asyncio.py
index 66f8cc9..72b3a0e 100644
--- a/tests/tests37/test_asyncio.py
+++ b/tests/tests37/test_asyncio.py
@@ -14,7 +14,7 @@ class AsyncIoRecordTestCase(TestCase):
temp_dir = tempfile.mkdtemp()
@mocketize(truesocket_recording_dir=temp_dir)
- def test_asyncio_record_replay(self):
+ def test_asyncio_record_replay(self, event_loop):
async def test_asyncio_connection():
reader, writer = await asyncio.open_connection(
host="google.com",
@@ -33,9 +33,7 @@ class AsyncIoRecordTestCase(TestCase):
writer.close()
await writer.wait_closed()
- loop = asyncio.new_event_loop()
- loop.set_debug(True)
- loop.run_until_complete(test_asyncio_connection())
+ event_loop.run_until_complete(test_asyncio_connection())
files = glob.glob(f"{self.temp_dir}/*.json")
self.assertEqual(len(files), 1)
--
2.39.1

View File

@ -0,0 +1,421 @@
From 5c718f123517ce02fced64677825d1ff3a4684c5 Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Wed, 28 Dec 2022 09:43:58 +0100
Subject: [PATCH 14/15] Refactoring using `tempfile` as a context manager.
---
tests/main/test_http.py | 96 ++++++++++++-----------
tests/main/test_http_aiohttp.py | 130 +++++++++++++++-----------------
tests/main/test_https.py | 31 ++++----
tests/main/test_mocket.py | 6 +-
tests/tests37/test_asyncio.py | 52 ++++++-------
5 files changed, 154 insertions(+), 161 deletions(-)
diff --git a/tests/main/test_http.py b/tests/main/test_http.py
index f1893be..60a54fb 100644
--- a/tests/main/test_http.py
+++ b/tests/main/test_http.py
@@ -13,11 +13,9 @@ from urllib.request import urlopen
import pytest
import requests
-from mocket import Mocket, mocketize
+from mocket import Mocket, Mocketizer, mocketize
from mocket.mockhttp import Entry, Response
-recording_directory = tempfile.mkdtemp()
-
class HttpTestCase(TestCase):
def assertEqualHeaders(self, first, second, msg=None):
@@ -36,57 +34,63 @@ class TrueHttpEntryTestCase(HttpTestCase):
resp = requests.get(url)
self.assertEqual(resp.status_code, 200)
- @mocketize(truesocket_recording_dir=recording_directory)
def test_truesendall_with_recording(self):
- url = "http://httpbin.org/ip"
-
- urlopen(url)
- requests.get(url)
- resp = urlopen(url)
- self.assertEqual(resp.code, 200)
- resp = requests.get(url)
- self.assertEqual(resp.status_code, 200)
- assert "origin" in resp.json()
-
- dump_filename = os.path.join(
- Mocket.get_truesocket_recording_dir(), Mocket.get_namespace() + ".json"
- )
- with io.open(dump_filename) as f:
- responses = json.load(f)
+ with tempfile.TemporaryDirectory() as temp_dir:
+ with Mocketizer(truesocket_recording_dir=temp_dir):
+ url = "http://httpbin.org/ip"
+
+ urlopen(url)
+ requests.get(url)
+ resp = urlopen(url)
+ self.assertEqual(resp.code, 200)
+ resp = requests.get(url)
+ self.assertEqual(resp.status_code, 200)
+ assert "origin" in resp.json()
+
+ dump_filename = os.path.join(
+ Mocket.get_truesocket_recording_dir(),
+ Mocket.get_namespace() + ".json",
+ )
+ with io.open(dump_filename) as f:
+ responses = json.load(f)
+
+ self.assertEqual(len(responses["httpbin.org"]["80"].keys()), 2)
- self.assertEqual(len(responses["httpbin.org"]["80"].keys()), 2)
-
- @mocketize(truesocket_recording_dir=recording_directory)
def test_truesendall_with_gzip_recording(self):
- url = "http://httpbin.org/gzip"
+ with tempfile.TemporaryDirectory() as temp_dir:
+ with Mocketizer(truesocket_recording_dir=temp_dir):
+ url = "http://httpbin.org/gzip"
- requests.get(url)
- resp = requests.get(url)
- self.assertEqual(resp.status_code, 200)
+ requests.get(url)
+ resp = requests.get(url)
+ self.assertEqual(resp.status_code, 200)
- dump_filename = os.path.join(
- Mocket.get_truesocket_recording_dir(), Mocket.get_namespace() + ".json"
- )
- with io.open(dump_filename) as f:
- responses = json.load(f)
+ dump_filename = os.path.join(
+ Mocket.get_truesocket_recording_dir(),
+ Mocket.get_namespace() + ".json",
+ )
+ with io.open(dump_filename) as f:
+ responses = json.load(f)
- assert len(responses["httpbin.org"]["80"].keys()) == 1
+ assert len(responses["httpbin.org"]["80"].keys()) == 1
- @mocketize(truesocket_recording_dir=recording_directory)
def test_truesendall_with_chunk_recording(self):
- url = "http://httpbin.org/range/70000?chunk_size=65536"
-
- requests.get(url)
- resp = requests.get(url)
- self.assertEqual(resp.status_code, 200)
-
- dump_filename = os.path.join(
- Mocket.get_truesocket_recording_dir(), Mocket.get_namespace() + ".json"
- )
- with io.open(dump_filename) as f:
- responses = json.load(f)
-
- assert len(responses["httpbin.org"]["80"].keys()) == 1
+ with tempfile.TemporaryDirectory() as temp_dir:
+ with Mocketizer(truesocket_recording_dir=temp_dir):
+ url = "http://httpbin.org/range/70000?chunk_size=65536"
+
+ requests.get(url)
+ resp = requests.get(url)
+ self.assertEqual(resp.status_code, 200)
+
+ dump_filename = os.path.join(
+ Mocket.get_truesocket_recording_dir(),
+ Mocket.get_namespace() + ".json",
+ )
+ with io.open(dump_filename) as f:
+ responses = json.load(f)
+
+ assert len(responses["httpbin.org"]["80"].keys()) == 1
@mocketize
def test_wrongpath_truesendall(self):
diff --git a/tests/main/test_http_aiohttp.py b/tests/main/test_http_aiohttp.py
index ab72397..b8539eb 100644
--- a/tests/main/test_http_aiohttp.py
+++ b/tests/main/test_http_aiohttp.py
@@ -1,5 +1,4 @@
import json
-from unittest import TestCase
import aiohttp
@@ -7,71 +6,66 @@ from mocket.mocket import Mocket, mocketize
from mocket.mockhttp import Entry
from mocket.plugins.httpretty import HTTPretty, httprettified
+timeout = aiohttp.ClientTimeout(total=3)
-class AioHttpEntryTestCase(TestCase):
- timeout = aiohttp.ClientTimeout(total=3)
-
- @mocketize
- def test_http_session(self, event_loop):
- url = "http://httpbin.org/ip"
- body = "asd" * 100
- Entry.single_register(Entry.GET, url, body=body, status=404)
- Entry.single_register(Entry.POST, url, body=body * 2, status=201)
-
- async def main(_loop):
- async with aiohttp.ClientSession(
- loop=_loop, timeout=self.timeout
- ) as session:
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
- assert Mocket.last_request().method == "POST"
- assert Mocket.last_request().body == body * 6
-
- event_loop.run_until_complete(main(event_loop))
- self.assertEqual(len(Mocket.request_list()), 2)
-
- @mocketize
- def test_https_session(self, event_loop):
- url = "https://httpbin.org/ip"
- body = "asd" * 100
- Entry.single_register(Entry.GET, url, body=body, status=404)
- Entry.single_register(Entry.POST, url, body=body * 2, status=201)
-
- async def main(_loop):
- async with aiohttp.ClientSession(
- loop=_loop, timeout=self.timeout
- ) as session:
- async with session.get(url) as get_response:
- assert get_response.status == 404
- assert await get_response.text() == body
-
- async with session.post(url, data=body * 6) as post_response:
- assert post_response.status == 201
- assert await post_response.text() == body * 2
-
- event_loop.run_until_complete(main(event_loop))
- self.assertEqual(len(Mocket.request_list()), 2)
-
- @httprettified
- def test_httprettish_session(self, event_loop):
- url = "https://httpbin.org/ip"
- HTTPretty.register_uri(
- HTTPretty.GET,
- url,
- body=json.dumps(dict(origin="127.0.0.1")),
- )
-
- async def main(_loop):
- async with aiohttp.ClientSession(
- loop=_loop, timeout=self.timeout
- ) as session:
- async with session.get(url) as get_response:
- assert get_response.status == 200
- assert await get_response.text() == '{"origin": "127.0.0.1"}'
-
- event_loop.run_until_complete(main(event_loop))
+
+@mocketize
+def test_http_session(event_loop):
+ url = "http://httpbin.org/ip"
+ body = "asd" * 100
+ Entry.single_register(Entry.GET, url, body=body, status=404)
+ Entry.single_register(Entry.POST, url, body=body * 2, status=201)
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(loop=_loop, timeout=timeout) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+ assert Mocket.last_request().method == "POST"
+ assert Mocket.last_request().body == body * 6
+
+ event_loop.run_until_complete(main(event_loop))
+ assert len(Mocket.request_list()) == 2
+
+
+@mocketize
+def test_https_session(event_loop):
+ url = "https://httpbin.org/ip"
+ body = "asd" * 100
+ Entry.single_register(Entry.GET, url, body=body, status=404)
+ Entry.single_register(Entry.POST, url, body=body * 2, status=201)
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(loop=_loop, timeout=timeout) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 404
+ assert await get_response.text() == body
+
+ async with session.post(url, data=body * 6) as post_response:
+ assert post_response.status == 201
+ assert await post_response.text() == body * 2
+
+ event_loop.run_until_complete(main(event_loop))
+ assert len(Mocket.request_list()) == 2
+
+
+@httprettified
+def test_httprettish_session(event_loop):
+ url = "https://httpbin.org/ip"
+ HTTPretty.register_uri(
+ HTTPretty.GET,
+ url,
+ body=json.dumps(dict(origin="127.0.0.1")),
+ )
+
+ async def main(_loop):
+ async with aiohttp.ClientSession(loop=_loop, timeout=timeout) as session:
+ async with session.get(url) as get_response:
+ assert get_response.status == 200
+ assert await get_response.text() == '{"origin": "127.0.0.1"}'
+
+ event_loop.run_until_complete(main(event_loop))
diff --git a/tests/main/test_https.py b/tests/main/test_https.py
index 0a54e32..10652b5 100644
--- a/tests/main/test_https.py
+++ b/tests/main/test_https.py
@@ -42,22 +42,23 @@ recording_directory = tempfile.mkdtemp()
@pytest.mark.skipif('os.getenv("SKIP_TRUE_HTTP", False)')
-@mocketize(truesocket_recording_dir=recording_directory)
def test_truesendall_with_recording_https():
- url = "https://httpbin.org/ip"
-
- requests.get(url, headers={"Accept": "application/json"})
- resp = requests.get(url, headers={"Accept": "application/json"})
- assert resp.status_code == 200
-
- dump_filename = os.path.join(
- Mocket.get_truesocket_recording_dir(),
- Mocket.get_namespace() + ".json",
- )
- with io.open(dump_filename) as f:
- responses = json.load(f)
-
- assert len(responses["httpbin.org"]["443"].keys()) == 1
+ with tempfile.TemporaryDirectory() as temp_dir:
+ with Mocketizer(truesocket_recording_dir=temp_dir):
+ url = "https://httpbin.org/ip"
+
+ requests.get(url, headers={"Accept": "application/json"})
+ resp = requests.get(url, headers={"Accept": "application/json"})
+ assert resp.status_code == 200
+
+ dump_filename = os.path.join(
+ Mocket.get_truesocket_recording_dir(),
+ Mocket.get_namespace() + ".json",
+ )
+ with io.open(dump_filename) as f:
+ responses = json.load(f)
+
+ assert len(responses["httpbin.org"]["443"].keys()) == 1
@pytest.mark.skipif('os.getenv("SKIP_TRUE_HTTP", False)')
diff --git a/tests/main/test_mocket.py b/tests/main/test_mocket.py
index 67ad337..14057b1 100644
--- a/tests/main/test_mocket.py
+++ b/tests/main/test_mocket.py
@@ -174,13 +174,13 @@ def test_mocketize_outside_a_test_class():
@pytest.fixture
-def fixture():
+def two():
return 2
@mocketize
-def test_mocketize_with_fixture(fixture):
- assert 2 == fixture
+def test_mocketize_with_fixture(two):
+ assert 2 == two
@mocketize
diff --git a/tests/tests37/test_asyncio.py b/tests/tests37/test_asyncio.py
index 72b3a0e..c90bcb8 100644
--- a/tests/tests37/test_asyncio.py
+++ b/tests/tests37/test_asyncio.py
@@ -2,45 +2,39 @@ import asyncio
import glob
import io
import json
-import shutil
import socket
import tempfile
-from unittest import TestCase
-from mocket.mocket import mocketize
+from mocket import Mocketizer
-class AsyncIoRecordTestCase(TestCase):
- temp_dir = tempfile.mkdtemp()
+def test_asyncio_record_replay(event_loop):
+ async def test_asyncio_connection():
+ reader, writer = await asyncio.open_connection(
+ host="google.com",
+ port=80,
+ family=socket.AF_INET,
+ proto=socket.IPPROTO_TCP,
+ ssl=None,
+ server_hostname=None,
+ )
- @mocketize(truesocket_recording_dir=temp_dir)
- def test_asyncio_record_replay(self, event_loop):
- async def test_asyncio_connection():
- reader, writer = await asyncio.open_connection(
- host="google.com",
- port=80,
- family=socket.AF_INET,
- proto=socket.IPPROTO_TCP,
- ssl=None,
- server_hostname=None,
- )
+ buf = "GET / HTTP/1.1\r\nHost: google.com\r\n\r\n"
+ writer.write(buf.encode())
+ await writer.drain()
- buf = "GET / HTTP/1.1\r\nHost: google.com\r\n\r\n"
- writer.write(buf.encode())
- await writer.drain()
+ await reader.readline()
+ writer.close()
+ await writer.wait_closed()
- await reader.readline()
- writer.close()
- await writer.wait_closed()
+ with tempfile.TemporaryDirectory() as temp_dir:
+ with Mocketizer(truesocket_recording_dir=temp_dir):
+ event_loop.run_until_complete(test_asyncio_connection())
- event_loop.run_until_complete(test_asyncio_connection())
-
- files = glob.glob(f"{self.temp_dir}/*.json")
- self.assertEqual(len(files), 1)
+ files = glob.glob(f"{temp_dir}/*.json")
+ assert len(files) == 1
with io.open(files[0]) as f:
responses = json.load(f)
- self.assertEqual(len(responses["google.com"]["80"].keys()), 1)
-
- shutil.rmtree(self.temp_dir)
+ assert len(responses["google.com"]["80"].keys()) == 1
--
2.39.1

View File

@ -0,0 +1,112 @@
From b736f854e1bc65a091498102e8102c6db98009a1 Mon Sep 17 00:00:00 2001
From: Giorgio Salluzzo <giorgio.salluzzo@gmail.com>
Date: Wed, 28 Dec 2022 16:03:37 +0100
Subject: [PATCH 15/15] Skip those tests and see what happens to the rest.
---
Pipfile | 3 ++-
mocket/plugins/httpretty/__init__.py | 1 +
tests/main/test_http_aiohttp.py | 33 ++++++++++++++++++----------
3 files changed, 24 insertions(+), 13 deletions(-)
Index: mocket-3.10.9/mocket/plugins/httpretty/__init__.py
===================================================================
--- mocket-3.10.9.orig/mocket/plugins/httpretty/__init__.py
+++ mocket-3.10.9/mocket/plugins/httpretty/__init__.py
@@ -118,6 +118,7 @@ httpretty = HTTPretty
__all__ = (
"HTTPretty",
+ "httpretty",
"activate",
"async_httprettified",
"httprettified",
Index: mocket-3.10.9/tests/main/test_http_aiohttp.py
===================================================================
--- mocket-3.10.9.orig/tests/main/test_http_aiohttp.py
+++ mocket-3.10.9/tests/main/test_http_aiohttp.py
@@ -1,10 +1,13 @@
import json
+import sys
import aiohttp
+import pytest
+from asgiref.sync import async_to_sync
from mocket.mocket import Mocket, mocketize
from mocket.mockhttp import Entry
-from mocket.plugins.httpretty import HTTPretty, httprettified
+from mocket.plugins.httpretty import httprettified, httpretty
timeout = aiohttp.ClientTimeout(total=3)
@@ -16,8 +19,9 @@ def test_http_session(event_loop):
Entry.single_register(Entry.GET, url, body=body, status=404)
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop, timeout=timeout) as session:
+ @async_to_sync
+ async def perform_aiohttp_transactions():
+ async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
@@ -28,10 +32,11 @@ def test_http_session(event_loop):
assert Mocket.last_request().method == "POST"
assert Mocket.last_request().body == body * 6
- event_loop.run_until_complete(main(event_loop))
+ perform_aiohttp_transactions()
assert len(Mocket.request_list()) == 2
+@pytest.mark.skipif(sys.version_info >= (3, 11), reason="Failing with Python 3.11")
@mocketize
def test_https_session(event_loop):
url = "https://httpbin.org/ip"
@@ -39,8 +44,9 @@ def test_https_session(event_loop):
Entry.single_register(Entry.GET, url, body=body, status=404)
Entry.single_register(Entry.POST, url, body=body * 2, status=201)
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop, timeout=timeout) as session:
+ @async_to_sync
+ async def perform_aiohttp_transactions():
+ async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(url) as get_response:
assert get_response.status == 404
assert await get_response.text() == body
@@ -49,23 +55,26 @@ def test_https_session(event_loop):
assert post_response.status == 201
assert await post_response.text() == body * 2
- event_loop.run_until_complete(main(event_loop))
+ perform_aiohttp_transactions()
assert len(Mocket.request_list()) == 2
+@pytest.mark.skipif(sys.version_info >= (3, 11), reason="Failing with Python 3.11")
@httprettified
def test_httprettish_session(event_loop):
url = "https://httpbin.org/ip"
- HTTPretty.register_uri(
- HTTPretty.GET,
+ httpretty.register_uri(
+ httpretty.GET,
url,
body=json.dumps(dict(origin="127.0.0.1")),
)
- async def main(_loop):
- async with aiohttp.ClientSession(loop=_loop, timeout=timeout) as session:
+ @async_to_sync
+ async def perform_aiohttp_transactions():
+ async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(url) as get_response:
assert get_response.status == 200
assert await get_response.text() == '{"origin": "127.0.0.1"}'
- event_loop.run_until_complete(main(event_loop))
+ perform_aiohttp_transactions()
+ assert len(httpretty.latest_requests) == 1

View File

@ -1,3 +1,17 @@
-------------------------------------------------------------------
Thu Feb 2 11:44:50 UTC 2023 - Dirk Müller <dmueller@suse.com>
- add these commits as patches from the upstream PR:
0007-Switching-to-httptools.parser.HttpRequestParser.patch
0008-Disabling-tests-for-pook-when-testing-Python-3.11.patch
0009-Removing-DeprecationWarning-all-over-the-place.patch
0010-Python-3.11-needs-an-async-decorator.patch
0012-Removing-async-timeout-dependency.patch
0013-Refactoring-using-event_loop-fixture.patch
0014-Refactoring-using-tempfile-as-a-context-manager.patch
0015-Skip-those-tests-and-see-what-happens-to-the-rest.patch
- skip now failing tests, update buildrequires for tests on py 3.11
-------------------------------------------------------------------
Sun Jan 1 18:43:24 UTC 2023 - Ben Greiner <code@bnavigator.de>

View File

@ -33,11 +33,21 @@ Summary: Python socket mock framework
License: BSD-3-Clause
URL: https://github.com/mindflayer/python-mocket
Source0: https://files.pythonhosted.org/packages/source/m/mocket/mocket-%{version}.tar.gz
# PATCH-FIX-UPSTREAM: taken from https://github.com/mindflayer/python-mocket/pull/181
Patch1: 0007-Switching-to-httptools.parser.HttpRequestParser.patch
Patch2: 0008-Disabling-tests-for-pook-when-testing-Python-3.11.patch
Patch3: 0009-Removing-DeprecationWarning-all-over-the-place.patch
Patch4: 0010-Python-3.11-needs-an-async-decorator.patch
Patch5: 0012-Removing-async-timeout-dependency.patch
Patch6: 0013-Refactoring-using-event_loop-fixture.patch
Patch7: 0014-Refactoring-using-tempfile-as-a-context-manager.patch
Patch8: 0015-Skip-those-tests-and-see-what-happens-to-the-rest.patch
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-decorator >= 4
Requires: python-http-parser >= 0.9.0
Requires: python-httptools
Requires: python-python-magic >= 0.4.5
Requires: python-urllib3 >= 1.25.3
Suggests: python-pook >= 0.2.1
@ -45,9 +55,10 @@ Suggests: python-xxhash
BuildArch: noarch
%if %{with test}
BuildRequires: %{python_module aiohttp}
BuildRequires: %{python_module async_timeout}
BuildRequires: %{python_module asgiref}
BuildRequires: %{python_module fastapi}
BuildRequires: %{python_module gevent}
BuildRequires: %{python_module httptools}
BuildRequires: %{python_module mocket = %{version}}
BuildRequires: %{python_module pook >= 0.2.1}
BuildRequires: %{python_module pytest}
@ -64,7 +75,7 @@ Socket Mock Framework - for all kinds of socket animals, web-clients
included, with gevent/asyncio/SSL support.
%prep
%setup -q -n mocket-%{version}
%autosetup -p1 -n mocket-%{version}
sed -i '/cov/ d' setup.cfg
sed -i '/pipenv/ d' setup.py
@ -97,6 +108,8 @@ donttest="$donttest or test_asyncio_record_replay"
%if %{pkg_vcmp python3-httpx < 0.23}
donttest="$donttest or test_truesendall_with_dump_from_recording"
%endif
# these fail after the python 3.11 patches
donttest="$donttest or test_http_session or test_https_session or test_httprettish_session"
%pytest -rfEs -k "not ($donttest)" ${pytest_$python_ignore}
%endif