|
| 1 | +from django.core.exceptions import ImproperlyConfigured |
| 2 | +from py.test import raises |
1 | 3 | from django.db.models import Manager
|
2 | 4 | from django.db.models.query import QuerySet
|
3 | 5 |
|
4 | 6 | from graphene.contrib.django import DjangoNode
|
5 |
| -from graphene.contrib.django.resolvers import SimpleQuerySetConnectionResolver |
6 |
| -from graphene.contrib.django.tests.models import Reporter |
| 7 | +from graphene.contrib.django.resolvers import SimpleQuerySetConnectionResolver, FilterConnectionResolver |
| 8 | +from graphene.contrib.django.tests.filters import ReporterFilter, ArticleFilter |
| 9 | +from graphene.contrib.django.tests.models import Reporter, Article |
7 | 10 |
|
8 | 11 |
|
9 | 12 | class ReporterNode(DjangoNode):
|
10 | 13 | class Meta:
|
11 | 14 | model = Reporter
|
12 | 15 |
|
13 | 16 |
|
| 17 | +class ArticleNode(DjangoNode): |
| 18 | + class Meta: |
| 19 | + model = Article |
| 20 | + |
| 21 | + |
14 | 22 | def test_simple_resolve():
|
15 | 23 | reporter = Reporter(id=1, first_name='Cookie Monster')
|
16 | 24 | resolver = SimpleQuerySetConnectionResolver(ReporterNode, on='articles')
|
@@ -51,3 +59,74 @@ def test_simple_order():
|
51 | 59 | assert 'WHERE' not in str(resolved.query)
|
52 | 60 | assert 'ORDER BY' in str(resolved.query)
|
53 | 61 | assert '"last_name" ASC' in str(resolved.query)
|
| 62 | + |
| 63 | + |
| 64 | +def test_filter_get_filterset_class_explicit(): |
| 65 | + reporter = Reporter(id=1, first_name='Cookie Monster') |
| 66 | + resolver = FilterConnectionResolver(ReporterNode, |
| 67 | + filterset_class=ReporterFilter) |
| 68 | + resolver(inst=reporter, args={}, info=None) |
| 69 | + assert resolver.get_filterset_class() == ReporterFilter, \ |
| 70 | + 'ReporterFilter not returned' |
| 71 | + |
| 72 | + |
| 73 | +def test_filter_get_filterset_class_implicit(): |
| 74 | + reporter = Reporter(id=1, first_name='Cookie Monster') |
| 75 | + resolver = FilterConnectionResolver(ReporterNode) |
| 76 | + resolver(inst=reporter, args={}, info=None) |
| 77 | + assert resolver.get_filterset_class().__name__ == 'ReporterFilterSet' |
| 78 | + |
| 79 | + |
| 80 | +def test_filter_get_filterset_class_error(): |
| 81 | + reporter = Reporter(id=1, first_name='Cookie Monster') |
| 82 | + resolver = FilterConnectionResolver(ReporterNode) |
| 83 | + resolver.model = None |
| 84 | + with raises(ImproperlyConfigured) as excinfo: |
| 85 | + resolver(inst=reporter, args={}, info=None) |
| 86 | + assert "must define 'filterset_class' or 'model'" in str(excinfo.value) |
| 87 | + |
| 88 | + |
| 89 | +def test_filter_filter(): |
| 90 | + reporter = Reporter(id=1, first_name='Cookie Monster') |
| 91 | + resolver = FilterConnectionResolver(ReporterNode, |
| 92 | + filterset_class=ReporterFilter) |
| 93 | + resolved = resolver(inst=reporter, args={ |
| 94 | + 'first_name': 'Elmo' |
| 95 | + }, info=None) |
| 96 | + assert '"first_name" = Elmo' in str(resolved.query) |
| 97 | + assert 'ORDER BY' not in str(resolved.query) |
| 98 | + |
| 99 | + |
| 100 | +def test_filter_filter_contains(): |
| 101 | + article = Article(id=1, headline='Cookie Monster eats fruit') |
| 102 | + resolver = FilterConnectionResolver(ArticleNode, |
| 103 | + filterset_class=ArticleFilter) |
| 104 | + resolved = resolver(inst=article, args={ |
| 105 | + 'headline__icontains': 'Elmo' |
| 106 | + }, info=None) |
| 107 | + assert '"headline" LIKE %Elmo%' in str(resolved.query) |
| 108 | + |
| 109 | + |
| 110 | +def test_filter_order(): |
| 111 | + article = Article(id=1, headline='Cookie Monster eats fruit') |
| 112 | + resolver = FilterConnectionResolver(ArticleNode, |
| 113 | + filterset_class=ArticleFilter) |
| 114 | + resolved = resolver(inst=article, args={ |
| 115 | + # TODO: This should be 'order', not 'o' |
| 116 | + 'o': 'headline' |
| 117 | + }, info=None) |
| 118 | + assert 'WHERE' not in str(resolved.query) |
| 119 | + assert 'ORDER BY' in str(resolved.query) |
| 120 | + assert '"headline" ASC' in str(resolved.query) |
| 121 | + |
| 122 | + |
| 123 | +def test_filter_order_not_available(): |
| 124 | + reporter = Reporter(id=1, first_name='Cookie Monster') |
| 125 | + resolver = FilterConnectionResolver(ReporterNode, |
| 126 | + filterset_class=ReporterFilter) |
| 127 | + resolved = resolver(inst=reporter, args={ |
| 128 | + # TODO: This should be 'order', not 'o' |
| 129 | + 'o': 'last_name' |
| 130 | + }, info=None) |
| 131 | + assert 'WHERE' not in str(resolved.query) |
| 132 | + assert 'ORDER BY' not in str(resolved.query) |
0 commit comments