1
+ import operator
2
+ from functools import reduce
3
+
1
4
import pytest
5
+ from django .db .models import Q
2
6
from django_filters import FilterSet
3
7
4
8
import graphene
@@ -44,6 +48,10 @@ class Meta:
44
48
only_first = TypedFilter (
45
49
input_type = graphene .Boolean , method = "only_first_filter"
46
50
)
51
+ headline_search = ListFilter (
52
+ method = "headline_search_filter" ,
53
+ input_type = graphene .List (graphene .String ),
54
+ )
47
55
48
56
def first_n_filter (self , queryset , _name , value ):
49
57
return queryset [:value ]
@@ -54,6 +62,13 @@ def only_first_filter(self, queryset, _name, value):
54
62
else :
55
63
return queryset
56
64
65
+ def headline_search_filter (self , queryset , _name , value ):
66
+ if not value :
67
+ return queryset .none ()
68
+ return queryset .filter (
69
+ reduce (operator .or_ , [Q (headline__icontains = v ) for v in value ])
70
+ )
71
+
57
72
class ArticleType (DjangoObjectType ):
58
73
class Meta :
59
74
model = Article
@@ -87,6 +102,7 @@ def test_typed_filter_schema(schema):
87
102
"lang_InStr" : "[String]" ,
88
103
"firstN" : "Int" ,
89
104
"onlyFirst" : "Boolean" ,
105
+ "headlineSearch" : "[String]" ,
90
106
}
91
107
92
108
all_articles_filters = (
@@ -104,13 +120,48 @@ def test_typed_filters_work(schema):
104
120
Article .objects .create (headline = "A" , reporter = reporter , editor = reporter , lang = "es" )
105
121
Article .objects .create (headline = "B" , reporter = reporter , editor = reporter , lang = "es" )
106
122
Article .objects .create (headline = "C" , reporter = reporter , editor = reporter , lang = "en" )
123
+ Article .objects .create (headline = "AB" , reporter = reporter , editor = reporter , lang = "es" )
124
+
125
+ query = 'query { articles (lang_Contains: "n") { edges { node { headline } } } }'
126
+
127
+ result = schema .execute (query )
128
+ assert not result .errors
129
+ assert result .data ["articles" ]["edges" ] == [
130
+ {"node" : {"headline" : "C" }},
131
+ ]
132
+
133
+ query = "query { articles (firstN: 2) { edges { node { headline } } } }"
134
+
135
+ result = schema .execute (query )
136
+ assert not result .errors
137
+ assert result .data ["articles" ]["edges" ] == [
138
+ {"node" : {"headline" : "A" }},
139
+ {"node" : {"headline" : "AB" }},
140
+ ]
141
+
142
+ query = "query { articles (onlyFirst: true) { edges { node { headline } } } }"
143
+
144
+ result = schema .execute (query )
145
+ assert not result .errors
146
+ assert result .data ["articles" ]["edges" ] == [
147
+ {"node" : {"headline" : "A" }},
148
+ ]
149
+
150
+
151
+ def test_list_filters_work (schema ):
152
+ reporter = Reporter .objects .create (first_name = "John" , last_name = "Doe" , email = "" )
153
+ Article .objects .create (headline = "A" , reporter = reporter , editor = reporter , lang = "es" )
154
+ Article .objects .create (headline = "B" , reporter = reporter , editor = reporter , lang = "es" )
155
+ Article .objects .create (headline = "C" , reporter = reporter , editor = reporter , lang = "en" )
156
+ Article .objects .create (headline = "AB" , reporter = reporter , editor = reporter , lang = "es" )
107
157
108
158
query = "query { articles (lang_In: [ES]) { edges { node { headline } } } }"
109
159
110
160
result = schema .execute (query )
111
161
assert not result .errors
112
162
assert result .data ["articles" ]["edges" ] == [
113
163
{"node" : {"headline" : "A" }},
164
+ {"node" : {"headline" : "AB" }},
114
165
{"node" : {"headline" : "B" }},
115
166
]
116
167
@@ -120,30 +171,61 @@ def test_typed_filters_work(schema):
120
171
assert not result .errors
121
172
assert result .data ["articles" ]["edges" ] == [
122
173
{"node" : {"headline" : "A" }},
174
+ {"node" : {"headline" : "AB" }},
123
175
{"node" : {"headline" : "B" }},
124
176
]
125
177
126
- query = 'query { articles (lang_Contains: "n") { edges { node { headline } } } }'
178
+ query = "query { articles (lang_InStr: []) { edges { node { headline } } } }"
179
+
180
+ result = schema .execute (query )
181
+ assert not result .errors
182
+ assert result .data ["articles" ]["edges" ] == []
183
+
184
+ query = "query { articles (lang_InStr: null) { edges { node { headline } } } }"
127
185
128
186
result = schema .execute (query )
129
187
assert not result .errors
130
188
assert result .data ["articles" ]["edges" ] == [
189
+ {"node" : {"headline" : "A" }},
190
+ {"node" : {"headline" : "AB" }},
191
+ {"node" : {"headline" : "B" }},
131
192
{"node" : {"headline" : "C" }},
132
193
]
133
194
134
- query = " query { articles (firstN: 2 ) { edges { node { headline } } } }"
195
+ query = ' query { articles (headlineSearch: ["a", "B"] ) { edges { node { headline } } } }'
135
196
136
197
result = schema .execute (query )
137
198
assert not result .errors
138
199
assert result .data ["articles" ]["edges" ] == [
139
200
{"node" : {"headline" : "A" }},
201
+ {"node" : {"headline" : "AB" }},
140
202
{"node" : {"headline" : "B" }},
141
203
]
142
204
143
- query = "query { articles (onlyFirst: true) { edges { node { headline } } } }"
205
+ query = "query { articles (headlineSearch: []) { edges { node { headline } } } }"
206
+
207
+ result = schema .execute (query )
208
+ assert not result .errors
209
+ assert result .data ["articles" ]["edges" ] == []
210
+
211
+ query = "query { articles (headlineSearch: null) { edges { node { headline } } } }"
212
+
213
+ result = schema .execute (query )
214
+ assert not result .errors
215
+ assert result .data ["articles" ]["edges" ] == [
216
+ {"node" : {"headline" : "A" }},
217
+ {"node" : {"headline" : "AB" }},
218
+ {"node" : {"headline" : "B" }},
219
+ {"node" : {"headline" : "C" }},
220
+ ]
221
+
222
+ query = 'query { articles (headlineSearch: [""]) { edges { node { headline } } } }'
144
223
145
224
result = schema .execute (query )
146
225
assert not result .errors
147
226
assert result .data ["articles" ]["edges" ] == [
148
227
{"node" : {"headline" : "A" }},
228
+ {"node" : {"headline" : "AB" }},
229
+ {"node" : {"headline" : "B" }},
230
+ {"node" : {"headline" : "C" }},
149
231
]
0 commit comments