3
3
4
4
"""
5
5
test_drf-dynamic-fields
6
- ------------
6
+ -----------
7
7
8
8
Tests for `drf-dynamic-fields` mixins
9
9
"""
@@ -25,147 +25,153 @@ def test_removes_fields(self):
25
25
Does it actually remove fields?
26
26
"""
27
27
rf = RequestFactory ()
28
- request = rf .get (' /api/v1/schools/1/?fields=id' )
29
- serializer = TeacherSerializer (context = {' request' : request })
28
+ request = rf .get (" /api/v1/schools/1/?fields=id" )
29
+ serializer = TeacherSerializer (context = {" request" : request })
30
30
31
- self .assertEqual (
32
- set (serializer .fields .keys ()),
33
- set (('id' ,))
34
- )
31
+ self .assertEqual (set (serializer .fields .keys ()), set (("id" ,)))
35
32
36
33
def test_fields_left_alone (self ):
37
34
"""
38
35
What if no fields param is passed? It should not touch the fields.
39
36
"""
40
37
rf = RequestFactory ()
41
- request = rf .get (' /api/v1/schools/1/' )
42
- serializer = TeacherSerializer (context = {' request' : request })
38
+ request = rf .get (" /api/v1/schools/1/" )
39
+ serializer = TeacherSerializer (context = {" request" : request })
43
40
44
41
self .assertEqual (
45
- set (serializer .fields .keys ()),
46
- set (('id' , 'request_info' ))
42
+ set (serializer .fields .keys ()), set (("id" , "request_info" , "age" , "name" ))
47
43
)
48
44
49
45
def test_fields_all_gone (self ):
50
46
"""
51
47
If we pass a blank fields list, then no fields should return.
52
48
"""
53
49
rf = RequestFactory ()
54
- request = rf .get (' /api/v1/schools/1/?fields' )
55
- serializer = TeacherSerializer (context = {' request' : request })
50
+ request = rf .get (" /api/v1/schools/1/?fields" )
51
+ serializer = TeacherSerializer (context = {" request" : request })
56
52
57
- self .assertEqual (
58
- set (serializer .fields .keys ()),
59
- set ()
60
- )
53
+ self .assertEqual (set (serializer .fields .keys ()), set ())
61
54
62
55
def test_ordinary_serializer (self ):
63
56
"""
64
57
Check the full JSON output of the serializer.
65
58
"""
66
59
rf = RequestFactory ()
67
- request = rf .get (' /api/v1/schools/1/?fields=id' )
68
- teacher = Teacher .objects .create ()
60
+ request = rf .get (" /api/v1/schools/1/?fields=id,age" )
61
+ teacher = Teacher .objects .create (name = "Susan" , age = 34 )
69
62
70
- serializer = TeacherSerializer (teacher , context = {' request' : request })
63
+ serializer = TeacherSerializer (teacher , context = {" request" : request })
71
64
72
- self .assertEqual (
73
- serializer .data , {
74
- 'id' : teacher .id
75
- }
76
- )
65
+ self .assertEqual (serializer .data , {"id" : teacher .id , "age" : teacher .age })
77
66
78
67
def test_omit (self ):
79
68
"""
80
69
Check a basic usage of omit.
81
70
"""
82
71
rf = RequestFactory ()
83
- request = rf .get (' /api/v1/schools/1/?omit=request_info' )
84
- serializer = TeacherSerializer (context = {' request' : request })
72
+ request = rf .get (" /api/v1/schools/1/?omit=request_info" )
73
+ serializer = TeacherSerializer (context = {" request" : request })
85
74
86
- self .assertEqual (
87
- set (serializer .fields .keys ()),
88
- set (('id' ,))
89
- )
75
+ self .assertEqual (set (serializer .fields .keys ()), set (("id" , "name" , "age" )))
90
76
91
77
def test_omit_and_fields_used (self ):
92
78
"""
93
79
Can they be used together.
94
80
"""
95
81
rf = RequestFactory ()
96
- request = rf .get (' /api/v1/schools/1/?fields=id,request_info&omit=request_info' )
97
- serializer = TeacherSerializer (context = {' request' : request })
82
+ request = rf .get (" /api/v1/schools/1/?fields=id,request_info&omit=request_info" )
83
+ serializer = TeacherSerializer (context = {" request" : request })
98
84
99
- self .assertEqual (
100
- set (serializer .fields .keys ()),
101
- set (('id' ,))
102
- )
85
+ self .assertEqual (set (serializer .fields .keys ()), set (("id" ,)))
103
86
104
87
def test_omit_everything (self ):
105
88
"""
106
89
Can remove it all tediously.
107
90
"""
108
91
rf = RequestFactory ()
109
- request = rf .get (' /api/v1/schools/1/?omit=id,request_info' )
110
- serializer = TeacherSerializer (context = {' request' : request })
92
+ request = rf .get (" /api/v1/schools/1/?omit=id,request_info,age,name" )
93
+ serializer = TeacherSerializer (context = {" request" : request })
111
94
112
- self .assertEqual (
113
- set (serializer .fields .keys ()),
114
- set ()
115
- )
95
+ self .assertEqual (set (serializer .fields .keys ()), set ())
116
96
117
97
def test_omit_nothing (self ):
118
98
"""
119
99
Blank omit doesn't affect anything.
120
100
"""
121
101
rf = RequestFactory ()
122
- request = rf .get (' /api/v1/schools/1/?omit' )
123
- serializer = TeacherSerializer (context = {' request' : request })
102
+ request = rf .get (" /api/v1/schools/1/?omit" )
103
+ serializer = TeacherSerializer (context = {" request" : request })
124
104
125
105
self .assertEqual (
126
- set (serializer .fields .keys ()),
127
- set (('id' , 'request_info' ))
106
+ set (serializer .fields .keys ()), set (("id" , "request_info" , "name" , "age" ))
128
107
)
129
108
130
109
def test_omit_non_existant_field (self ):
131
110
rf = RequestFactory ()
132
- request = rf .get (' /api/v1/schools/1/?omit=pretend' )
133
- serializer = TeacherSerializer (context = {' request' : request })
111
+ request = rf .get (" /api/v1/schools/1/?omit=pretend" )
112
+ serializer = TeacherSerializer (context = {" request" : request })
134
113
135
114
self .assertEqual (
136
- set (serializer .fields .keys ()),
137
- set (('id' , 'request_info' ))
115
+ set (serializer .fields .keys ()), set (("id" , "request_info" , "name" , "age" ))
138
116
)
139
117
140
118
def test_as_nested_serializer (self ):
141
119
"""
142
120
Nested serializers are not filtered.
143
121
"""
144
122
rf = RequestFactory ()
145
- request = rf .get (' /api/v1/schools/1/?fields=teachers' )
123
+ request = rf .get (" /api/v1/schools/1/?fields=teachers" )
146
124
147
- school = School .objects .create ()
125
+ school = School .objects .create (name = "Python Heights High" )
148
126
teachers = [
149
- Teacher .objects .create (),
150
- Teacher .objects .create ()
127
+ Teacher .objects .create (name = "Shane" , age = 45 ),
128
+ Teacher .objects .create (name = "Kaz" , age = 29 ),
151
129
]
152
130
school .teachers .add (* teachers )
153
131
154
- serializer = SchoolSerializer (school , context = {' request' : request })
132
+ serializer = SchoolSerializer (school , context = {" request" : request })
155
133
156
- request_info = ' http://testserver/api/v1/teacher/{}'
134
+ request_info = " http://testserver/api/v1/teacher/{}"
157
135
158
136
self .assertEqual (
159
- serializer .data , {
160
- 'teachers' : [
161
- OrderedDict ([
162
- ('id' , teachers [0 ].id ),
163
- ('request_info' , request_info .format (teachers [0 ].id ))
164
- ]),
165
- OrderedDict ([
166
- ('id' , teachers [1 ].id ),
167
- ('request_info' , request_info .format (teachers [1 ].id ))
168
- ])
137
+ serializer .data ,
138
+ {
139
+ "teachers" : [
140
+ OrderedDict (
141
+ [
142
+ ("id" , teachers [0 ].id ),
143
+ ("request_info" , request_info .format (teachers [0 ].id )),
144
+ ("age" , teachers [0 ].age ),
145
+ ("name" , teachers [0 ].name ),
146
+ ]
147
+ ),
148
+ OrderedDict (
149
+ [
150
+ ("id" , teachers [1 ].id ),
151
+ ("request_info" , request_info .format (teachers [1 ].id )),
152
+ ("age" , teachers [1 ].age ),
153
+ ("name" , teachers [1 ].name ),
154
+ ]
155
+ ),
169
156
],
170
- }
157
+ },
171
158
)
159
+
160
+ def test_serializer_reuse_with_changing_request (self ):
161
+ """
162
+ `fields` is a cached property. Changing the request on an already
163
+ instantiated serializer will not result in a changed fields attribute.
164
+
165
+ This was a deliberate choice we have made in favor of speeding up
166
+ access to the slow `fields` attribute.
167
+ """
168
+
169
+ rf = RequestFactory ()
170
+ request = rf .get ("/api/v1/schools/1/?fields=id" )
171
+ serializer = TeacherSerializer (context = {"request" : request })
172
+ self .assertEqual (set (serializer .fields .keys ()), {"id" })
173
+
174
+ # now change the request on this instantiated serializer.
175
+ request2 = rf .get ("/api/v1/schools/1/?fields=id,name" )
176
+ serializer .context ["request" ] = request2
177
+ self .assertEqual (set (serializer .fields .keys ()), {"id" })
0 commit comments