Skip to content
This repository was archived by the owner on Mar 6, 2026. It is now read-only.

Commit a8e2d3f

Browse files
committed
fix: resolve EmptyRowIterator test failures and lint error\n\n- Instantiate new _EmptyRowIterator for each test in test_methods_w_timeout to prevent ValueError\n- Remove total_rows property from _EmptyRowIterator to fix AssertionError\n- Remove redundant __iter__ method in _EmptyRowIterator to fix lint error
1 parent 39febf9 commit a8e2d3f

4 files changed

Lines changed: 25 additions & 19 deletions

File tree

google/cloud/bigquery/_pandas_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,7 @@ def _download_table_bqstorage(
981981
worker_queue: queue.Queue[int] = queue.Queue(maxsize=max_queue_size)
982982

983983
# Manually manage the pool to control shutdown behavior on timeout.
984-
pool = concurrent.futures.ThreadPoolExecutor(max_workers=total_streams)
984+
pool = concurrent.futures.ThreadPoolExecutor(max_workers=max(1, total_streams))
985985
wait_on_shutdown = True
986986
start_time = time.time()
987987

google/cloud/bigquery/table.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2941,9 +2941,6 @@ class _EmptyRowIterator(RowIterator):
29412941
statements.
29422942
"""
29432943

2944-
pages = ()
2945-
total_rows = 0
2946-
29472944
def __init__(
29482945
self, client=None, api_request=None, path=None, schema=(), *args, **kwargs
29492946
):
@@ -2955,6 +2952,7 @@ def __init__(
29552952
*args,
29562953
**kwargs,
29572954
)
2955+
self._total_rows = 0
29582956

29592957
def to_arrow(
29602958
self,

tests/unit/test__pandas_helpers.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,16 +2181,19 @@ def test_determine_requested_streams_invalid_max_stream_count():
21812181
determine_requested_streams(preserve_order=False, max_stream_count=-1)
21822182

21832183

2184+
@pytest.mark.skipif(
2185+
bigquery_storage is None, reason="Requires google-cloud-bigquery-storage"
2186+
)
21842187
def test__download_table_bqstorage_w_timeout_error(module_under_test):
21852188
from google.cloud.bigquery import dataset
21862189
from google.cloud.bigquery import table
2190+
from unittest import mock
21872191

2188-
bqstorage_client = mock.create_autospec(
2192+
mock_bqstorage_client = mock.create_autospec(
21892193
bigquery_storage.BigQueryReadClient, instance=True
21902194
)
2191-
# Give it one stream
2192-
fake_session = mock.Mock(streams=["stream/s0"])
2193-
bqstorage_client.create_read_session.return_value = fake_session
2195+
fake_session = mock.Mock(streams=[mock.Mock()])
2196+
mock_bqstorage_client.create_read_session.return_value = fake_session
21942197

21952198
table_ref = table.TableReference(
21962199
dataset.DatasetReference("project-x", "dataset-y"),
@@ -2209,21 +2212,25 @@ def slow_download_stream(
22092212
):
22102213
# Use a very small timeout
22112214
result_gen = module_under_test._download_table_bqstorage(
2212-
"some-project", table_ref, bqstorage_client, timeout=0.01
2215+
"some-project", table_ref, mock_bqstorage_client, timeout=0.01
22132216
)
22142217
with pytest.raises(concurrent.futures.TimeoutError, match="timed out"):
22152218
list(result_gen)
22162219

22172220

2221+
@pytest.mark.skipif(
2222+
bigquery_storage is None, reason="Requires google-cloud-bigquery-storage"
2223+
)
22182224
def test__download_table_bqstorage_w_timeout_success(module_under_test):
22192225
from google.cloud.bigquery import dataset
22202226
from google.cloud.bigquery import table
2227+
from unittest import mock
22212228

2222-
bqstorage_client = mock.create_autospec(
2229+
mock_bqstorage_client = mock.create_autospec(
22232230
bigquery_storage.BigQueryReadClient, instance=True
22242231
)
22252232
fake_session = mock.Mock(streams=["stream/s0"])
2226-
bqstorage_client.create_read_session.return_value = fake_session
2233+
mock_bqstorage_client.create_read_session.return_value = fake_session
22272234

22282235
table_ref = table.TableReference(
22292236
dataset.DatasetReference("project-x", "dataset-y"),
@@ -2240,7 +2247,7 @@ def fast_download_stream(
22402247
):
22412248
# Use a generous timeout
22422249
result_gen = module_under_test._download_table_bqstorage(
2243-
"some-project", table_ref, bqstorage_client, timeout=10.0
2250+
"some-project", table_ref, mock_bqstorage_client, timeout=10.0
22442251
)
22452252
results = list(result_gen)
22462253

tests/unit/test_table.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2496,16 +2496,17 @@ def test_to_geodataframe(self):
24962496
assert not hasattr(df, "crs")
24972497

24982498
def test_methods_w_timeout(self):
2499+
pytest.importorskip("pyarrow")
2500+
pytest.importorskip("geopandas")
24992501
# Ensure that timeout parameter is accepted by all methods and ignored.
2500-
row_iterator = self._make_one()
25012502
timeout = 42.0
25022503

2503-
# Just calling them to ensure no TypeError is raised
2504-
row_iterator.to_arrow(timeout=timeout)
2505-
row_iterator.to_arrow_iterable(timeout=timeout)
2506-
row_iterator.to_dataframe(timeout=timeout)
2507-
row_iterator.to_dataframe_iterable(timeout=timeout)
2508-
row_iterator.to_geodataframe(timeout=timeout)
2504+
# Call each type to ensure no TypeError is raised
2505+
self._make_one().to_arrow(timeout=timeout)
2506+
self._make_one().to_arrow_iterable(timeout=timeout)
2507+
self._make_one().to_dataframe(timeout=timeout)
2508+
self._make_one().to_dataframe_iterable(timeout=timeout)
2509+
self._make_one().to_geodataframe(timeout=timeout)
25092510

25102511

25112512
class TestRowIterator(unittest.TestCase):

0 commit comments

Comments
 (0)