@@ -33,6 +33,47 @@ def mock_client():
3333 return client
3434
3535
36+ class TestOrdering :
37+ @pytest .mark .parametrize (
38+ "direction_arg,expected_direction" ,
39+ [
40+ ("ASCENDING" , expr .Ordering .Direction .ASCENDING ),
41+ ("DESCENDING" , expr .Ordering .Direction .DESCENDING ),
42+ ("ascending" , expr .Ordering .Direction .ASCENDING ),
43+ ("descending" , expr .Ordering .Direction .DESCENDING ),
44+ (expr .Ordering .Direction .ASCENDING , expr .Ordering .Direction .ASCENDING ),
45+ (expr .Ordering .Direction .DESCENDING , expr .Ordering .Direction .DESCENDING ),
46+ ],
47+ )
48+ def test_ctor (self , direction_arg , expected_direction ):
49+ instance = expr .Ordering ("field1" , direction_arg )
50+ assert isinstance (instance .expr , expr .Field )
51+ assert instance .expr .path == "field1"
52+ assert instance .order_dir == expected_direction
53+
54+ def test_repr (self ):
55+ field_expr = expr .Field .of ("field1" )
56+ instance = expr .Ordering (field_expr , "ASCENDING" )
57+ repr_str = repr (instance )
58+ assert repr_str == "Field.of('field1').ascending()"
59+
60+ instance = expr .Ordering (field_expr , "DESCENDING" )
61+ repr_str = repr (instance )
62+ assert repr_str == "Field.of('field1').descending()"
63+
64+ def test_to_pb (self ):
65+ field_expr = expr .Field .of ("field1" )
66+ instance = expr .Ordering (field_expr , "ASCENDING" )
67+ result = instance ._to_pb ()
68+ assert result .map_value .fields ["expression" ].field_reference_value == "field1"
69+ assert result .map_value .fields ["direction" ].string_value == "ascending"
70+
71+ instance = expr .Ordering (field_expr , "DESCENDING" )
72+ result = instance ._to_pb ()
73+ assert result .map_value .fields ["expression" ].field_reference_value == "field1"
74+ assert result .map_value .fields ["direction" ].string_value == "descending"
75+
76+
3677class TestExpr :
3778 def test_ctor (self ):
3879 """
@@ -116,6 +157,65 @@ def test_repr(self, input_val, expected):
116157 assert repr_string == expected
117158
118159
160+ class TestListOfExprs :
161+ def test_to_pb (self ):
162+ instance = expr .ListOfExprs ([expr .Constant (1 ), expr .Constant (2 )])
163+ result = instance ._to_pb ()
164+ assert len (result .array_value .values ) == 2
165+ assert result .array_value .values [0 ].integer_value == 1
166+ assert result .array_value .values [1 ].integer_value == 2
167+
168+ def test_empty_to_pb (self ):
169+ instance = expr .ListOfExprs ([])
170+ result = instance ._to_pb ()
171+ assert len (result .array_value .values ) == 0
172+
173+ def test_repr (self ):
174+ instance = expr .ListOfExprs ([expr .Constant (1 ), expr .Constant (2 )])
175+ repr_string = repr (instance )
176+ assert repr_string == "ListOfExprs([Constant.of(1), Constant.of(2)])"
177+ empty_instance = expr .ListOfExprs ([])
178+ empty_repr_string = repr (empty_instance )
179+ assert empty_repr_string == "ListOfExprs([])"
180+
181+
182+ class TestSelectable :
183+ def test_ctor (self ):
184+ """
185+ Base class should be abstract
186+ """
187+ with pytest .raises (TypeError ):
188+ expr .Selectable ()
189+
190+ def test_value_from_selectables (self ):
191+ selectable_list = [expr .Field .of ("field1" ), expr .Field .of ("field2" )]
192+ result = expr .Selectable ._value_from_selectables (* selectable_list )
193+ assert len (result .map_value .fields ) == 2
194+ assert result .map_value .fields ["field1" ].field_reference_value == "field1"
195+ assert result .map_value .fields ["field2" ].field_reference_value == "field2"
196+
197+ class TestField :
198+ def test_repr (self ):
199+ instance = expr .Field .of ("field1" )
200+ repr_string = repr (instance )
201+ assert repr_string == "Field.of('field1')"
202+
203+ def test_of (self ):
204+ instance = expr .Field .of ("field1" )
205+ assert instance .path == "field1"
206+
207+ def test_to_pb (self ):
208+ instance = expr .Field .of ("field1" )
209+ result = instance ._to_pb ()
210+ assert result .field_reference_value == "field1"
211+
212+ def test_to_map (self ):
213+ instance = expr .Field .of ("field1" )
214+ result = instance ._to_map ()
215+ assert result [0 ] == "field1"
216+ assert result [1 ] == Value (field_reference_value = "field1" )
217+
218+
119219class TestFilterCondition :
120220 def test__from_query_filter_pb_composite_filter_or (self , mock_client ):
121221 """
@@ -420,21 +520,23 @@ def test__from_query_filter_pb_unknown_filter_type(self, mock_client):
420520 with pytest .raises (TypeError , match = "Unexpected filter type" ):
421521 FilterCondition ._from_query_filter_pb (document_pb .Value (), mock_client )
422522
423-
424- @pytest .mark .parametrize ("method,args,result_cls" , [
425- ("eq" , (2 ,), expr .Eq ),
426- ("neq" , (2 ,), expr .Neq ),
427- ("lt" , (2 ,), expr .Lt ),
428- ("lte" , (2 ,), expr .Lte ),
429- ("gt" , (2 ,), expr .Gt ),
430- ("gte" , (2 ,), expr .Gte ),
431- ("in_any" , ([None ],), expr .In ),
432- ("not_in_any" , ([None ],), expr .Not ),
433- ("array_contains" , (None ,), expr .ArrayContains ),
434- ("array_contains_any" , ([None ],), expr .ArrayContainsAny ),
435- ("is_nan" , (), expr .IsNaN ),
436- ("exists" , (), expr .Exists ),
437- ])
523+ @pytest .mark .parametrize (
524+ "method,args,result_cls" ,
525+ [
526+ ("eq" , (2 ,), expr .Eq ),
527+ ("neq" , (2 ,), expr .Neq ),
528+ ("lt" , (2 ,), expr .Lt ),
529+ ("lte" , (2 ,), expr .Lte ),
530+ ("gt" , (2 ,), expr .Gt ),
531+ ("gte" , (2 ,), expr .Gte ),
532+ ("in_any" , ([None ],), expr .In ),
533+ ("not_in_any" , ([None ],), expr .Not ),
534+ ("array_contains" , (None ,), expr .ArrayContains ),
535+ ("array_contains_any" , ([None ],), expr .ArrayContainsAny ),
536+ ("is_nan" , (), expr .IsNaN ),
537+ ("exists" , (), expr .Exists ),
538+ ],
539+ )
438540 def test_infix_call (self , method , args , result_cls ):
439541 """
440542 most FilterExpressions should support infix execution
@@ -483,7 +585,10 @@ def test_array_contains_any(self):
483585 assert isinstance (instance .params [1 ], ListOfExprs )
484586 assert instance .params [0 ] == arg1
485587 assert instance .params [1 ].exprs == [arg2 , arg3 ]
486- assert repr (instance ) == "ArrayField.array_contains_any(ListOfExprs([Element1, Element2]))"
588+ assert (
589+ repr (instance )
590+ == "ArrayField.array_contains_any(ListOfExprs([Element1, Element2]))"
591+ )
487592
488593 def test_exists (self ):
489594 arg1 = self ._make_arg ("Field" )
0 commit comments