test(base): Ensure viewsets are caching and using the serializer_class object
ref: #513 #518
This commit is contained in:
@ -660,3 +660,77 @@ class ViewSetModel(
|
||||
assert setter_not_called
|
||||
assert qs.call_count == 2
|
||||
|
||||
|
||||
|
||||
def test_view_func_get_serializer_class_cache_result(self):
|
||||
"""Viewset Test
|
||||
|
||||
Ensure that the `get_serializer_class` function caches the result under
|
||||
attribute `<viewset>.serializer_class`
|
||||
"""
|
||||
|
||||
view_set = self.viewset()
|
||||
|
||||
view_set.kwargs = self.kwargs
|
||||
|
||||
view_set.action = 'list'
|
||||
|
||||
view_set.detail = False
|
||||
|
||||
assert view_set.serializer_class is None # Must be empty before init
|
||||
|
||||
q = view_set.get_serializer_class()
|
||||
|
||||
assert view_set.serializer_class is not None # Must not be empty after init
|
||||
|
||||
assert q == view_set.serializer_class
|
||||
|
||||
|
||||
def test_view_func_get_serializer_class_cache_result_used(self):
|
||||
"""Viewset Test
|
||||
|
||||
Ensure that the `get_serializer_class` function caches the result under
|
||||
attribute `<viewset>.serializer_class`
|
||||
"""
|
||||
|
||||
view_set = self.viewset()
|
||||
|
||||
view_set.kwargs = self.kwargs
|
||||
view_set.action = 'list'
|
||||
view_set.detail = False
|
||||
|
||||
mock_return = view_set.get_serializer_class() # Real item to be used as mock return Some
|
||||
# functions use `Queryset` for additional filtering
|
||||
|
||||
def bool_rtn(self):
|
||||
return True
|
||||
|
||||
mock_return.__class__.__bool__ = bool_rtn # Required for truthy if statments to work. i.e. `if self.queryset`
|
||||
|
||||
setter_not_called = True
|
||||
|
||||
|
||||
with patch.object(self.viewset, 'serializer_class', new_callable=PropertyMock) as qs:
|
||||
|
||||
qs.return_value = mock_return
|
||||
|
||||
mocked_view_set = self.viewset()
|
||||
|
||||
mocked_view_set.kwargs = self.kwargs
|
||||
mocked_view_set.action = 'list'
|
||||
mocked_view_set.detail = False
|
||||
|
||||
qs.reset_mock() # Just in case
|
||||
|
||||
mocked_setup = mocked_view_set.get_serializer_class() # should only add two calls, if exists and the return
|
||||
|
||||
|
||||
for mock_call in list(qs.mock_calls): # mock_calls with args means setter was called
|
||||
|
||||
if len(mock_call.args) > 0:
|
||||
|
||||
setter_not_called = False
|
||||
|
||||
|
||||
assert setter_not_called
|
||||
assert qs.call_count == 2
|
||||
|
Reference in New Issue
Block a user