88from django .conf import settings
99from django .http .request import HttpRequest
1010from django .http .response import HttpResponse
11+ from django .test import override_settings
1112
1213from nplusone .ext .django .patch import setup_state
1314from nplusone .ext .django .middleware import NPlusOneMiddleware
@@ -32,6 +33,7 @@ def objects():
3233 address = models .Address .objects .create (user = user )
3334 hobby = models .Hobby .objects .create ()
3435 user .hobbies .add (hobby )
36+ medicine = models .Medicine .objects .create (name = "Allergix" )
3537 return locals ()
3638
3739
@@ -133,6 +135,23 @@ def test_many_to_many_reverse_prefetch(self, objects, calls):
133135 assert len (calls ) == 0
134136
135137
138+ @pytest .mark .django_db
139+ class TestDeferred :
140+
141+ def test_deferred (self , objects , calls ):
142+ medicine = list (models .Medicine .objects .defer ('name' ))[0 ]
143+ medicine .name
144+ assert len (calls ) == 1
145+ call = calls [0 ]
146+ assert call .objects == (models .Medicine , 'Medicine:1' , 'name' )
147+ assert 'medicine.name' in '' .join (call .frame [4 ])
148+
149+ def test_non_deferred (self , objects , calls ):
150+ medicine = list (models .Medicine .objects .all ())[0 ]
151+ medicine .name
152+ assert len (calls ) == 0
153+
154+
136155@pytest .fixture
137156def logger (monkeypatch ):
138157 mock_logger = mock .Mock ()
@@ -272,16 +291,29 @@ def test_select_nested_unused(self, objects, client, logger):
272291 assert any ('Pet.user' in call [1 ] for call in calls )
273292 assert any ('User.occupation' in call [1 ] for call in calls )
274293
294+ @override_settings (NPLUSONE_WHITELIST = [{'model' : 'testapp.User' }])
275295 def test_many_to_many_whitelist (self , objects , client , logger ):
276- settings .NPLUSONE_WHITELIST = [{'model' : 'testapp.User' }]
277296 client .get ('/many_to_many/' )
278297 assert not logger .log .called
279298
299+ @override_settings (NPLUSONE_WHITELIST = [{'model' : 'testapp.*' }])
280300 def test_many_to_many_whitelist_wildcard (self , objects , client , logger ):
281- settings .NPLUSONE_WHITELIST = [{'model' : 'testapp.*' }]
282301 client .get ('/many_to_many/' )
283302 assert not logger .log .called
284303
304+ def test_deferred (self , objects , client , logger ):
305+ client .get ('/deferred/' )
306+ assert len (logger .log .call_args_list ) == 1
307+ args = logger .log .call_args [0 ]
308+ assert 'Medicine.name' in args [1 ]
309+
310+ def test_double_deferred (self , objects , client , logger ):
311+ client .get ('/double_deferred/' )
312+ assert len (logger .log .call_args_list ) == 2
313+ messages = sorted ({args [0 ][1 ] for args in logger .log .call_args_list })
314+ assert 'Medicine.name' in messages [0 ]
315+ assert 'Medicine.prescription' in messages [1 ]
316+
285317
286318@pytest .mark .django_db
287319def test_values (objects , lazy_listener ):
0 commit comments