@@ -5434,7 +5434,7 @@ def test_insert_rows_from_dataframe_w_explicit_none_insert_ids(self):
5434
5434
method = "POST" , path = API_PATH , data = EXPECTED_SENT_DATA , timeout = None
5435
5435
)
5436
5436
5437
- def test_insert_rows_json (self ):
5437
+ def test_insert_rows_json_default_behavior (self ):
5438
5438
from google .cloud .bigquery .dataset import DatasetReference
5439
5439
from google .cloud .bigquery .schema import SchemaField
5440
5440
from google .cloud .bigquery .table import Table
@@ -5481,29 +5481,127 @@ def test_insert_rows_json(self):
5481
5481
method = "POST" , path = "/%s" % PATH , data = SENT , timeout = 7.5 ,
5482
5482
)
5483
5483
5484
- def test_insert_rows_json_with_string_id (self ):
5485
- rows = [{"col1" : "val1" }]
5484
+ def test_insert_rows_json_w_explicitly_requested_autogenerated_insert_ids (self ):
5485
+ from google .cloud .bigquery import AutoRowIDs
5486
+
5487
+ rows = [{"col1" : "val1" }, {"col2" : "val2" }]
5486
5488
creds = _make_credentials ()
5487
5489
http = object ()
5488
5490
client = self ._make_one (
5489
5491
project = "default-project" , credentials = creds , _http = http
5490
5492
)
5491
5493
conn = client ._connection = make_connection ({})
5492
5494
5493
- with mock .patch ("uuid.uuid4" , side_effect = map (str , range (len (rows )))):
5494
- errors = client .insert_rows_json ("proj.dset.tbl" , rows )
5495
+ uuid_patcher = mock .patch ("uuid.uuid4" , side_effect = map (str , range (len (rows ))))
5496
+ with uuid_patcher :
5497
+ errors = client .insert_rows_json (
5498
+ "proj.dset.tbl" , rows , row_ids = AutoRowIDs .GENERATE_UUID
5499
+ )
5495
5500
5496
5501
self .assertEqual (len (errors ), 0 )
5497
- expected = {
5498
- "rows" : [{"json" : row , "insertId" : str (i )} for i , row in enumerate (rows )]
5502
+
5503
+ # Check row data sent to the backend.
5504
+ expected_row_data = {
5505
+ "rows" : [
5506
+ {"json" : {"col1" : "val1" }, "insertId" : "0" },
5507
+ {"json" : {"col2" : "val2" }, "insertId" : "1" },
5508
+ ]
5499
5509
}
5500
5510
conn .api_request .assert_called_once_with (
5501
5511
method = "POST" ,
5502
5512
path = "/projects/proj/datasets/dset/tables/tbl/insertAll" ,
5503
- data = expected ,
5513
+ data = expected_row_data ,
5514
+ timeout = None ,
5515
+ )
5516
+
5517
+ def test_insert_rows_json_w_explicitly_disabled_insert_ids (self ):
5518
+ from google .cloud .bigquery import AutoRowIDs
5519
+
5520
+ rows = [{"col1" : "val1" }, {"col2" : "val2" }]
5521
+ creds = _make_credentials ()
5522
+ http = object ()
5523
+ client = self ._make_one (
5524
+ project = "default-project" , credentials = creds , _http = http
5525
+ )
5526
+ conn = client ._connection = make_connection ({})
5527
+
5528
+ errors = client .insert_rows_json (
5529
+ "proj.dset.tbl" , rows , row_ids = AutoRowIDs .DISABLED ,
5530
+ )
5531
+
5532
+ self .assertEqual (len (errors ), 0 )
5533
+
5534
+ expected_row_data = {
5535
+ "rows" : [
5536
+ {"json" : {"col1" : "val1" }, "insertId" : None },
5537
+ {"json" : {"col2" : "val2" }, "insertId" : None },
5538
+ ]
5539
+ }
5540
+ conn .api_request .assert_called_once_with (
5541
+ method = "POST" ,
5542
+ path = "/projects/proj/datasets/dset/tables/tbl/insertAll" ,
5543
+ data = expected_row_data ,
5544
+ timeout = None ,
5545
+ )
5546
+
5547
+ def test_insert_rows_json_with_iterator_row_ids (self ):
5548
+ rows = [{"col1" : "val1" }, {"col2" : "val2" }, {"col3" : "val3" }]
5549
+ creds = _make_credentials ()
5550
+ http = object ()
5551
+ client = self ._make_one (
5552
+ project = "default-project" , credentials = creds , _http = http
5553
+ )
5554
+ conn = client ._connection = make_connection ({})
5555
+
5556
+ row_ids_iter = map (str , itertools .count (42 ))
5557
+ errors = client .insert_rows_json ("proj.dset.tbl" , rows , row_ids = row_ids_iter )
5558
+
5559
+ self .assertEqual (len (errors ), 0 )
5560
+ expected_row_data = {
5561
+ "rows" : [
5562
+ {"json" : {"col1" : "val1" }, "insertId" : "42" },
5563
+ {"json" : {"col2" : "val2" }, "insertId" : "43" },
5564
+ {"json" : {"col3" : "val3" }, "insertId" : "44" },
5565
+ ]
5566
+ }
5567
+ conn .api_request .assert_called_once_with (
5568
+ method = "POST" ,
5569
+ path = "/projects/proj/datasets/dset/tables/tbl/insertAll" ,
5570
+ data = expected_row_data ,
5504
5571
timeout = None ,
5505
5572
)
5506
5573
5574
+ def test_insert_rows_json_with_non_iterable_row_ids (self ):
5575
+ rows = [{"col1" : "val1" }]
5576
+ creds = _make_credentials ()
5577
+ http = object ()
5578
+ client = self ._make_one (
5579
+ project = "default-project" , credentials = creds , _http = http
5580
+ )
5581
+ client ._connection = make_connection ({})
5582
+
5583
+ with self .assertRaises (TypeError ) as exc :
5584
+ client .insert_rows_json ("proj.dset.tbl" , rows , row_ids = object ())
5585
+
5586
+ err_msg = str (exc .exception )
5587
+ self .assertIn ("row_ids" , err_msg )
5588
+ self .assertIn ("iterable" , err_msg )
5589
+
5590
+ def test_insert_rows_json_with_too_few_row_ids (self ):
5591
+ rows = [{"col1" : "val1" }, {"col2" : "val2" }, {"col3" : "val3" }]
5592
+ creds = _make_credentials ()
5593
+ http = object ()
5594
+ client = self ._make_one (
5595
+ project = "default-project" , credentials = creds , _http = http
5596
+ )
5597
+ client ._connection = make_connection ({})
5598
+
5599
+ insert_ids = ["10" , "20" ]
5600
+
5601
+ error_msg_pattern = "row_ids did not generate enough IDs.*index 2"
5602
+ with self .assertRaisesRegex (ValueError , error_msg_pattern ):
5603
+ client .insert_rows_json ("proj.dset.tbl" , rows , row_ids = insert_ids )
5604
+
5507
5605
def test_insert_rows_json_w_explicit_none_insert_ids (self ):
5508
5606
rows = [{"col1" : "val1" }, {"col2" : "val2" }]
5509
5607
creds = _make_credentials ()
@@ -5526,6 +5624,45 @@ def test_insert_rows_json_w_explicit_none_insert_ids(self):
5526
5624
timeout = None ,
5527
5625
)
5528
5626
5627
+ def test_insert_rows_json_w_none_insert_ids_sequence (self ):
5628
+ rows = [{"col1" : "val1" }, {"col2" : "val2" }]
5629
+ creds = _make_credentials ()
5630
+ http = object ()
5631
+ client = self ._make_one (
5632
+ project = "default-project" , credentials = creds , _http = http
5633
+ )
5634
+ conn = client ._connection = make_connection ({})
5635
+
5636
+ uuid_patcher = mock .patch ("uuid.uuid4" , side_effect = map (str , range (len (rows ))))
5637
+ with warnings .catch_warnings (record = True ) as warned , uuid_patcher :
5638
+ errors = client .insert_rows_json ("proj.dset.tbl" , rows , row_ids = None )
5639
+
5640
+ self .assertEqual (len (errors ), 0 )
5641
+
5642
+ # Passing row_ids=None should have resulted in a deprecation warning.
5643
+ matches = [
5644
+ warning
5645
+ for warning in warned
5646
+ if issubclass (warning .category , DeprecationWarning )
5647
+ and "row_ids" in str (warning )
5648
+ and "AutoRowIDs.GENERATE_UUID" in str (warning )
5649
+ ]
5650
+ assert matches , "The expected deprecation warning was not raised."
5651
+
5652
+ # Check row data sent to the backend.
5653
+ expected_row_data = {
5654
+ "rows" : [
5655
+ {"json" : {"col1" : "val1" }, "insertId" : "0" },
5656
+ {"json" : {"col2" : "val2" }, "insertId" : "1" },
5657
+ ]
5658
+ }
5659
+ conn .api_request .assert_called_once_with (
5660
+ method = "POST" ,
5661
+ path = "/projects/proj/datasets/dset/tables/tbl/insertAll" ,
5662
+ data = expected_row_data ,
5663
+ timeout = None ,
5664
+ )
5665
+
5529
5666
def test_insert_rows_w_wrong_arg (self ):
5530
5667
from google .cloud .bigquery .dataset import DatasetReference
5531
5668
from google .cloud .bigquery .schema import SchemaField
0 commit comments