forked from core-api/python-openapi-codec
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_encode_arrays.py
More file actions
201 lines (179 loc) · 6.63 KB
/
Copy pathtest_encode_arrays.py
File metadata and controls
201 lines (179 loc) · 6.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
import coreapi
import coreschema
from openapi_codec.encode import _get_parameters, _get_schema_type
from unittest import TestCase
def make_array_json(json_template, array_schema, location, field=None):
if location == 'body':
# In Swagger 2.0, arrays in the body are defined in the schema attribute
schema = {
'schema': array_schema
}
for key in schema:
json_template[key] = schema[key]
elif location == 'form':
json_template['schema']['properties'][field.name] = array_schema
else:
# In Swagger 2.0, arrays not in the body are defined right in the field properties
schema = array_schema
for key in schema:
json_template[key] = schema[key]
return json_template
class TestArrayParameters(TestCase):
def setUp(self):
self.maxDiff = None
self.encoding = ''
self.definitions = []
for location in ['body', 'query']:
field = coreapi.Field(
name='data',
required=True,
location=location,
description='Array of Anything',
schema=coreschema.Array()
)
self.definitions.append(dict(
python=field,
json=make_array_json({
'name': field.name,
'required': field.required,
'in': location,
'description': field.description,
}, {
'type': 'array',
'items': {},
}, location)
))
for schema_type in coreschema.__all__:
schema = None
native_type = None
try:
schema = schema_type()
native_type = _get_schema_type(schema)
except Exception:
pass
if native_type is not None and (isinstance(schema_type, coreschema.String) or native_type != 'string'):
field = coreapi.Field(
name='data',
required=True,
location=location,
description='Array of %s' % native_type.capitalize() + 's',
schema=coreschema.Array(items=schema)
)
self.definitions.append(dict(
python=field,
json=make_array_json({
'name': field.name,
'required': field.required,
'in': location,
'description': field.description,
}, {
'type': 'array',
'items': {
'type': native_type,
}
}, location)
))
field = coreapi.Field(
name='data',
required=True,
location=location,
description='Array of Objects with Properties',
schema=coreschema.Array(
items=coreschema.Object(
properties={
'id': coreschema.Integer(),
}
)
)
)
self.definitions.append(dict(
python=field,
json=make_array_json({
'name': field.name,
'required': field.required,
'in': location,
'description': field.description,
}, {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'id': {
'description': '',
'type': 'integer'
},
},
}
}, location)
))
def test_expected_path_fields(self):
for d in self.definitions:
swagger = _get_parameters(coreapi.Link(fields=[d['python']]), encoding=self.encoding)
self.assertEquals(swagger[0], d['json'], msg='Encoded JSON value didn\'t match for %s' % d['python'].description)
def test_unsupported_item_type(self):
field = coreapi.Field(
name='data',
required=True,
location='body',
description='Array of Strings and Integers',
schema=coreschema.Array(
items=[coreschema.String(), coreschema.Integer()],
)
)
with self.assertRaises(TypeError):
_get_parameters(coreapi.Link(fields=[field]), encoding=self.encoding)
class TestArrayFormParameters(TestArrayParameters):
def setUp(self):
self.maxDiff = None
self.encoding = ''
self.definitions = []
location = 'form'
field = coreapi.Field(
name='data',
required=True,
location=location,
description='Array of Anything',
schema=coreschema.Array()
)
self.definitions.append(dict(
python=field,
json=make_array_json({
'name': field.name,
'in': 'body',
'schema': {
'required': [field.name],
'type': 'object',
'properties': {},
},
}, {
'type': 'array',
'description': field.description,
'items': {},
}, location, field)
))
class TestArrayEncodedFormParameters(TestArrayParameters):
def setUp(self):
self.maxDiff = None
self.encoding = 'multipart/form-data'
self.definitions = []
location = 'form'
swagger_location = 'formData'
field = coreapi.Field(
name='data',
required=True,
location=location,
description='Array of Anything',
schema=coreschema.Array()
)
self.definitions.append(dict(
python=field,
json=make_array_json({
'name': field.name,
'required': field.required,
'in': swagger_location,
'description': field.description,
}, {
'type': 'array',
'items': {},
}, swagger_location)
))