@@ -97,6 +97,36 @@ def test_constructor_subfields(self):
9797 self .assertEqual (field .fields [0 ], sub_field1 )
9898 self .assertEqual (field .fields [1 ], sub_field2 )
9999
100+ def test_constructor_range (self ):
101+ from google .cloud .bigquery .schema import FieldElementType
102+
103+ field = self ._make_one (
104+ "test" ,
105+ "RANGE" ,
106+ mode = "REQUIRED" ,
107+ description = "Testing" ,
108+ range_element_type = FieldElementType ("DATETIME" ),
109+ )
110+ self .assertEqual (field .name , "test" )
111+ self .assertEqual (field .field_type , "RANGE" )
112+ self .assertEqual (field .mode , "REQUIRED" )
113+ self .assertEqual (field .description , "Testing" )
114+ self .assertEqual (field .range_element_type .element_type , "DATETIME" )
115+
116+ def test_constructor_range_str (self ):
117+ field = self ._make_one (
118+ "test" ,
119+ "RANGE" ,
120+ mode = "REQUIRED" ,
121+ description = "Testing" ,
122+ range_element_type = "DATETIME" ,
123+ )
124+ self .assertEqual (field .name , "test" )
125+ self .assertEqual (field .field_type , "RANGE" )
126+ self .assertEqual (field .mode , "REQUIRED" )
127+ self .assertEqual (field .description , "Testing" )
128+ self .assertEqual (field .range_element_type .element_type , "DATETIME" )
129+
100130 def test_to_api_repr (self ):
101131 from google .cloud .bigquery .schema import PolicyTagList
102132
@@ -160,6 +190,7 @@ def test_from_api_repr(self):
160190 self .assertEqual (field .fields [0 ].name , "bar" )
161191 self .assertEqual (field .fields [0 ].field_type , "INTEGER" )
162192 self .assertEqual (field .fields [0 ].mode , "NULLABLE" )
193+ self .assertEqual (field .range_element_type , None )
163194
164195 def test_from_api_repr_policy (self ):
165196 field = self ._get_target_class ().from_api_repr (
@@ -178,6 +209,23 @@ def test_from_api_repr_policy(self):
178209 self .assertEqual (field .fields [0 ].field_type , "INTEGER" )
179210 self .assertEqual (field .fields [0 ].mode , "NULLABLE" )
180211
212+ def test_from_api_repr_range (self ):
213+ field = self ._get_target_class ().from_api_repr (
214+ {
215+ "mode" : "nullable" ,
216+ "description" : "test_range" ,
217+ "name" : "foo" ,
218+ "type" : "range" ,
219+ "rangeElementType" : {"type" : "DATETIME" },
220+ }
221+ )
222+ self .assertEqual (field .name , "foo" )
223+ self .assertEqual (field .field_type , "RANGE" )
224+ self .assertEqual (field .mode , "NULLABLE" )
225+ self .assertEqual (field .description , "test_range" )
226+ self .assertEqual (len (field .fields ), 0 )
227+ self .assertEqual (field .range_element_type .element_type , "DATETIME" )
228+
181229 def test_from_api_repr_defaults (self ):
182230 field = self ._get_target_class ().from_api_repr (
183231 {"name" : "foo" , "type" : "record" }
@@ -192,8 +240,10 @@ def test_from_api_repr_defaults(self):
192240 # _properties.
193241 self .assertIsNone (field .description )
194242 self .assertIsNone (field .policy_tags )
243+ self .assertIsNone (field .range_element_type )
195244 self .assertNotIn ("description" , field ._properties )
196245 self .assertNotIn ("policyTags" , field ._properties )
246+ self .assertNotIn ("rangeElementType" , field ._properties )
197247
198248 def test_name_property (self ):
199249 name = "lemon-ness"
@@ -566,6 +616,40 @@ def test___repr__evaluable_with_policy_tags(self):
566616 assert field == evaled_field
567617
568618
619+ class TestFieldElementType (unittest .TestCase ):
620+ @staticmethod
621+ def _get_target_class ():
622+ from google .cloud .bigquery .schema import FieldElementType
623+
624+ return FieldElementType
625+
626+ def _make_one (self , * args ):
627+ return self ._get_target_class ()(* args )
628+
629+ def test_constructor (self ):
630+ element_type = self ._make_one ("DATETIME" )
631+ self .assertEqual (element_type .element_type , "DATETIME" )
632+ self .assertEqual (element_type ._properties ["type" ], "DATETIME" )
633+
634+ def test_to_api_repr (self ):
635+ element_type = self ._make_one ("DATETIME" )
636+ self .assertEqual (element_type .to_api_repr (), {"type" : "DATETIME" })
637+
638+ def test_from_api_repr (self ):
639+ api_repr = {"type" : "DATETIME" }
640+ expected_element_type = self ._make_one ("DATETIME" )
641+ self .assertEqual (
642+ expected_element_type .element_type ,
643+ self ._get_target_class ().from_api_repr (api_repr ).element_type ,
644+ )
645+
646+ def test_from_api_repr_empty (self ):
647+ self .assertEqual (None , self ._get_target_class ().from_api_repr ({}))
648+
649+ def test_from_api_repr_none (self ):
650+ self .assertEqual (None , self ._get_target_class ().from_api_repr (None ))
651+
652+
569653# TODO: dedup with the same class in test_table.py.
570654class _SchemaBase (object ):
571655 def _verify_field (self , field , r_field ):
0 commit comments