11# =============================================================================
22# IMPORTS
33# =============================================================================
4+ # Django
5+ from django .db import connection , reset_queries
6+ from django .test import override_settings
7+
48# Third Party Django
59from rest_framework import status
610from rest_framework .reverse import reverse
2933class PackageGameViewSetTestCase (APITestCase ):
3034
3135 contributor = detail_api = game_1 = game_2 = list_api = owner = None
32- package = package_game_1 = None
36+ package_1 = package_2 = package_game_1 = None
3337
3438 @classmethod
3539 def setUpTestData (cls ):
3640 cls .owner = ForumUserFactory ()
37- cls .package = PackageFactory (
41+ cls .package_1 = PackageFactory (
42+ owner = cls .owner ,
43+ )
44+ cls .package_2 = PackageFactory (
3845 owner = cls .owner ,
3946 )
4047 cls .contributor = ForumUserFactory ()
4148 PackageContributorFactory (
42- package = cls .package ,
49+ package = cls .package_1 ,
50+ user = cls .contributor ,
51+ )
52+ PackageContributorFactory (
53+ package = cls .package_2 ,
4354 user = cls .contributor ,
4455 )
4556 cls .game_1 = GameFactory (
@@ -63,11 +74,11 @@ def setUpTestData(cls):
6374 icon = 'icon4.jpg' ,
6475 )
6576 cls .package_game_1 = PackageGameFactory (
66- package = cls .package ,
77+ package = cls .package_1 ,
6778 game = cls .game_1 ,
6879 )
6980 cls .package_game_2 = PackageGameFactory (
70- package = cls .package ,
81+ package = cls .package_1 ,
7182 game = cls .game_2 ,
7283 )
7384 cls .regular_user = ForumUserFactory ()
@@ -76,13 +87,13 @@ def setUpTestData(cls):
7687 cls .list_path = reverse (
7788 viewname = cls .list_api ,
7889 kwargs = {
79- 'package_slug' : cls .package .slug ,
90+ 'package_slug' : cls .package_1 .slug ,
8091 },
8192 )
8293 cls .detail_path = reverse (
8394 viewname = cls .detail_api ,
8495 kwargs = {
85- 'package_slug' : cls .package .slug ,
96+ 'package_slug' : cls .package_1 .slug ,
8697 'pk' : cls .package_game_1 .id ,
8798 },
8899 )
@@ -120,9 +131,14 @@ def test_http_method_names(self):
120131 tuple2 = ('get' , 'post' , 'delete' , 'options' ),
121132 )
122133
134+ @override_settings (DEBUG = True )
123135 def test_get_list (self ):
124136 # Verify that non-logged-in user can see results but not 'id'
125137 response = self .client .get (path = self .list_path )
138+ self .assertEqual (
139+ first = len (connection .queries ),
140+ second = 4 ,
141+ )
126142 self .assertEqual (
127143 first = response .status_code ,
128144 second = status .HTTP_200_OK ,
@@ -143,8 +159,13 @@ def test_get_list(self):
143159 )
144160
145161 # Verify that regular user can see results but not 'id'
162+ reset_queries ()
146163 self .client .force_login (self .regular_user .user )
147164 response = self .client .get (path = self .list_path )
165+ self .assertEqual (
166+ first = len (connection .queries ),
167+ second = 6 ,
168+ )
148169 self .assertEqual (
149170 first = response .status_code ,
150171 second = status .HTTP_200_OK ,
@@ -163,8 +184,13 @@ def test_get_list(self):
163184 )
164185
165186 # Verify that contributors can see results AND 'id'
187+ reset_queries ()
166188 self .client .force_login (self .contributor .user )
167189 response = self .client .get (path = self .list_path )
190+ self .assertEqual (
191+ first = len (connection .queries ),
192+ second = 6 ,
193+ )
168194 self .assertEqual (
169195 first = response .status_code ,
170196 second = status .HTTP_200_OK ,
@@ -184,8 +210,13 @@ def test_get_list(self):
184210 )
185211
186212 # Verify that the owner can see results AND 'id'
213+ reset_queries ()
187214 self .client .force_login (self .owner .user )
188215 response = self .client .get (path = self .list_path )
216+ self .assertEqual (
217+ first = len (connection .queries ),
218+ second = 5 ,
219+ )
189220 self .assertEqual (
190221 first = response .status_code ,
191222 second = status .HTTP_200_OK ,
@@ -204,6 +235,70 @@ def test_get_list(self):
204235 },
205236 )
206237
238+ @override_settings (DEBUG = True )
239+ def test_get_list_empty (self ):
240+ list_path = reverse (
241+ viewname = self .list_api ,
242+ kwargs = {
243+ 'package_slug' : self .package_2 .slug ,
244+ },
245+ )
246+
247+ # Verify that non-logged-in user can see results but not 'id'
248+ response = self .client .get (path = list_path )
249+ self .assertEqual (
250+ first = len (connection .queries ),
251+ second = 2 ,
252+ )
253+ self .assertEqual (
254+ first = response .status_code ,
255+ second = status .HTTP_200_OK ,
256+ )
257+ self .assertEqual (first = response .json ()['count' ], second = 0 )
258+
259+ # Verify that regular user can see results but not 'id'
260+ reset_queries ()
261+ self .client .force_login (self .regular_user .user )
262+ response = self .client .get (path = list_path )
263+ self .assertEqual (
264+ first = len (connection .queries ),
265+ second = 4 ,
266+ )
267+ self .assertEqual (
268+ first = response .status_code ,
269+ second = status .HTTP_200_OK ,
270+ )
271+ self .assertEqual (first = response .json ()['count' ], second = 0 )
272+
273+ # Verify that contributors can see results AND 'id'
274+ reset_queries ()
275+ self .client .force_login (self .contributor .user )
276+ response = self .client .get (path = list_path )
277+ self .assertEqual (
278+ first = len (connection .queries ),
279+ second = 4 ,
280+ )
281+ self .assertEqual (
282+ first = response .status_code ,
283+ second = status .HTTP_200_OK ,
284+ )
285+ self .assertEqual (first = response .json ()['count' ], second = 0 )
286+
287+ # Verify that the owner can see results AND 'id'
288+ reset_queries ()
289+ self .client .force_login (self .owner .user )
290+ response = self .client .get (path = list_path )
291+ self .assertEqual (
292+ first = len (connection .queries ),
293+ second = 4 ,
294+ )
295+ self .assertEqual (
296+ first = response .status_code ,
297+ second = status .HTTP_200_OK ,
298+ )
299+ self .assertEqual (first = response .json ()['count' ], second = 0 )
300+
301+ @override_settings (DEBUG = True )
207302 def test_get_list_failure (self ):
208303 response = self .client .get (
209304 path = reverse (
@@ -213,6 +308,10 @@ def test_get_list_failure(self):
213308 }
214309 ),
215310 )
311+ self .assertEqual (
312+ first = len (connection .queries ),
313+ second = 1 ,
314+ )
216315 self .assertEqual (
217316 first = response .status_code ,
218317 second = status .HTTP_404_NOT_FOUND ,
@@ -222,25 +321,40 @@ def test_get_list_failure(self):
222321 d2 = {'detail' : 'Invalid package_slug.' },
223322 )
224323
324+ @override_settings (DEBUG = True )
225325 def test_get_details (self ):
226326 # Verify that non-logged-in user cannot see details
227327 response = self .client .get (path = self .detail_path )
328+ self .assertEqual (
329+ first = len (connection .queries ),
330+ second = 3 ,
331+ )
228332 self .assertEqual (
229333 first = response .status_code ,
230334 second = status .HTTP_403_FORBIDDEN ,
231335 )
232336
233337 # Verify that regular user cannot see details
338+ reset_queries ()
234339 self .client .force_login (self .regular_user .user )
235340 response = self .client .get (path = self .detail_path )
341+ self .assertEqual (
342+ first = len (connection .queries ),
343+ second = 5 ,
344+ )
236345 self .assertEqual (
237346 first = response .status_code ,
238347 second = status .HTTP_403_FORBIDDEN ,
239348 )
240349
241350 # Verify that contributors can see details
351+ reset_queries ()
242352 self .client .force_login (self .contributor .user )
243353 response = self .client .get (path = self .detail_path )
354+ self .assertEqual (
355+ first = len (connection .queries ),
356+ second = 5 ,
357+ )
244358 request = response .wsgi_request
245359 icon = f'{ request .scheme } ://{ request .get_host ()} { self .game_1 .icon .url } '
246360 self .assertEqual (
@@ -260,8 +374,13 @@ def test_get_details(self):
260374 )
261375
262376 # Verify that the owner can see details
377+ reset_queries ()
263378 self .client .force_login (self .owner .user )
264379 response = self .client .get (path = self .detail_path )
380+ self .assertEqual (
381+ first = len (connection .queries ),
382+ second = 5 ,
383+ )
265384 self .assertEqual (
266385 first = response .status_code ,
267386 second = status .HTTP_200_OK ,
@@ -278,17 +397,22 @@ def test_get_details(self):
278397 },
279398 )
280399
400+ @override_settings (DEBUG = True )
281401 def test_get_detail_failure (self ):
282402 self .client .force_login (self .owner .user )
283403 response = self .client .get (
284404 path = reverse (
285405 viewname = self .detail_api ,
286406 kwargs = {
287- 'package_slug' : self .package .slug ,
407+ 'package_slug' : self .package_1 .slug ,
288408 'pk' : 'invalid' ,
289409 },
290410 ),
291411 )
412+ self .assertEqual (
413+ first = len (connection .queries ),
414+ second = 3 ,
415+ )
292416 self .assertEqual (
293417 first = response .status_code ,
294418 second = status .HTTP_404_NOT_FOUND ,
@@ -404,7 +528,7 @@ def test_delete(self):
404528 path = reverse (
405529 viewname = self .detail_api ,
406530 kwargs = {
407- 'package_slug' : self .package .slug ,
531+ 'package_slug' : self .package_1 .slug ,
408532 'pk' : self .package_game_2 .id ,
409533 },
410534 ),
@@ -421,7 +545,7 @@ def test_options(self):
421545 content = response .json ()
422546 self .assertEqual (
423547 first = content ['name' ],
424- second = f'{ self .package } - Game' ,
548+ second = f'{ self .package_1 } - Game' ,
425549 )
426550 self .assertNotIn (member = 'actions' , container = content )
427551
@@ -432,7 +556,7 @@ def test_options(self):
432556 content = response .json ()
433557 self .assertEqual (
434558 first = content ['name' ],
435- second = f'{ self .package } - Game' ,
559+ second = f'{ self .package_1 } - Game' ,
436560 )
437561 self .assertNotIn (member = 'actions' , container = content )
438562
@@ -443,7 +567,7 @@ def test_options(self):
443567 content = response .json ()
444568 self .assertEqual (
445569 first = content ['name' ],
446- second = f'{ self .package } - Game' ,
570+ second = f'{ self .package_1 } - Game' ,
447571 )
448572 self .assertIn (member = 'actions' , container = content )
449573 self .assertSetEqual (set1 = set (content ['actions' ]), set2 = {'POST' })
@@ -455,7 +579,7 @@ def test_options(self):
455579 content = response .json ()
456580 self .assertEqual (
457581 first = content ['name' ],
458- second = f'{ self .package } - Game' ,
582+ second = f'{ self .package_1 } - Game' ,
459583 )
460584 self .assertIn (member = 'actions' , container = content )
461585 self .assertSetEqual (set1 = set (content ['actions' ]), set2 = {'POST' })
@@ -467,7 +591,7 @@ def test_options_object(self):
467591 content = response .json ()
468592 self .assertEqual (
469593 first = content ['name' ],
470- second = f'{ self .package } - Game' ,
594+ second = f'{ self .package_1 } - Game' ,
471595 )
472596 self .assertNotIn (member = 'actions' , container = content )
473597
@@ -478,7 +602,7 @@ def test_options_object(self):
478602 content = response .json ()
479603 self .assertEqual (
480604 first = content ['name' ],
481- second = f'{ self .package } - Game' ,
605+ second = f'{ self .package_1 } - Game' ,
482606 )
483607 self .assertNotIn (member = 'actions' , container = content )
484608
@@ -489,7 +613,7 @@ def test_options_object(self):
489613 content = response .json ()
490614 self .assertEqual (
491615 first = content ['name' ],
492- second = f'{ self .package } - Game' ,
616+ second = f'{ self .package_1 } - Game' ,
493617 )
494618 self .assertIn (member = 'actions' , container = content )
495619 self .assertSetEqual (set1 = set (content ['actions' ]), set2 = {'DELETE' })
@@ -501,7 +625,7 @@ def test_options_object(self):
501625 content = response .json ()
502626 self .assertEqual (
503627 first = content ['name' ],
504- second = f'{ self .package } - Game' ,
628+ second = f'{ self .package_1 } - Game' ,
505629 )
506630 self .assertIn (member = 'actions' , container = content )
507631 self .assertSetEqual (set1 = set (content ['actions' ]), set2 = {'DELETE' })
0 commit comments