mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-07-13 17:52:19 +03:00
testing interaction between DjangoFilterConnectionField and DjangoESFilterConnectionField to get a QS
This commit is contained in:
parent
837d74f941
commit
75946f97f5
|
@ -1,13 +1,13 @@
|
||||||
|
from elasticsearch_dsl.query import Query
|
||||||
from graphene_django.elasticsearch.filter.bridges import QuerysetBridge
|
from graphene_django.elasticsearch.filter.bridges import QuerysetBridge
|
||||||
from graphene_django.filter import DjangoFilterConnectionField
|
from graphene_django.filter import DjangoFilterConnectionField
|
||||||
from elasticsearch_dsl.query import Query
|
|
||||||
|
|
||||||
|
|
||||||
class DjangoESFilterConnectionField(DjangoFilterConnectionField):
|
class DjangoESFilterConnectionField(DjangoFilterConnectionField):
|
||||||
"""A Field to replace DjangoFilterConnectionField manager by QuerysetBridge"""
|
"""A Field to replace DjangoFilterConnectionField manager by QuerysetBridge"""
|
||||||
|
|
||||||
def get_manager(self):
|
def get_manager(self):
|
||||||
"""Retuning a QuerysetBridge to replace the direct use over the QS"""
|
"""Returning a QuerysetBridge to replace the direct use over the QS"""
|
||||||
return QuerysetBridge(search=self.filterset_class._meta.index.search())
|
return QuerysetBridge(search=self.filterset_class._meta.index.search())
|
||||||
|
|
||||||
def merge_querysets(cls, default_queryset, queryset):
|
def merge_querysets(cls, default_queryset, queryset):
|
||||||
|
|
|
@ -92,7 +92,7 @@ class FilterSetES(six.with_metaclass(FilterSetESMetaclass, object)):
|
||||||
"""
|
"""
|
||||||
query_base = Q("bool")
|
query_base = Q("bool")
|
||||||
for name, filter_es in six.iteritems(self.declared_filters):
|
for name, filter_es in six.iteritems(self.declared_filters):
|
||||||
query_filter = filter_es.get_q(self.data)
|
query_filter = filter_es.get_q(self.data) if len(self.data) else None
|
||||||
if query_filter is not None:
|
if query_filter is not None:
|
||||||
query_base += query_filter
|
query_base += query_filter
|
||||||
return query_base
|
return query_base
|
||||||
|
|
|
@ -1,8 +1,34 @@
|
||||||
|
from graphene import ObjectType
|
||||||
|
from django_elasticsearch_dsl import DocType, Index
|
||||||
|
|
||||||
|
from graphene_django.tests.models import Article
|
||||||
|
from graphene_django.filter.tests.test_fields import ArticleNode
|
||||||
from graphene_django.elasticsearch.filter import filters
|
from graphene_django.elasticsearch.filter import filters
|
||||||
|
from graphene_django.elasticsearch.filter.fields import DjangoESFilterConnectionField
|
||||||
from graphene_django.elasticsearch.filter.filterset import FilterSetES
|
from graphene_django.elasticsearch.filter.filterset import FilterSetES
|
||||||
|
|
||||||
|
ads_index = Index('articles')
|
||||||
|
|
||||||
|
|
||||||
|
@ads_index.doc_type
|
||||||
|
class ArticleDocument(DocType):
|
||||||
|
"""Article document describing Index"""
|
||||||
|
class Meta(object):
|
||||||
|
"""Metaclass config"""
|
||||||
|
model = Article
|
||||||
|
|
||||||
|
|
||||||
class ArticleFilterES(FilterSetES):
|
class ArticleFilterES(FilterSetES):
|
||||||
|
"""Article Filter for ES"""
|
||||||
|
class Meta(object):
|
||||||
|
"""Metaclass data"""
|
||||||
|
index = ArticleDocument
|
||||||
|
|
||||||
headline = filters.StringFilterES(attr='headline')
|
headline = filters.StringFilterES(attr='headline')
|
||||||
|
|
||||||
|
|
||||||
|
class ESFilterQuery(ObjectType):
|
||||||
|
"""A query for ES fields"""
|
||||||
|
articles = DjangoESFilterConnectionField(
|
||||||
|
ArticleNode, filterset_class=ArticleFilterES
|
||||||
|
)
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from mock import mock
|
||||||
|
|
||||||
|
from graphene import Schema
|
||||||
|
from graphene_django.tests.models import Article, Reporter
|
||||||
from graphene_django.filter.tests.test_fields import assert_arguments, ArticleNode
|
from graphene_django.filter.tests.test_fields import assert_arguments, ArticleNode
|
||||||
|
|
||||||
from graphene_django.elasticsearch.tests.filters import ArticleFilterES
|
|
||||||
from graphene_django.utils import DJANGO_FILTER_INSTALLED, DJANGO_ELASTICSEARCH_DSL_INSTALLED
|
from graphene_django.utils import DJANGO_FILTER_INSTALLED, DJANGO_ELASTICSEARCH_DSL_INSTALLED
|
||||||
|
from graphene_django.elasticsearch.tests.filters import ArticleFilterES, ESFilterQuery
|
||||||
|
|
||||||
|
|
||||||
pytestmark = []
|
pytestmark = []
|
||||||
|
@ -25,3 +29,51 @@ pytestmark.append(pytest.mark.django_db)
|
||||||
def test_filter_string_fields():
|
def test_filter_string_fields():
|
||||||
field = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleFilterES)
|
field = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleFilterES)
|
||||||
assert_arguments(field, "headline", "headline_term")
|
assert_arguments(field, "headline", "headline_term")
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_query():
|
||||||
|
r1 = Reporter.objects.create(first_name="r1", last_name="r1", email="r1@test.com")
|
||||||
|
|
||||||
|
a1 = Article.objects.create(
|
||||||
|
headline="a1",
|
||||||
|
pub_date=datetime.now(),
|
||||||
|
pub_date_time=datetime.now(),
|
||||||
|
reporter=r1,
|
||||||
|
editor=r1,
|
||||||
|
)
|
||||||
|
a2 = Article.objects.create(
|
||||||
|
headline="a2",
|
||||||
|
pub_date=datetime.now(),
|
||||||
|
pub_date_time=datetime.now(),
|
||||||
|
reporter=r1,
|
||||||
|
editor=r1,
|
||||||
|
)
|
||||||
|
|
||||||
|
query = """
|
||||||
|
query {
|
||||||
|
articles {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
headline
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
mock_count = mock.Mock(return_value=3)
|
||||||
|
mock_slice = mock.Mock(return_value=mock.Mock(to_queryset=mock.Mock(
|
||||||
|
return_value=Article.objects.filter(pk__in=[a1.id, a2.id])
|
||||||
|
)))
|
||||||
|
|
||||||
|
with mock.patch('django_elasticsearch_dsl.search.Search.count', mock_count),\
|
||||||
|
mock.patch('django_elasticsearch_dsl.search.Search.__getitem__', mock_slice):
|
||||||
|
|
||||||
|
schema = Schema(query=ESFilterQuery)
|
||||||
|
result = schema.execute(query)
|
||||||
|
|
||||||
|
assert not result.errors
|
||||||
|
|
||||||
|
assert len(result.data["articles"]["edges"]) == 2
|
||||||
|
assert result.data["articles"]["edges"][0]["node"]["headline"] == "a1"
|
||||||
|
assert result.data["articles"]["edges"][1]["node"]["headline"] == "a2"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user