Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
db1dd8e2
Commit
db1dd8e2
authored
Nov 06, 2014
by
Tom Christie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Tests & fixes for list serialization
parent
4e001dbb
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
276 additions
and
2 deletions
+276
-2
rest_framework/utils/html.py
+2
-2
tests/test_serializer_lists.py
+274
-0
No files found.
rest_framework/utils/html.py
View file @
db1dd8e2
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
Helpers for dealing with HTML input.
Helpers for dealing with HTML input.
"""
"""
import
re
import
re
from
django.utils.datastructures
import
MultiValueDict
def
is_html_input
(
dictionary
):
def
is_html_input
(
dictionary
):
...
@@ -43,7 +44,6 @@ def parse_html_list(dictionary, prefix=''):
...
@@ -43,7 +44,6 @@ def parse_html_list(dictionary, prefix=''):
{'foo': 'hij', 'bar': 'klm'}
{'foo': 'hij', 'bar': 'klm'}
]
]
"""
"""
Dict
=
type
(
dictionary
)
ret
=
{}
ret
=
{}
regex
=
re
.
compile
(
r'^
%
s\[([0-9]+)\](.*)$'
%
re
.
escape
(
prefix
))
regex
=
re
.
compile
(
r'^
%
s\[([0-9]+)\](.*)$'
%
re
.
escape
(
prefix
))
for
field
,
value
in
dictionary
.
items
():
for
field
,
value
in
dictionary
.
items
():
...
@@ -57,7 +57,7 @@ def parse_html_list(dictionary, prefix=''):
...
@@ -57,7 +57,7 @@ def parse_html_list(dictionary, prefix=''):
elif
isinstance
(
ret
.
get
(
index
),
dict
):
elif
isinstance
(
ret
.
get
(
index
),
dict
):
ret
[
index
][
key
]
=
value
ret
[
index
][
key
]
=
value
else
:
else
:
ret
[
index
]
=
Dict
({
key
:
value
})
ret
[
index
]
=
MultiValueDict
({
key
:
[
value
]
})
return
[
ret
[
item
]
for
item
in
sorted
(
ret
.
keys
())]
return
[
ret
[
item
]
for
item
in
sorted
(
ret
.
keys
())]
...
...
tests/test_serializer_lists.py
0 → 100644
View file @
db1dd8e2
from
rest_framework
import
serializers
from
django.utils.datastructures
import
MultiValueDict
class
BasicObject
:
"""
A mock object for testing serializer save behavior.
"""
def
__init__
(
self
,
**
kwargs
):
self
.
_data
=
kwargs
for
key
,
value
in
kwargs
.
items
():
setattr
(
self
,
key
,
value
)
def
__eq__
(
self
,
other
):
if
self
.
_data
.
keys
()
!=
other
.
_data
.
keys
():
return
False
for
key
in
self
.
_data
.
keys
():
if
self
.
_data
[
key
]
!=
other
.
_data
[
key
]:
return
False
return
True
class
TestListSerializer
:
"""
Tests for using a ListSerializer as a top-level serializer.
Note that this is in contrast to using ListSerializer as a field.
"""
def
setup
(
self
):
class
IntegerListSerializer
(
serializers
.
ListSerializer
):
child
=
serializers
.
IntegerField
()
self
.
Serializer
=
IntegerListSerializer
def
test_validate
(
self
):
"""
Validating a list of items should return a list of validated items.
"""
input_data
=
[
"123"
,
"456"
]
expected_output
=
[
123
,
456
]
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
def
test_validate_html_input
(
self
):
"""
HTML input should be able to mock list structures using [x] style ids.
"""
input_data
=
MultiValueDict
({
"[0]"
:
[
"123"
],
"[1]"
:
[
"456"
]})
expected_output
=
[
123
,
456
]
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
class
TestListSerializerContainingNestedSerializer
:
"""
Tests for using a ListSerializer containing another serializer.
"""
def
setup
(
self
):
class
TestSerializer
(
serializers
.
Serializer
):
integer
=
serializers
.
IntegerField
()
boolean
=
serializers
.
BooleanField
()
def
create
(
self
,
validated_data
):
return
BasicObject
(
**
validated_data
)
class
ObjectListSerializer
(
serializers
.
ListSerializer
):
child
=
TestSerializer
()
self
.
Serializer
=
ObjectListSerializer
def
test_validate
(
self
):
"""
Validating a list of dictionaries should return a list of
validated dictionaries.
"""
input_data
=
[
{
"integer"
:
"123"
,
"boolean"
:
"true"
},
{
"integer"
:
"456"
,
"boolean"
:
"false"
}
]
expected_output
=
[
{
"integer"
:
123
,
"boolean"
:
True
},
{
"integer"
:
456
,
"boolean"
:
False
}
]
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
def
test_create
(
self
):
"""
Creating from a list of dictionaries should return a list of objects.
"""
input_data
=
[
{
"integer"
:
"123"
,
"boolean"
:
"true"
},
{
"integer"
:
"456"
,
"boolean"
:
"false"
}
]
expected_output
=
[
BasicObject
(
integer
=
123
,
boolean
=
True
),
BasicObject
(
integer
=
456
,
boolean
=
False
),
]
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
save
()
==
expected_output
def
test_serialize
(
self
):
"""
Serialization of a list of objects should return a list of dictionaries.
"""
input_objects
=
[
BasicObject
(
integer
=
123
,
boolean
=
True
),
BasicObject
(
integer
=
456
,
boolean
=
False
)
]
expected_output
=
[
{
"integer"
:
123
,
"boolean"
:
True
},
{
"integer"
:
456
,
"boolean"
:
False
}
]
serializer
=
self
.
Serializer
(
input_objects
)
assert
serializer
.
data
==
expected_output
def
test_validate_html_input
(
self
):
"""
HTML input should be able to mock list structures using [x]
style prefixes.
"""
input_data
=
MultiValueDict
({
"[0]integer"
:
[
"123"
],
"[0]boolean"
:
[
"true"
],
"[1]integer"
:
[
"456"
],
"[1]boolean"
:
[
"false"
]
})
expected_output
=
[
{
"integer"
:
123
,
"boolean"
:
True
},
{
"integer"
:
456
,
"boolean"
:
False
}
]
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
class
TestNestedListSerializer
:
"""
Tests for using a ListSerializer as a field.
"""
def
setup
(
self
):
class
TestSerializer
(
serializers
.
Serializer
):
integers
=
serializers
.
ListSerializer
(
child
=
serializers
.
IntegerField
())
booleans
=
serializers
.
ListSerializer
(
child
=
serializers
.
BooleanField
())
def
create
(
self
,
validated_data
):
return
BasicObject
(
**
validated_data
)
self
.
Serializer
=
TestSerializer
def
test_validate
(
self
):
"""
Validating a list of items should return a list of validated items.
"""
input_data
=
{
"integers"
:
[
"123"
,
"456"
],
"booleans"
:
[
"true"
,
"false"
]
}
expected_output
=
{
"integers"
:
[
123
,
456
],
"booleans"
:
[
True
,
False
]
}
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
def
test_create
(
self
):
"""
Creation with a list of items return an object with an attribute that
is a list of items.
"""
input_data
=
{
"integers"
:
[
"123"
,
"456"
],
"booleans"
:
[
"true"
,
"false"
]
}
expected_output
=
BasicObject
(
integers
=
[
123
,
456
],
booleans
=
[
True
,
False
]
)
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
save
()
==
expected_output
def
test_serialize
(
self
):
"""
Serialization of a list of items should return a list of items.
"""
input_object
=
BasicObject
(
integers
=
[
123
,
456
],
booleans
=
[
True
,
False
]
)
expected_output
=
{
"integers"
:
[
123
,
456
],
"booleans"
:
[
True
,
False
]
}
serializer
=
self
.
Serializer
(
input_object
)
assert
serializer
.
data
==
expected_output
def
test_validate_html_input
(
self
):
"""
HTML input should be able to mock list structures using [x]
style prefixes.
"""
input_data
=
MultiValueDict
({
"integers[0]"
:
[
"123"
],
"integers[1]"
:
[
"456"
],
"booleans[0]"
:
[
"true"
],
"booleans[1]"
:
[
"false"
]
})
expected_output
=
{
"integers"
:
[
123
,
456
],
"booleans"
:
[
True
,
False
]
}
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
class
TestNestedListOfListsSerializer
:
def
setup
(
self
):
class
TestSerializer
(
serializers
.
Serializer
):
integers
=
serializers
.
ListSerializer
(
child
=
serializers
.
ListSerializer
(
child
=
serializers
.
IntegerField
()
)
)
booleans
=
serializers
.
ListSerializer
(
child
=
serializers
.
ListSerializer
(
child
=
serializers
.
BooleanField
()
)
)
self
.
Serializer
=
TestSerializer
def
test_validate
(
self
):
input_data
=
{
'integers'
:
[[
'123'
,
'456'
],
[
'789'
,
'0'
]],
'booleans'
:
[[
'true'
,
'true'
],
[
'false'
,
'true'
]]
}
expected_output
=
{
"integers"
:
[[
123
,
456
],
[
789
,
0
]],
"booleans"
:
[[
True
,
True
],
[
False
,
True
]]
}
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
def
test_validate_html_input
(
self
):
"""
HTML input should be able to mock lists of lists using [x][y]
style prefixes.
"""
input_data
=
MultiValueDict
({
"integers[0][0]"
:
[
"123"
],
"integers[0][1]"
:
[
"456"
],
"integers[1][0]"
:
[
"789"
],
"integers[1][1]"
:
[
"000"
],
"booleans[0][0]"
:
[
"true"
],
"booleans[0][1]"
:
[
"true"
],
"booleans[1][0]"
:
[
"false"
],
"booleans[1][1]"
:
[
"true"
]
})
expected_output
=
{
"integers"
:
[[
123
,
456
],
[
789
,
0
]],
"booleans"
:
[[
True
,
True
],
[
False
,
True
]]
}
serializer
=
self
.
Serializer
(
data
=
input_data
)
assert
serializer
.
is_valid
()
assert
serializer
.
validated_data
==
expected_output
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment