test(base): Ensure viewsets are caching and using the serializer_class object

ref: #513 #518
This commit is contained in:
2025-02-03 21:12:32 +09:30
parent db12750dc0
commit cd47e643d5

View File

@ -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