9
9
from graphene .relay import Node
10
10
from graphene_django import DjangoObjectType
11
11
from graphene_django .utils import DJANGO_FILTER_INSTALLED
12
+ from graphene_django .filter import ArrayFilter , ListFilter
12
13
13
14
from ...compat import ArrayField
14
15
27
28
STORE = {"events" : []}
28
29
29
30
30
- @pytest .fixture
31
- def Event ():
32
- class Event (models .Model ):
33
- name = models .CharField (max_length = 50 )
34
- tags = ArrayField (models .CharField (max_length = 50 ))
35
-
36
- return Event
31
+ class Event (models .Model ):
32
+ name = models .CharField (max_length = 50 )
33
+ tags = ArrayField (models .CharField (max_length = 50 ))
34
+ tag_ids = ArrayField (models .IntegerField ())
35
+ random_field = ArrayField (models .BooleanField ())
37
36
38
37
39
38
@pytest .fixture
40
- def EventFilterSet (Event ):
41
-
42
- from django .contrib .postgres .forms import SimpleArrayField
43
-
44
- class ArrayFilter (filters .Filter ):
45
- base_field_class = SimpleArrayField
46
-
39
+ def EventFilterSet ():
47
40
class EventFilterSet (FilterSet ):
48
41
class Meta :
49
42
model = Event
50
43
fields = {
51
- "name" : ["exact" ],
44
+ "name" : ["exact" , "contains" ],
52
45
}
53
46
47
+ # Those are actually usable with our Query fixture bellow
54
48
tags__contains = ArrayFilter (field_name = "tags" , lookup_expr = "contains" )
55
49
tags__overlap = ArrayFilter (field_name = "tags" , lookup_expr = "overlap" )
50
+ tags = ArrayFilter (field_name = "tags" , lookup_expr = "exact" )
51
+
52
+ # Those are actually not usable and only to check type declarations
53
+ tags_ids__contains = ArrayFilter (field_name = "tag_ids" , lookup_expr = "contains" )
54
+ tags_ids__overlap = ArrayFilter (field_name = "tag_ids" , lookup_expr = "overlap" )
55
+ tags_ids = ArrayFilter (field_name = "tag_ids" , lookup_expr = "exact" )
56
+ random_field__contains = ArrayFilter (
57
+ field_name = "random_field" , lookup_expr = "contains"
58
+ )
59
+ random_field__overlap = ArrayFilter (
60
+ field_name = "random_field" , lookup_expr = "overlap"
61
+ )
62
+ random_field = ArrayFilter (field_name = "random_field" , lookup_expr = "exact" )
56
63
57
64
return EventFilterSet
58
65
59
66
60
67
@pytest .fixture
61
- def EventType (Event , EventFilterSet ):
68
+ def EventType (EventFilterSet ):
62
69
class EventType (DjangoObjectType ):
63
70
class Meta :
64
71
model = Event
65
72
interfaces = (Node ,)
73
+ fields = "__all__"
66
74
filterset_class = EventFilterSet
67
75
68
76
return EventType
69
77
70
78
71
79
@pytest .fixture
72
- def Query (Event , EventType ):
80
+ def Query (EventType ):
81
+ """
82
+ Note that we have to use a custom resolver to replicate the arrayfield filter behavior as
83
+ we are running unit tests in sqlite which does not have ArrayFields.
84
+ """
85
+
73
86
class Query (graphene .ObjectType ):
74
87
events = DjangoFilterConnectionField (EventType )
75
88
@@ -79,6 +92,7 @@ def resolve_events(self, info, **kwargs):
79
92
Event (name = "Live Show" , tags = ["concert" , "music" , "rock" ],),
80
93
Event (name = "Musical" , tags = ["movie" , "music" ],),
81
94
Event (name = "Ballet" , tags = ["concert" , "dance" ],),
95
+ Event (name = "Speech" , tags = [],),
82
96
]
83
97
84
98
STORE ["events" ] = events
@@ -105,6 +119,13 @@ def filter_events(**kwargs):
105
119
STORE ["events" ],
106
120
)
107
121
)
122
+ if "tags__exact" in kwargs :
123
+ STORE ["events" ] = list (
124
+ filter (
125
+ lambda e : set (kwargs ["tags__exact" ]) == set (e .tags ),
126
+ STORE ["events" ],
127
+ )
128
+ )
108
129
109
130
def mock_queryset_filter (* args , ** kwargs ):
110
131
filter_events (** kwargs )
@@ -121,7 +142,9 @@ def mock_queryset_count(*args, **kwargs):
121
142
m_queryset .filter .side_effect = mock_queryset_filter
122
143
m_queryset .none .side_effect = mock_queryset_none
123
144
m_queryset .count .side_effect = mock_queryset_count
124
- m_queryset .__getitem__ .side_effect = STORE ["events" ].__getitem__
145
+ m_queryset .__getitem__ .side_effect = lambda index : STORE [
146
+ "events"
147
+ ].__getitem__ (index )
125
148
126
149
return m_queryset
127
150
0 commit comments