Skip to content

Commit 858bccf

Browse files
author
Ryan P Kilby
committed
Split off old tests as regression tests
There are several test cases that cover old features of drf-filters that have been made obsolete by improvements to django-filter.
1 parent 77e7181 commit 858bccf

File tree

2 files changed

+297
-250
lines changed

2 files changed

+297
-250
lines changed

tests/test_filterset.py

Lines changed: 5 additions & 250 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
# -*- coding:utf-8 -*-
1+
22
from __future__ import absolute_import
33
from __future__ import unicode_literals
44

55
import 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

109
from rest_framework_filters import filters
1110

@@ -35,19 +34,13 @@
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-
5144
class 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-
630530
class 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

802557
class FilterExclusionTests(TestCase):
803558

0 commit comments

Comments
 (0)