@@ -1049,10 +1049,22 @@ def test_w_datetime(self):
10491049 self .assertEqual (self ._call_fut (when ), "12:13:41" )
10501050
10511051
1052- def _make_field (field_type , mode = "NULLABLE" , name = "testing" , fields = ()):
1052+ def _make_field (
1053+ field_type ,
1054+ mode = "NULLABLE" ,
1055+ name = "testing" ,
1056+ fields = (),
1057+ range_element_type = None ,
1058+ ):
10531059 from google .cloud .bigquery .schema import SchemaField
10541060
1055- return SchemaField (name = name , field_type = field_type , mode = mode , fields = fields )
1061+ return SchemaField (
1062+ name = name ,
1063+ field_type = field_type ,
1064+ mode = mode ,
1065+ fields = fields ,
1066+ range_element_type = range_element_type ,
1067+ )
10561068
10571069
10581070class Test_scalar_field_to_json (unittest .TestCase ):
@@ -1251,6 +1263,98 @@ def test_w_dict_unknown_fields(self):
12511263 )
12521264
12531265
1266+ class Test_range_field_to_json (unittest .TestCase ):
1267+ def _call_fut (self , field , value ):
1268+ from google .cloud .bigquery ._helpers import _range_field_to_json
1269+
1270+ return _range_field_to_json (field , value )
1271+
1272+ def test_w_date (self ):
1273+ field = _make_field ("RANGE" , range_element_type = "DATE" )
1274+ start = datetime .date (2016 , 12 , 3 )
1275+ original = {"start" : start }
1276+ converted = self ._call_fut (field .range_element_type , original )
1277+ expected = {"start" : "2016-12-03" , "end" : None }
1278+ self .assertEqual (converted , expected )
1279+
1280+ def test_w_date_string (self ):
1281+ field = _make_field ("RANGE" , range_element_type = "DATE" )
1282+ original = {"start" : "2016-12-03" }
1283+ converted = self ._call_fut (field .range_element_type , original )
1284+ expected = {"start" : "2016-12-03" , "end" : None }
1285+ self .assertEqual (converted , expected )
1286+
1287+ def test_w_datetime (self ):
1288+ field = _make_field ("RANGE" , range_element_type = "DATETIME" )
1289+ start = datetime .datetime (2016 , 12 , 3 , 14 , 11 , 27 , 123456 )
1290+ original = {"start" : start }
1291+ converted = self ._call_fut (field .range_element_type , original )
1292+ expected = {"start" : "2016-12-03T14:11:27.123456" , "end" : None }
1293+ self .assertEqual (converted , expected )
1294+
1295+ def test_w_datetime_string (self ):
1296+ field = _make_field ("RANGE" , range_element_type = "DATETIME" )
1297+ original = {"start" : "2016-12-03T14:11:27.123456" }
1298+ converted = self ._call_fut (field .range_element_type , original )
1299+ expected = {"start" : "2016-12-03T14:11:27.123456" , "end" : None }
1300+ self .assertEqual (converted , expected )
1301+
1302+ def test_w_timestamp (self ):
1303+ from google .cloud ._helpers import UTC
1304+
1305+ field = _make_field ("RANGE" , range_element_type = "TIMESTAMP" )
1306+ start = datetime .datetime (2016 , 12 , 3 , 14 , 11 , 27 , 123456 , tzinfo = UTC )
1307+ original = {"start" : start }
1308+ converted = self ._call_fut (field .range_element_type , original )
1309+ expected = {"start" : "2016-12-03T14:11:27.123456Z" , "end" : None }
1310+ self .assertEqual (converted , expected )
1311+
1312+ def test_w_timestamp_string (self ):
1313+ field = _make_field ("RANGE" , range_element_type = "TIMESTAMP" )
1314+ original = {"start" : "2016-12-03T14:11:27.123456Z" }
1315+ converted = self ._call_fut (field .range_element_type , original )
1316+ expected = {"start" : "2016-12-03T14:11:27.123456Z" , "end" : None }
1317+ self .assertEqual (converted , expected )
1318+
1319+ def test_w_timestamp_float (self ):
1320+ field = _make_field ("RANGE" , range_element_type = "TIMESTAMP" )
1321+ original = {"start" : 12.34567 }
1322+ converted = self ._call_fut (field .range_element_type , original )
1323+ expected = {"start" : 12.34567 , "end" : None }
1324+ self .assertEqual (converted , expected )
1325+
1326+ def test_w_string_literal (self ):
1327+ field = _make_field ("RANGE" , range_element_type = "DATE" )
1328+ original = "[2016-12-03, UNBOUNDED)"
1329+ converted = self ._call_fut (field .range_element_type , original )
1330+ expected = {"start" : "2016-12-03" , "end" : None }
1331+ self .assertEqual (converted , expected )
1332+
1333+ def test_w_unsupported_range_element_type (self ):
1334+ field = _make_field ("RANGE" , range_element_type = "TIME" )
1335+ with self .assertRaises (ValueError ):
1336+ self ._call_fut (
1337+ field .range_element_type ,
1338+ {"start" : datetime .time (12 , 13 , 41 )},
1339+ )
1340+
1341+ def test_w_no_range_element_type (self ):
1342+ field = _make_field ("RANGE" )
1343+ with self .assertRaises (ValueError ):
1344+ self ._call_fut (field .range_element_type , "2016-12-03" )
1345+
1346+ def test_w_incorrect_literal_format (self ):
1347+ field = _make_field ("RANGE" , range_element_type = "DATE" )
1348+ original = "[2016-12-03, UNBOUNDED]"
1349+ with self .assertRaises (ValueError ):
1350+ self ._call_fut (field .range_element_type , original )
1351+
1352+ def test_w_unsupported_representation (self ):
1353+ field = _make_field ("RANGE" , range_element_type = "DATE" )
1354+ with self .assertRaises (ValueError ):
1355+ self ._call_fut (field .range_element_type , object ())
1356+
1357+
12541358class Test_field_to_json (unittest .TestCase ):
12551359 def _call_fut (self , field , value ):
12561360 from google .cloud .bigquery ._helpers import _field_to_json
@@ -1285,6 +1389,12 @@ def test_w_scalar(self):
12851389 converted = self ._call_fut (field , original )
12861390 self .assertEqual (converted , str (original ))
12871391
1392+ def test_w_range (self ):
1393+ field = _make_field ("RANGE" , range_element_type = "DATE" )
1394+ original = {"start" : "2016-12-03" , "end" : "2024-12-03" }
1395+ converted = self ._call_fut (field , original )
1396+ self .assertEqual (converted , original )
1397+
12881398
12891399class Test_snake_to_camel_case (unittest .TestCase ):
12901400 def _call_fut (self , value ):
0 commit comments