|
| 1 | +from datetime import datetime |
| 2 | + |
1 | 3 | import pytest
|
| 4 | +from graphql.core.execution.base import ResolveInfo, ExecutionContext |
2 | 5 |
|
3 | 6 | from graphene import ObjectType, Schema
|
4 | 7 | from graphene.contrib.django import DjangoNode
|
|
7 | 10 | from graphene.contrib.django.tests.models import Article, Pet, Reporter
|
8 | 11 | from graphene.contrib.django.utils import DJANGO_FILTER_INSTALLED
|
9 | 12 | from graphene.relay import NodeField
|
| 13 | +from graphene.utils import ProxySnakeDict |
10 | 14 |
|
11 | 15 | pytestmark = []
|
12 | 16 | if DJANGO_FILTER_INSTALLED:
|
@@ -160,6 +164,57 @@ class Query(ObjectType):
|
160 | 164 | assert_orderable(articles_field)
|
161 | 165 |
|
162 | 166 |
|
| 167 | +def test_filter_filterset_related_results(): |
| 168 | + class ReporterFilterNode(DjangoNode): |
| 169 | + |
| 170 | + class Meta: |
| 171 | + model = Reporter |
| 172 | + filter_fields = ['first_name', 'articles'] |
| 173 | + filter_order_by = True |
| 174 | + |
| 175 | + class ArticleFilterNode(DjangoNode): |
| 176 | + |
| 177 | + class Meta: |
| 178 | + model = Article |
| 179 | + filter_fields = ['headline', 'reporter'] |
| 180 | + filter_order_by = True |
| 181 | + |
| 182 | + class Query(ObjectType): |
| 183 | + all_reporters = DjangoFilterConnectionField(ReporterFilterNode) |
| 184 | + all_articles = DjangoFilterConnectionField(ArticleFilterNode) |
| 185 | + reporter = NodeField(ReporterFilterNode) |
| 186 | + article = NodeField(ArticleFilterNode) |
| 187 | + |
| 188 | + r1 = Reporter. objects. create( first_name='r1', last_name='r1', email='[email protected]') |
| 189 | + r2 = Reporter. objects. create( first_name='r2', last_name='r2', email='[email protected]') |
| 190 | + a1 = Article.objects.create(headline='a1', pub_date=datetime.now(), reporter=r1) |
| 191 | + a2 = Article.objects.create(headline='a2', pub_date=datetime.now(), reporter=r2) |
| 192 | + |
| 193 | + query = ''' |
| 194 | + query { |
| 195 | + allReporters { |
| 196 | + edges { |
| 197 | + node { |
| 198 | + articles { |
| 199 | + edges { |
| 200 | + node { |
| 201 | + headline |
| 202 | + } |
| 203 | + } |
| 204 | + } |
| 205 | + } |
| 206 | + } |
| 207 | + } |
| 208 | + } |
| 209 | + ''' |
| 210 | + schema = Schema(query=Query) |
| 211 | + result = schema.execute(query) |
| 212 | + assert not result.errors |
| 213 | + # We should only get back a single article for each reporter |
| 214 | + assert len(result.data['allReporters']['edges'][0]['node']['articles']['edges']) == 1 |
| 215 | + assert len(result.data['allReporters']['edges'][1]['node']['articles']['edges']) == 1 |
| 216 | + |
| 217 | + |
163 | 218 | def test_global_id_field_implicit():
|
164 | 219 | field = DjangoFilterConnectionField(ArticleNode, fields=['id'])
|
165 | 220 | filterset_class = field.resolver_fn.get_filterset_class()
|
|
0 commit comments