1+ from unittest import TestCase
2+
3+ from google .cloud .firestore_v1 import FieldFilter
4+
5+ from mockfirestore import MockFirestore
6+
7+
8+ class TestWhereField (TestCase ):
9+ def test_collection_whereEquals (self ):
10+ fs = MockFirestore ()
11+ fs ._data = {'foo' : {
12+ 'first' : {'valid' : True },
13+ 'second' : {'gumby' : False }
14+ }}
15+
16+ docs = list (fs .collection ('foo' ).where (field = 'valid' , op = '==' , value = True ).stream ())
17+ self .assertEqual ({'valid' : True }, docs [0 ].to_dict ())
18+
19+ def test_collection_whereEquals_with_filter (self ):
20+ fs = MockFirestore ()
21+ fs ._data = {'foo' : {
22+ 'first' : {'valid' : True },
23+ 'second' : {'gumby' : False }
24+ }}
25+
26+ docs = list (fs .collection ('foo' ).where (filter = FieldFilter ('valid' , '==' , True )).stream ())
27+ self .assertEqual ({'valid' : True }, docs [0 ].to_dict ())
28+
29+ def test_collection_whereNotEquals (self ):
30+ fs = MockFirestore ()
31+ fs ._data = {'foo' : {
32+ 'first' : {'count' : 1 },
33+ 'second' : {'count' : 5 }
34+ }}
35+
36+ docs = list (fs .collection ('foo' ).where ('count' , '!=' , 1 ).stream ())
37+ self .assertEqual ({'count' : 5 }, docs [0 ].to_dict ())
38+
39+ def test_collection_whereLessThan (self ):
40+ fs = MockFirestore ()
41+ fs ._data = {'foo' : {
42+ 'first' : {'count' : 1 },
43+ 'second' : {'count' : 5 }
44+ }}
45+
46+ docs = list (fs .collection ('foo' ).where ('count' , '<' , 5 ).stream ())
47+ self .assertEqual ({'count' : 1 }, docs [0 ].to_dict ())
48+
49+ def test_collection_whereLessThanOrEqual (self ):
50+ fs = MockFirestore ()
51+ fs ._data = {'foo' : {
52+ 'first' : {'count' : 1 },
53+ 'second' : {'count' : 5 }
54+ }}
55+
56+ docs = list (fs .collection ('foo' ).where ('count' , '<=' , 5 ).stream ())
57+ self .assertEqual ({'count' : 1 }, docs [0 ].to_dict ())
58+ self .assertEqual ({'count' : 5 }, docs [1 ].to_dict ())
59+
60+ def test_collection_whereGreaterThan (self ):
61+ fs = MockFirestore ()
62+ fs ._data = {'foo' : {
63+ 'first' : {'count' : 1 },
64+ 'second' : {'count' : 5 }
65+ }}
66+
67+ docs = list (fs .collection ('foo' ).where ('count' , '>' , 1 ).stream ())
68+ self .assertEqual ({'count' : 5 }, docs [0 ].to_dict ())
69+
70+ def test_collection_whereGreaterThanOrEqual (self ):
71+ fs = MockFirestore ()
72+ fs ._data = {'foo' : {
73+ 'first' : {'count' : 1 },
74+ 'second' : {'count' : 5 }
75+ }}
76+
77+ docs = list (fs .collection ('foo' ).where ('count' , '>=' , 1 ).stream ())
78+ self .assertEqual ({'count' : 1 }, docs [0 ].to_dict ())
79+ self .assertEqual ({'count' : 5 }, docs [1 ].to_dict ())
80+
81+ def test_collection_whereMissingField (self ):
82+ fs = MockFirestore ()
83+ fs ._data = {'foo' : {
84+ 'first' : {'count' : 1 },
85+ 'second' : {'count' : 5 }
86+ }}
87+
88+ docs = list (fs .collection ('foo' ).where ('no_field' , '==' , 1 ).stream ())
89+ self .assertEqual (len (docs ), 0 )
90+
91+ def test_collection_whereNestedField (self ):
92+ fs = MockFirestore ()
93+ fs ._data = {'foo' : {
94+ 'first' : {'nested' : {'a' : 1 }},
95+ 'second' : {'nested' : {'a' : 2 }}
96+ }}
97+
98+ docs = list (fs .collection ('foo' ).where ('nested.a' , '==' , 1 ).stream ())
99+ self .assertEqual (len (docs ), 1 )
100+ self .assertEqual ({'nested' : {'a' : 1 }}, docs [0 ].to_dict ())
101+
102+ def test_collection_whereIn (self ):
103+ fs = MockFirestore ()
104+ fs ._data = {'foo' : {
105+ 'first' : {'field' : 'a1' },
106+ 'second' : {'field' : 'a2' },
107+ 'third' : {'field' : 'a3' },
108+ 'fourth' : {'field' : 'a4' },
109+ }}
110+
111+ docs = list (fs .collection ('foo' ).where ('field' , 'in' , ['a1' , 'a3' ]).stream ())
112+ self .assertEqual (len (docs ), 2 )
113+ self .assertEqual ({'field' : 'a1' }, docs [0 ].to_dict ())
114+ self .assertEqual ({'field' : 'a3' }, docs [1 ].to_dict ())
115+
116+ def test_collection_whereArrayContains (self ):
117+ fs = MockFirestore ()
118+ fs ._data = {'foo' : {
119+ 'first' : {'field' : ['val4' ]},
120+ 'second' : {'field' : ['val3' , 'val2' ]},
121+ 'third' : {'field' : ['val3' , 'val2' , 'val1' ]}
122+ }}
123+
124+ docs = list (fs .collection ('foo' ).where ('field' , 'array_contains' , 'val1' ).stream ())
125+ self .assertEqual (len (docs ), 1 )
126+ self .assertEqual (docs [0 ].to_dict (), {'field' : ['val3' , 'val2' , 'val1' ]})
127+
128+ def test_collection_whereArrayContainsAny (self ):
129+ fs = MockFirestore ()
130+ fs ._data = {'foo' : {
131+ 'first' : {'field' : ['val4' ]},
132+ 'second' : {'field' : ['val3' , 'val2' ]},
133+ 'third' : {'field' : ['val3' , 'val2' , 'val1' ]}
134+ }}
135+
136+ contains_any_docs = list (fs .collection ('foo' ).where ('field' , 'array_contains_any' , ['val1' , 'val4' ]).stream ())
137+ self .assertEqual (len (contains_any_docs ), 2 )
138+ self .assertEqual ({'field' : ['val4' ]}, contains_any_docs [0 ].to_dict ())
139+ self .assertEqual ({'field' : ['val3' , 'val2' , 'val1' ]}, contains_any_docs [1 ].to_dict ())
0 commit comments