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