From 6273c323342f41976fddd7b5029c10e5cf4e6587 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Sat, 26 Apr 2014 14:31:40 -1000 Subject: [PATCH] Add Exception when JSON Serializing Binary Data Since I can't think of a good way to deal with this, let's just give a nice error message to point people in the right direction. Closes #51 --- tests/unit/test_json_serializer.py | 14 ++++++++++++++ vcr/serializers/jsonserializer.py | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_json_serializer.py diff --git a/tests/unit/test_json_serializer.py b/tests/unit/test_json_serializer.py new file mode 100644 index 0000000..fe043c2 --- /dev/null +++ b/tests/unit/test_json_serializer.py @@ -0,0 +1,14 @@ +import pytest +from vcr.serializers.jsonserializer import serialize +from vcr.request import Request + + +def test_serialize_binary(): + request = Request('http','localhost',80,'GET','/',{},{}) + cassette = {'requests': [request], 'responses': [{'body':b'\x8c'}]} + + with pytest.raises(Exception) as e: + serialize(cassette) + assert e.message == "Error serializing cassette to JSON. Does this \ + HTTP interaction contain binary data? If so, use a different \ + serializer (like the yaml serializer) for this request" diff --git a/vcr/serializers/jsonserializer.py b/vcr/serializers/jsonserializer.py index d10a138..eeaa91b 100644 --- a/vcr/serializers/jsonserializer.py +++ b/vcr/serializers/jsonserializer.py @@ -27,4 +27,12 @@ def serialize(cassette_dict): cassette_dict['requests'], cassette_dict['responses'] )]) - return json.dumps(data, indent=4, default=_json_default) + try: + return json.dumps(data, indent=4, default=_json_default) + except UnicodeDecodeError as e: + raise UnicodeDecodeError( + "Error serializing cassette to JSON. ", + "Does this HTTP interaction contain binary data? ", + "If so, use a different serializer (like the yaml serializer) for", + "this request" + )