Skip to content

Commit 35b08a3

Browse files
authored
Use MocketSocket as context manager (#141)
* Adding support for using a `socket` as a context manager as requested by #139. * Closing real socket. * Bump version.
1 parent bce7cde commit 35b08a3

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

mocket/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
__all__ = ("mocketize", "Mocket", "MocketEntry", "Mocketizer")
44

5-
__version__ = "3.9.38"
5+
__version__ = "3.9.39"

mocket/mocket.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ def __init__(
133133
self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, *args, **kwargs
134134
):
135135
self.true_socket = true_socket(family, type, proto)
136-
self._connected = False
137136
self._buflen = 65536
138137
self._entry = None
139138
self.family = int(family)
@@ -160,6 +159,12 @@ def __str__(self): # pragma: no cover
160159
self.__class__.__name__, self.family, self.type, self.proto
161160
)
162161

162+
def __enter__(self):
163+
return self
164+
165+
def __exit__(self, exc_type, exc_val, exc_tb):
166+
self.close()
167+
163168
@property
164169
def fd(self):
165170
if self._fd is None:
@@ -378,6 +383,8 @@ def send(self, data, *args, **kwargs): # pragma: no cover
378383
return len(data)
379384

380385
def close(self):
386+
if self.true_socket and not self.true_socket._closed:
387+
self.true_socket.close()
381388
self._fd = None
382389

383390
def __getattr__(self, name):

tests/main/test_mocket.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,16 @@ def test_makefile(self):
127127
self.assertEqual(fp.read().strip(), encode_to_bytes("Show me."))
128128
self.assertEqual(len(Mocket._requests), 1)
129129

130+
def test_socket_as_context_manager(self):
131+
addr = ("localhost", 80)
132+
Mocket.register(MocketEntry(addr, ["Show me.\r\n"]))
133+
with Mocketizer():
134+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as _so:
135+
_so.connect(addr)
136+
_so.sendall(encode_to_bytes("Whatever..."))
137+
data = _so.recv(4096)
138+
self.assertEqual(data, encode_to_bytes("Show me.\r\n"))
139+
130140

131141
class MocketizeTestCase(TestCase):
132142
def mocketize_setup(self):

0 commit comments

Comments
 (0)