Skip to content

Commit 99692a9

Browse files
committed
Handle unicode error in json serialize properly.
1 parent a9a68ba commit 99692a9

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

tests/integration/test_basic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
'''Basic tests about cassettes'''
1+
'''Basic tests for cassettes'''
22
# coding=utf-8
33

44
# External imports

tests/unit/test_serialize.py

+13
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
1+
import mock
12
import pytest
3+
24
from vcr.serialize import deserialize
35
from vcr.serializers import yamlserializer, jsonserializer
46

7+
58
def test_deserialize_old_yaml_cassette():
69
with open('tests/fixtures/migration/old_cassette.yaml', 'r') as f:
710
with pytest.raises(ValueError):
811
deserialize(f.read(), yamlserializer)
912

13+
1014
def test_deserialize_old_json_cassette():
1115
with open('tests/fixtures/migration/old_cassette.json', 'r') as f:
1216
with pytest.raises(ValueError):
1317
deserialize(f.read(), jsonserializer)
1418

19+
1520
def test_deserialize_new_yaml_cassette():
1621
with open('tests/fixtures/migration/new_cassette.yaml', 'r') as f:
1722
deserialize(f.read(), yamlserializer)
1823

24+
1925
def test_deserialize_new_json_cassette():
2026
with open('tests/fixtures/migration/new_cassette.json', 'r') as f:
2127
deserialize(f.read(), jsonserializer)
28+
29+
30+
@mock.patch.object(jsonserializer.json, 'dumps',
31+
side_effect=UnicodeDecodeError('utf-8', b'unicode error in serialization',
32+
0, 10, 'blew up'))
33+
def test_serialize_constructs_UnicodeDecodeError(mock_dumps):
34+
jsonserializer.serialize({})

vcr/serializers/jsonserializer.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ def deserialize(cassette_string):
1111
def serialize(cassette_dict):
1212
try:
1313
return json.dumps(cassette_dict, indent=4)
14-
except UnicodeDecodeError:
14+
except UnicodeDecodeError as original:
1515
raise UnicodeDecodeError(
16-
"Error serializing cassette to JSON. ",
17-
"Does this HTTP interaction contain binary data? ",
18-
"If so, use a different serializer (like the yaml serializer) ",
19-
"for this request"
16+
original.encoding,
17+
b"Error serializing cassette to JSON",
18+
original.start,
19+
original.end,
20+
original.message +
21+
("Does this HTTP interaction contain binary data? "
22+
"If so, use a different serializer (like the yaml serializer) "
23+
"for this request?")
2024
)

0 commit comments

Comments
 (0)