@@ -1049,10 +1049,22 @@ def test_w_datetime(self):
1049
1049
self .assertEqual (self ._call_fut (when ), "12:13:41" )
1050
1050
1051
1051
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
+ ):
1053
1059
from google .cloud .bigquery .schema import SchemaField
1054
1060
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
+ )
1056
1068
1057
1069
1058
1070
class Test_scalar_field_to_json (unittest .TestCase ):
@@ -1251,6 +1263,98 @@ def test_w_dict_unknown_fields(self):
1251
1263
)
1252
1264
1253
1265
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
+
1254
1358
class Test_field_to_json (unittest .TestCase ):
1255
1359
def _call_fut (self , field , value ):
1256
1360
from google .cloud .bigquery ._helpers import _field_to_json
@@ -1285,6 +1389,12 @@ def test_w_scalar(self):
1285
1389
converted = self ._call_fut (field , original )
1286
1390
self .assertEqual (converted , str (original ))
1287
1391
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
+
1288
1398
1289
1399
class Test_snake_to_camel_case (unittest .TestCase ):
1290
1400
def _call_fut (self , value ):
0 commit comments