mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-28 08:59:54 +03:00
relocated multiple condition filter tests to their own file
This commit is contained in:
parent
14e839809b
commit
ba34e6c3c7
|
@ -297,13 +297,8 @@ class Blog(models.Model):
|
||||||
name = models.CharField(max_length=20)
|
name = models.CharField(max_length=20)
|
||||||
|
|
||||||
|
|
||||||
class Tag(models.Model):
|
|
||||||
name = models.CharField(max_length=20)
|
|
||||||
|
|
||||||
|
|
||||||
class Entry(models.Model):
|
class Entry(models.Model):
|
||||||
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
|
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
|
||||||
tags = models.ManyToManyField(Tag, related_name='entries', blank=True)
|
|
||||||
headline = models.CharField(max_length=120)
|
headline = models.CharField(max_length=120)
|
||||||
pub_date = models.DateField(null=True)
|
pub_date = models.DateField(null=True)
|
||||||
|
|
||||||
|
@ -321,63 +316,26 @@ class SearchFilterToManyTests(TestCase):
|
||||||
b1 = Blog.objects.create(name='Blog 1')
|
b1 = Blog.objects.create(name='Blog 1')
|
||||||
b2 = Blog.objects.create(name='Blog 2')
|
b2 = Blog.objects.create(name='Blog 2')
|
||||||
|
|
||||||
t1 = Tag.objects.create(name='tag1')
|
|
||||||
t2 = Tag.objects.create(name='tag2')
|
|
||||||
|
|
||||||
# Multiple entries on Lennon published in 1979 - distinct should deduplicate
|
# Multiple entries on Lennon published in 1979 - distinct should deduplicate
|
||||||
e1 = Entry.objects.create(blog=b1, headline='Something about Lennon', pub_date=datetime.date(1979, 1, 1))
|
Entry.objects.create(blog=b1, headline='Something about Lennon', pub_date=datetime.date(1979, 1, 1))
|
||||||
e1.tags.add(t1)
|
Entry.objects.create(blog=b1, headline='Another thing about Lennon', pub_date=datetime.date(1979, 6, 1))
|
||||||
e1.save()
|
|
||||||
|
|
||||||
e2 = Entry.objects.create(blog=b1, headline='Another thing about Lennon', pub_date=datetime.date(1979, 6, 1))
|
|
||||||
e2.tags.add(t2)
|
|
||||||
e2.save()
|
|
||||||
|
|
||||||
# Entry on Lennon *and* a separate entry in 1979 - should not match
|
# Entry on Lennon *and* a separate entry in 1979 - should not match
|
||||||
e3 = Entry.objects.create(blog=b2, headline='Something unrelated', pub_date=datetime.date(1979, 1, 1))
|
Entry.objects.create(blog=b2, headline='Something unrelated', pub_date=datetime.date(1979, 1, 1))
|
||||||
|
Entry.objects.create(blog=b2, headline='Retrospective on Lennon', pub_date=datetime.date(1990, 6, 1))
|
||||||
|
|
||||||
e4 = Entry.objects.create(blog=b2, headline='Retrospective on Lennon', pub_date=datetime.date(1990, 6, 1))
|
def test_multiple_filter_conditions(self):
|
||||||
e4.tags.add(t1)
|
|
||||||
e4.tags.add(t2)
|
|
||||||
e4.save()
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
class SearchListView(generics.ListAPIView):
|
class SearchListView(generics.ListAPIView):
|
||||||
queryset = Blog.objects.all()
|
queryset = Blog.objects.all()
|
||||||
serializer_class = BlogSerializer
|
serializer_class = BlogSerializer
|
||||||
filter_backends = (filters.SearchFilter,)
|
filter_backends = (filters.SearchFilter,)
|
||||||
search_fields = (
|
search_fields = ('=name', 'entry__headline', '=entry__pub_date__year')
|
||||||
'=name',
|
|
||||||
'entry__headline',
|
|
||||||
'=entry__pub_date__year',
|
|
||||||
'entry__tags__name'
|
|
||||||
)
|
|
||||||
self.SearchListView = SearchListView
|
|
||||||
|
|
||||||
def test_multiple_filter_conditions(self):
|
view = SearchListView.as_view()
|
||||||
view = self.SearchListView.as_view()
|
|
||||||
request = factory.get('/', {'search': 'Lennon,1979'})
|
request = factory.get('/', {'search': 'Lennon,1979'})
|
||||||
response = view(request)
|
response = view(request)
|
||||||
assert len(response.data) == 1
|
assert len(response.data) == 1
|
||||||
|
|
||||||
def test_single_filter_condition_manytomany(self):
|
|
||||||
view = self.SearchListView.as_view()
|
|
||||||
|
|
||||||
request = factory.get('/', {'search': 'tag1'})
|
|
||||||
response = view(request)
|
|
||||||
assert len(response.data) == 2
|
|
||||||
|
|
||||||
request = factory.get('/', {'search': 'tag2'})
|
|
||||||
response = view(request)
|
|
||||||
assert len(response.data) == 2
|
|
||||||
|
|
||||||
def test_multiple_filter_conditions_manytomany(self):
|
|
||||||
view = self.SearchListView.as_view()
|
|
||||||
request = factory.get('/', {'search': 'tag1,tag2'})
|
|
||||||
response = view(request)
|
|
||||||
assert len(response.data) == 1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SearchFilterAnnotatedSerializer(serializers.ModelSerializer):
|
class SearchFilterAnnotatedSerializer(serializers.ModelSerializer):
|
||||||
title_text = serializers.CharField()
|
title_text = serializers.CharField()
|
||||||
|
|
115
tests/test_filters_multiple.py
Normal file
115
tests/test_filters_multiple.py
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
from rest_framework import filters, generics, serializers
|
||||||
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
|
factory = APIRequestFactory()
|
||||||
|
|
||||||
|
|
||||||
|
class Post(models.Model):
|
||||||
|
name = models.CharField(max_length=20)
|
||||||
|
|
||||||
|
|
||||||
|
class Author(models.Model):
|
||||||
|
name = models.CharField(max_length=20)
|
||||||
|
|
||||||
|
|
||||||
|
class EntryRecord(models.Model):
|
||||||
|
blog = models.ForeignKey(Post, on_delete=models.CASCADE)
|
||||||
|
authors = models.ManyToManyField(Author, related_name='entries', blank=True)
|
||||||
|
headline = models.CharField(max_length=120)
|
||||||
|
pub_date = models.DateField(null=True)
|
||||||
|
|
||||||
|
|
||||||
|
class PostSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Post
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
class EntryRecordSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = EntryRecord
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
class SearchFilterToManyTests(TestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
b1 = Post.objects.create(name='Post 1')
|
||||||
|
b2 = Post.objects.create(name='Post 2')
|
||||||
|
|
||||||
|
a1 = Author.objects.create(name='alice')
|
||||||
|
a2 = Author.objects.create(name='bob')
|
||||||
|
|
||||||
|
# Multiple entries on Lennon published in 1979 - distinct should deduplicate
|
||||||
|
e1 = EntryRecord.objects.create(blog=b1, headline='Something about Lennon', pub_date=datetime.date(1979, 1, 1))
|
||||||
|
e1.authors.add(a1)
|
||||||
|
e1.save()
|
||||||
|
|
||||||
|
e2 = EntryRecord.objects.create(blog=b1, headline='Another thing about Lennon', pub_date=datetime.date(1979, 6, 1))
|
||||||
|
e2.authors.add(a2)
|
||||||
|
e2.save()
|
||||||
|
|
||||||
|
# EntryRecord on Lennon *and* a separate entryrecord in 1979 - should not match
|
||||||
|
e3 = EntryRecord.objects.create(blog=b2, headline='Something unrelated', pub_date=datetime.date(1979, 1, 1))
|
||||||
|
|
||||||
|
e4 = EntryRecord.objects.create(blog=b2, headline='Retrospective on Lennon', pub_date=datetime.date(1990, 6, 1))
|
||||||
|
e4.authors.add(a1)
|
||||||
|
e4.authors.add(a2)
|
||||||
|
e4.save()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
class SearchPostListView(generics.ListAPIView):
|
||||||
|
queryset = Post.objects.all()
|
||||||
|
serializer_class = PostSerializer
|
||||||
|
filter_backends = (filters.SearchFilter,)
|
||||||
|
search_fields = (
|
||||||
|
'=name',
|
||||||
|
'entryrecord__headline',
|
||||||
|
'=entryrecord__pub_date__year',
|
||||||
|
'entryrecord__authors__name'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.SearchPostListView = SearchPostListView
|
||||||
|
|
||||||
|
class SearchEntryRecordListView(generics.ListAPIView):
|
||||||
|
queryset = EntryRecord.objects.all()
|
||||||
|
serializer_class = EntryRecordSerializer
|
||||||
|
filter_backends = (filters.SearchFilter,)
|
||||||
|
search_fields = (
|
||||||
|
'authors__name',
|
||||||
|
)
|
||||||
|
|
||||||
|
self.SearchEntryRecordListView = SearchEntryRecordListView
|
||||||
|
|
||||||
|
def test_multiple_filter_conditions(self):
|
||||||
|
view = self.SearchPostListView.as_view()
|
||||||
|
request = factory.get('/', {'search': 'Lennon, 1979'})
|
||||||
|
response = view(request)
|
||||||
|
assert len(response.data) == 1
|
||||||
|
|
||||||
|
def test_single_filter_condition_manytomany(self):
|
||||||
|
view = self.SearchPostListView.as_view()
|
||||||
|
|
||||||
|
request = factory.get('/', {'search': 'alice'})
|
||||||
|
response = view(request)
|
||||||
|
assert len(response.data) == 2
|
||||||
|
|
||||||
|
request = factory.get('/', {'search': 'bob'})
|
||||||
|
response = view(request)
|
||||||
|
assert len(response.data) == 2
|
||||||
|
|
||||||
|
def test_multiple_filter_conditions_manytomany(self):
|
||||||
|
view = self.SearchEntryRecordListView.as_view()
|
||||||
|
request = factory.get('/', {'search': 'alice, bob'})
|
||||||
|
response = view(request)
|
||||||
|
assert len(response.data) == 1
|
||||||
|
|
||||||
|
dual_entry = EntryRecord.objects.get(headline='Retrospective on Lennon')
|
||||||
|
response_id = response.data[0].get('id')
|
||||||
|
assert response_id == dual_entry.id
|
Loading…
Reference in New Issue
Block a user