1- # -*- coding:utf-8 -*-
1+
22from __future__ import absolute_import
33from __future__ import unicode_literals
44
55import datetime
66
7- from django .test import TestCase , override_settings
8- from django .utils .dateparse import parse_time , parse_datetime
7+ from django .test import TestCase
98
109from rest_framework_filters import filters
1110
3534 CFilter ,
3635 PersonFilter ,
3736
38- AllLookupsPersonDateFilter ,
37+ # AllLookupsPersonDateFilter,
3938 # ExplicitLookupsPersonDateFilter,
40- InSetLookupPersonIDFilter ,
41- InSetLookupPersonNameFilter ,
39+ # InSetLookupPersonIDFilter,
40+ # InSetLookupPersonNameFilter,
4241)
4342
4443
45- def add_timedelta (time , timedelta ):
46- dt = datetime .datetime .combine (datetime .datetime .today (), time )
47- dt += timedelta
48- return dt .time ()
49-
50-
5144class TestFilterSets (TestCase ):
5245
5346 @classmethod
@@ -534,183 +527,8 @@ def test_related_method_filter(self):
534527 self .assertEqual (results [0 ].comment , "Cover 2" )
535528
536529
537- class DatetimeTests (TestCase ):
538-
539- @classmethod
540- def setUpTestData (cls ):
541- john = Person .objects .create (name = "John" )
542-
543- # Created at least one second apart
544- mark = Person .objects .create (name = "Mark" , best_friend = john )
545- mark .time_joined = add_timedelta (mark .time_joined , datetime .timedelta (seconds = 1 ))
546- mark .datetime_joined += datetime .timedelta (seconds = 1 )
547- mark .save ()
548-
549- def test_implicit_date_filters (self ):
550- john = Person .objects .get (name = "John" )
551- # Mark was created at least one second after John.
552- # mark = Person.objects.get(name="Mark")
553-
554- from rest_framework import serializers
555- from rest_framework .renderers import JSONRenderer
556-
557- class PersonSerializer (serializers .ModelSerializer ):
558- class Meta :
559- model = Person
560-
561- # Figure out what the date strings should look like based on the
562- # serializer output.
563- data = PersonSerializer (john ).data
564-
565- date_str = JSONRenderer ().render (data ['date_joined' ]).decode ('utf-8' ).strip ('"' )
566-
567- # Adjust for imprecise rendering of time
568- datetime_str = JSONRenderer ().render (parse_datetime (data ['datetime_joined' ]) + datetime .timedelta (seconds = 0.6 )).decode ('utf-8' ).strip ('"' )
569-
570- # Adjust for imprecise rendering of time
571- dt = datetime .datetime .combine (datetime .date .today (), parse_time (data ['time_joined' ])) + datetime .timedelta (seconds = 0.6 )
572- time_str = JSONRenderer ().render (dt .time ()).decode ('utf-8' ).strip ('"' )
573-
574- # DateField
575- GET = {
576- 'date_joined__lte' : date_str ,
577- }
578- f = AllLookupsPersonDateFilter (GET , queryset = Person .objects .all ())
579- self .assertEqual (len (list (f )), 2 )
580- p = list (f )[0 ]
581-
582- # DateTimeField
583- GET = {
584- 'datetime_joined__lte' : datetime_str ,
585- }
586- f = AllLookupsPersonDateFilter (GET , queryset = Person .objects .all ())
587- self .assertEqual (len (list (f )), 1 )
588- p = list (f )[0 ]
589- self .assertEqual (p .name , "John" )
590-
591- # TimeField
592- GET = {
593- 'time_joined__lte' : time_str ,
594- }
595- f = AllLookupsPersonDateFilter (GET , queryset = Person .objects .all ())
596- self .assertEqual (len (list (f )), 1 )
597- p = list (f )[0 ]
598- self .assertEqual (p .name , "John" )
599-
600- @override_settings (USE_TZ = True )
601- def test_datetime_timezone_awareness (self ):
602- # Addresses issue #24 - ensure that datetime strings terminating
603- # in 'Z' are correctly handled.
604- from rest_framework import serializers
605- from rest_framework .renderers import JSONRenderer
606-
607- class PersonSerializer (serializers .ModelSerializer ):
608- class Meta :
609- model = Person
610-
611- # Figure out what the date strings should look like based on the
612- # serializer output.
613- john = Person .objects .get (name = "John" )
614- data = PersonSerializer (john ).data
615- datetime_str = JSONRenderer ().render (parse_datetime (data ['datetime_joined' ]) + datetime .timedelta (seconds = 0.6 )).decode ('utf-8' ).strip ('"' )
616-
617- # This is more for documentation - DRF appends a 'Z' to timezone aware UTC datetimes when rendering:
618- # https://github.com/tomchristie/django-rest-framework/blob/3.2.0/rest_framework/fields.py#L1002-L1006
619- self .assertTrue (datetime_str .endswith ('Z' ))
620-
621- GET = {
622- 'datetime_joined__lte' : datetime_str ,
623- }
624- f = AllLookupsPersonDateFilter (GET , queryset = Person .objects .all ())
625- self .assertEqual (len (list (f )), 1 )
626- p = list (f )[0 ]
627- self .assertEqual (p .name , "John" )
628-
629-
630530class FilterOverrideTests (TestCase ):
631531
632- @classmethod
633- def setUpTestData (cls ):
634- john = Person .objects .create (name = "John" )
635- Person .objects .create (name = "Mark" , best_friend = john )
636-
637- User .objects .create (username = "user1" , email = "user1@example.org" , is_active = True , last_login = datetime .date .today ())
638- User .objects .create (username = "user2" , email = "user2@example.org" , is_active = False )
639-
640- def test_inset_number_filter (self ):
641- p1 = Person .objects .get (name = "John" ).pk
642- p2 = Person .objects .get (name = "Mark" ).pk
643-
644- ALL_GET = {
645- 'pk__in' : '{:d},{:d}' .format (p1 , p2 ),
646- }
647- f = InSetLookupPersonIDFilter (ALL_GET , queryset = Person .objects .all ())
648- f = [x .pk for x in f ]
649- self .assertEqual (len (f ), 2 )
650- self .assertIn (p1 , f )
651- self .assertIn (p2 , f )
652-
653- INVALID_GET = {
654- 'pk__in' : '{:d},c{:d}' .format (p1 , p2 )
655- }
656- f = InSetLookupPersonIDFilter (INVALID_GET , queryset = Person .objects .all ())
657- self .assertEqual (len (list (f )), 0 )
658-
659- EXTRA_GET = {
660- 'pk__in' : '{:d},{:d},{:d}' .format (p1 , p2 , p1 * p2 )
661- }
662- f = InSetLookupPersonIDFilter (EXTRA_GET , queryset = Person .objects .all ())
663- f = [x .pk for x in f ]
664- self .assertEqual (len (f ), 2 )
665- self .assertIn (p1 , f )
666- self .assertIn (p2 , f )
667-
668- DISORDERED_GET = {
669- 'pk__in' : '{:d},{:d},{:d}' .format (p2 , p2 * p1 , p1 )
670- }
671- f = InSetLookupPersonIDFilter (DISORDERED_GET , queryset = Person .objects .all ())
672- f = [x .pk for x in f ]
673- self .assertEqual (len (f ), 2 )
674- self .assertIn (p1 , f )
675- self .assertIn (p2 , f )
676-
677- def test_inset_char_filter (self ):
678- p1 = Person .objects .get (name = "John" ).name
679- p2 = Person .objects .get (name = "Mark" ).name
680-
681- ALL_GET = {
682- 'name__in' : '{},{}' .format (p1 , p2 ),
683- }
684- f = InSetLookupPersonNameFilter (ALL_GET , queryset = Person .objects .all ())
685- f = [x .name for x in f ]
686- self .assertEqual (len (f ), 2 )
687- self .assertIn (p1 , f )
688- self .assertIn (p2 , f )
689-
690- NONEXISTENT_GET = {
691- 'name__in' : '{},Foo{}' .format (p1 , p2 )
692- }
693- f = InSetLookupPersonNameFilter (NONEXISTENT_GET , queryset = Person .objects .all ())
694- self .assertEqual (len (list (f )), 1 )
695-
696- EXTRA_GET = {
697- 'name__in' : '{},{},{}' .format (p1 , p2 , p1 + p2 )
698- }
699- f = InSetLookupPersonNameFilter (EXTRA_GET , queryset = Person .objects .all ())
700- f = [x .name for x in f ]
701- self .assertEqual (len (f ), 2 )
702- self .assertIn (p1 , f )
703- self .assertIn (p2 , f )
704-
705- DISORDERED_GET = {
706- 'name__in' : '{},{},{}' .format (p2 , p2 + p1 , p1 )
707- }
708- f = InSetLookupPersonNameFilter (DISORDERED_GET , queryset = Person .objects .all ())
709- f = [x .name for x in f ]
710- self .assertEqual (len (f ), 2 )
711- self .assertIn (p1 , f )
712- self .assertIn (p2 , f )
713-
714532 def test_declared_filters (self ):
715533 F = BlogPostOverrideFilter
716534
@@ -735,69 +553,6 @@ def test_dict_declaration(self):
735553 filters .BooleanFilter
736554 )
737555
738- def test_boolean_filter (self ):
739- # Capitalized True
740- GET = {'is_active' : 'True' }
741- filterset = UserFilter (GET , queryset = User .objects .all ())
742- results = list (filterset )
743- self .assertEqual (len (results ), 1 )
744- self .assertEqual (results [0 ].username , 'user1' )
745-
746- # Lowercase True
747- GET = {'is_active' : 'true' }
748- filterset = UserFilter (GET , queryset = User .objects .all ())
749- results = list (filterset )
750- self .assertEqual (len (results ), 1 )
751- self .assertEqual (results [0 ].username , 'user1' )
752-
753- # Uppercase True
754- GET = {'is_active' : 'TRUE' }
755- filterset = UserFilter (GET , queryset = User .objects .all ())
756- results = list (filterset )
757- self .assertEqual (len (results ), 1 )
758- self .assertEqual (results [0 ].username , 'user1' )
759-
760- # Capitalized False
761- GET = {'is_active' : 'False' }
762- filterset = UserFilter (GET , queryset = User .objects .all ())
763- results = list (filterset )
764- self .assertEqual (len (results ), 1 )
765- self .assertEqual (results [0 ].username , 'user2' )
766-
767- # Lowercase False
768- GET = {'is_active' : 'false' }
769- filterset = UserFilter (GET , queryset = User .objects .all ())
770- results = list (filterset )
771- self .assertEqual (len (results ), 1 )
772- self .assertEqual (results [0 ].username , 'user2' )
773-
774- # Uppercase False
775- GET = {'is_active' : 'FALSE' }
776- filterset = UserFilter (GET , queryset = User .objects .all ())
777- results = list (filterset )
778- self .assertEqual (len (results ), 1 )
779- self .assertEqual (results [0 ].username , 'user2' )
780-
781- def test_isnull_override (self ):
782- import django_filters .filters
783-
784- self .assertIsInstance (
785- UserFilter ().filters ['last_login__isnull' ],
786- django_filters .filters .BooleanFilter
787- )
788-
789- GET = {'last_login__isnull' : 'false' }
790- filterset = UserFilter (GET , queryset = User .objects .all ())
791- results = list (filterset )
792- self .assertEqual (len (results ), 1 )
793- self .assertEqual (results [0 ].username , 'user1' )
794-
795- GET = {'last_login__isnull' : 'true' }
796- filterset = UserFilter (GET , queryset = User .objects .all ())
797- results = list (filterset )
798- self .assertEqual (len (results ), 1 )
799- self .assertEqual (results [0 ].username , 'user2' )
800-
801556
802557class FilterExclusionTests (TestCase ):
803558
0 commit comments