Skip to content

Commit 7a83f01

Browse files
authored
Merge pull request #302 from p1c2u/feature/media-type-deserialize-form-urlencoded
media type deserialize form urlencoded
2 parents e73dbd1 + 74920a7 commit 7a83f01

File tree

5 files changed

+113
-89
lines changed

5 files changed

+113
-89
lines changed

openapi_core/deserializing/media_types/factories.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from openapi_core.deserializing.media_types.util import json_loads
1+
from openapi_core.deserializing.media_types.util import json_loads, form_loads
22

33
from openapi_core.deserializing.media_types.deserializers import (
44
PrimitiveDeserializer,
@@ -9,6 +9,7 @@ class MediaTypeDeserializersFactory(object):
99

1010
MEDIA_TYPE_DESERIALIZERS = {
1111
'application/json': json_loads,
12+
'application/x-www-form-urlencoded': form_loads,
1213
}
1314

1415
def __init__(self, custom_deserializers=None):
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
from json import loads
22

33
from six import binary_type
4+
from six.moves.urllib.parse import parse_qsl
45

56

67
def json_loads(value):
78
# python 3.5 doesn't support binary input fix
89
if isinstance(value, (binary_type, )):
910
value = value.decode()
1011
return loads(value)
12+
13+
14+
def form_loads(value):
15+
return dict(parse_qsl(value))

tests/unit/deserializing/test_deserialize.py

-88
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import pytest
2+
3+
from openapi_core.deserializing.exceptions import DeserializeError
4+
from openapi_core.deserializing.media_types.factories import (
5+
MediaTypeDeserializersFactory,
6+
)
7+
from openapi_core.schema.media_types.models import MediaType
8+
9+
10+
class TestMediaTypeDeserializer(object):
11+
12+
@pytest.fixture
13+
def deserializer_factory(self):
14+
def create_deserializer(media_type, custom_deserializers=None):
15+
return MediaTypeDeserializersFactory(
16+
custom_deserializers=custom_deserializers).create(media_type)
17+
return create_deserializer
18+
19+
def test_json_empty(self, deserializer_factory):
20+
media_type = MediaType('application/json')
21+
value = ''
22+
23+
with pytest.raises(DeserializeError):
24+
deserializer_factory(media_type)(value)
25+
26+
def test_json_empty_object(self, deserializer_factory):
27+
media_type = MediaType('application/json')
28+
value = "{}"
29+
30+
result = deserializer_factory(media_type)(value)
31+
32+
assert result == {}
33+
34+
def test_form_urlencoded_empty(self, deserializer_factory):
35+
media_type = MediaType('application/x-www-form-urlencoded')
36+
value = ''
37+
38+
result = deserializer_factory(media_type)(value)
39+
40+
assert result == {}
41+
42+
def test_form_urlencoded_simple(self, deserializer_factory):
43+
media_type = MediaType('application/x-www-form-urlencoded')
44+
value = 'param1=test'
45+
46+
result = deserializer_factory(media_type)(value)
47+
48+
assert result == {'param1': 'test'}
49+
50+
def test_custom_simple(self, deserializer_factory):
51+
custom_mimetype = 'application/custom'
52+
media_type = MediaType(custom_mimetype)
53+
value = "{}"
54+
55+
def custom_deserializer(value):
56+
return 'custom'
57+
custom_deserializers = {
58+
custom_mimetype: custom_deserializer,
59+
}
60+
61+
result = deserializer_factory(
62+
media_type, custom_deserializers=custom_deserializers)(value)
63+
64+
assert result == 'custom'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import pytest
2+
3+
from openapi_core.deserializing.parameters.factories import (
4+
ParameterDeserializersFactory,
5+
)
6+
from openapi_core.deserializing.parameters.exceptions import (
7+
EmptyParameterValue,
8+
)
9+
from openapi_core.schema.parameters.models import Parameter
10+
11+
12+
class TestParameterDeserializer(object):
13+
14+
@pytest.fixture
15+
def deserializer_factory(self):
16+
def create_deserializer(param):
17+
return ParameterDeserializersFactory().create(param)
18+
return create_deserializer
19+
20+
def test_deprecated(self, deserializer_factory):
21+
param = Parameter('param', 'query', deprecated=True)
22+
value = 'test'
23+
24+
with pytest.warns(DeprecationWarning):
25+
result = deserializer_factory(param)(value)
26+
27+
assert result == value
28+
29+
def test_query_empty(self, deserializer_factory):
30+
param = Parameter('param', 'query')
31+
value = ''
32+
33+
with pytest.raises(EmptyParameterValue):
34+
deserializer_factory(param)(value)
35+
36+
def test_query_valid(self, deserializer_factory):
37+
param = Parameter('param', 'query')
38+
value = 'test'
39+
40+
result = deserializer_factory(param)(value)
41+
42+
assert result == value

0 commit comments

Comments
 (0)