From 99692a92d2e82cf85f9a80b1775385da31e6b45e Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Tue, 7 Oct 2014 13:21:16 -0700 Subject: [PATCH] Handle unicode error in json serialize properly. --- tests/integration/test_basic.py | 2 +- tests/unit/test_serialize.py | 13 +++++++++++++ vcr/serializers/jsonserializer.py | 14 +++++++++----- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/tests/integration/test_basic.py b/tests/integration/test_basic.py index 67c906d..aba7de0 100644 --- a/tests/integration/test_basic.py +++ b/tests/integration/test_basic.py @@ -1,4 +1,4 @@ -'''Basic tests about cassettes''' +'''Basic tests for cassettes''' # coding=utf-8 # External imports diff --git a/tests/unit/test_serialize.py b/tests/unit/test_serialize.py index a4ccd73..f063625 100644 --- a/tests/unit/test_serialize.py +++ b/tests/unit/test_serialize.py @@ -1,21 +1,34 @@ +import mock import pytest + from vcr.serialize import deserialize from vcr.serializers import yamlserializer, jsonserializer + def test_deserialize_old_yaml_cassette(): with open('tests/fixtures/migration/old_cassette.yaml', 'r') as f: with pytest.raises(ValueError): deserialize(f.read(), yamlserializer) + def test_deserialize_old_json_cassette(): with open('tests/fixtures/migration/old_cassette.json', 'r') as f: with pytest.raises(ValueError): deserialize(f.read(), jsonserializer) + def test_deserialize_new_yaml_cassette(): with open('tests/fixtures/migration/new_cassette.yaml', 'r') as f: deserialize(f.read(), yamlserializer) + def test_deserialize_new_json_cassette(): with open('tests/fixtures/migration/new_cassette.json', 'r') as f: deserialize(f.read(), jsonserializer) + + +@mock.patch.object(jsonserializer.json, 'dumps', + side_effect=UnicodeDecodeError('utf-8', b'unicode error in serialization', + 0, 10, 'blew up')) +def test_serialize_constructs_UnicodeDecodeError(mock_dumps): + jsonserializer.serialize({}) diff --git a/vcr/serializers/jsonserializer.py b/vcr/serializers/jsonserializer.py index d423587..5b0e2da 100644 --- a/vcr/serializers/jsonserializer.py +++ b/vcr/serializers/jsonserializer.py @@ -11,10 +11,14 @@ def deserialize(cassette_string): def serialize(cassette_dict): try: return json.dumps(cassette_dict, indent=4) - except UnicodeDecodeError: + except UnicodeDecodeError as original: 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" + original.encoding, + b"Error serializing cassette to JSON", + original.start, + original.end, + original.message + + ("Does this HTTP interaction contain binary data? " + "If so, use a different serializer (like the yaml serializer) " + "for this request?") )