Skip to content

Commit b64c5df

Browse files
authored
New mocket method for checking if all entries have been served (#137)
* Mocket method for checking if all entries have been served at least once.
1 parent 9bb7c4b commit b64c5df

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
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.35"
5+
__version__ = "3.9.36"

mocket/mocket.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import errno
44
import hashlib
55
import io
6+
import itertools
67
import json
78
import os
89
import select
@@ -16,13 +17,7 @@
1617
from urllib3.util.ssl_ import ssl_wrap_socket as urllib3_ssl_wrap_socket
1718
from urllib3.util.ssl_ import wrap_socket as urllib3_wrap_socket
1819

19-
from .compat import (
20-
basestring,
21-
byte_type,
22-
decode_from_bytes,
23-
encode_to_bytes,
24-
text_type,
25-
)
20+
from .compat import basestring, byte_type, decode_from_bytes, encode_to_bytes, text_type
2621
from .utils import SSL_PROTOCOL, MocketSocketCore, hexdump, hexload, wrap_ssl_socket
2722

2823
xxh32 = None
@@ -517,6 +512,13 @@ def get_namespace(cls):
517512
def get_truesocket_recording_dir(cls):
518513
return cls._truesocket_recording_dir
519514

515+
@classmethod
516+
def assert_fail_if_entries_not_served(cls):
517+
""" Mocket checks that all entries have been served at least once. """
518+
assert all(
519+
entry._served for entry in itertools.chain(*cls._entries.values())
520+
), "Some Mocket entries have not been served"
521+
520522

521523
class MocketEntry(object):
522524
class Response(byte_type):
@@ -526,8 +528,11 @@ def data(self):
526528

527529
request_cls = str
528530
response_cls = Response
531+
responses = None
532+
_served = None
529533

530534
def __init__(self, location, responses):
535+
self._served = False
531536
self.location = location
532537
self.response_index = 0
533538

@@ -536,19 +541,18 @@ def __init__(self, location, responses):
536541
):
537542
responses = [responses]
538543

539-
lresponses = []
544+
self.responses = []
540545
for r in responses:
541546
if isinstance(r, BaseException):
542547
pass
543548
elif not getattr(r, "data", False):
544549
if isinstance(r, text_type):
545550
r = encode_to_bytes(r)
546551
r = self.response_cls(r)
547-
lresponses.append(r)
552+
self.responses.append(r)
548553
else:
549554
if not responses:
550-
lresponses = [self.response_cls(encode_to_bytes(""))]
551-
self.responses = lresponses
555+
self.responses = [self.response_cls(encode_to_bytes(""))]
552556

553557
def can_handle(self, data):
554558
return True
@@ -562,6 +566,8 @@ def get_response(self):
562566
if self.response_index < len(self.responses) - 1:
563567
self.response_index += 1
564568

569+
self._served = True
570+
565571
if isinstance(response, BaseException):
566572
raise response
567573

tests/main/test_http.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,22 @@ def test_sockets(self):
363363

364364
# Proof that worked.
365365
self.assertEqual(Mocket.last_request().body, '{"hello": "world"}')
366+
367+
@mocketize
368+
def test_fail_because_entry_not_served(self):
369+
url = "http://github.com/fluidicon.png"
370+
Entry.single_register(Entry.GET, url)
371+
Entry.single_register(Entry.GET, "http://github.com/fluidicon.jpg")
372+
requests.get(url)
373+
with self.assertRaises(AssertionError):
374+
Mocket.assert_fail_if_entries_not_served()
375+
376+
@mocketize
377+
def test_does_not_fail_because_all_entries_are_served(self):
378+
url = "http://github.com/fluidicon.png"
379+
second_url = "http://github.com/fluidicon.jpg"
380+
Entry.single_register(Entry.GET, url)
381+
Entry.single_register(Entry.GET, second_url)
382+
requests.get(url)
383+
requests.get(second_url)
384+
Mocket.assert_fail_if_entries_not_served()

0 commit comments

Comments
 (0)