Skip to content

Commit 5d3ca44

Browse files
authored
test: catch expected UserWarning in test_repr_mimebundle_selection_logic (#17717)
Assert expected `UserWarning` during the fallback path test in `test_repr_mimebundle_selection_logic`. When testing fallback behavior on `anywidget` failure, `html.repr_mimebundle` emits a warning (`Anywidget mode is not available or failed to load`). This change uses `pytest.warns(UserWarning, match=...)` to handle the warning cleanly in unit tests. Fixes #<534917716> 🦕
1 parent 35e16da commit 5d3ca44

3 files changed

Lines changed: 79 additions & 61 deletions

File tree

packages/bigframes/tests/unit/display/test_anywidget.py

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,13 @@ def test_navigation_to_invalid_page_resets_to_valid_page_without_deadlock():
4545
mock_df._block = mock_block
4646

4747
# We mock _initial_load to avoid complex setup
48-
with mock.patch.object(TableWidget, "_initial_load"):
49-
with bigframes.option_context(
48+
with (
49+
mock.patch.object(TableWidget, "_initial_load"),
50+
bigframes.option_context(
5051
"display.render_mode", "anywidget", "display.max_rows", 10
51-
):
52-
widget = TableWidget(mock_df)
52+
),
53+
):
54+
widget = TableWidget(mock_df)
5355

5456
# Simulate "loaded data but unknown total rows" state
5557
widget.page_size = 10
@@ -179,11 +181,11 @@ def test_page_size_change_resets_sort(mock_df):
179181

180182
def test_cell_execution_count_propagation(mock_df):
181183
"""Test that the captured cell_execution_count is propagated to to_pandas_batches."""
182-
with mock.patch(
183-
"bigframes.core.utils.get_ipython_execution_count", return_value=42
184+
with (
185+
mock.patch("bigframes.core.utils.get_ipython_execution_count", return_value=42),
186+
bigframes.option_context("display.render_mode", "anywidget"),
184187
):
185-
with bigframes.option_context("display.render_mode", "anywidget"):
186-
widget = TableWidget(mock_df)
188+
widget = TableWidget(mock_df)
187189

188190
assert widget._cell_execution_count == 42
189191

@@ -274,19 +276,23 @@ def __init__(self):
274276

275277

276278
def test_init_raises_if_anywidget_not_installed():
277-
with mock.patch("bigframes.display.anywidget._ANYWIDGET_INSTALLED", False):
278-
with pytest.raises(ImportError):
279-
from bigframes.display.anywidget import TableWidget
279+
with (
280+
mock.patch("bigframes.display.anywidget._ANYWIDGET_INSTALLED", False),
281+
pytest.raises(ImportError),
282+
):
283+
from bigframes.display.anywidget import TableWidget
280284

281-
TableWidget(mock.Mock())
285+
TableWidget(mock.Mock())
282286

283287

284288
def test_init_initializes_attributes(mock_df_deferred):
285289
from bigframes.display.anywidget import TableWidget
286290

287-
with bigframes.option_context("display.render_mode", "anywidget"):
288-
with mock.patch.object(TableWidget, "_initial_load"):
289-
widget = TableWidget(mock_df_deferred)
291+
with (
292+
bigframes.option_context("display.render_mode", "anywidget"),
293+
mock.patch.object(TableWidget, "_initial_load"),
294+
):
295+
widget = TableWidget(mock_df_deferred)
290296

291297
assert widget._dataframe is mock_df_deferred
292298
assert widget.page == 0
@@ -328,19 +334,21 @@ def test_validate_page_clamping(mock_df_deferred):
328334
def test_validate_page_size(mock_df_deferred):
329335
from bigframes.display.anywidget import TableWidget
330336

331-
with bigframes.option_context("display.render_mode", "anywidget"):
332-
with mock.patch.object(TableWidget, "_initial_load"):
333-
widget = TableWidget(mock_df_deferred)
337+
with (
338+
bigframes.option_context("display.render_mode", "anywidget"),
339+
mock.patch.object(TableWidget, "_initial_load"),
340+
):
341+
widget = TableWidget(mock_df_deferred)
334342

335-
widget.page_size = 50
336-
assert widget.page_size == 50
343+
widget.page_size = 50
344+
assert widget.page_size == 50
337345

338-
original_size = widget.page_size
339-
widget.page_size = -5
340-
assert widget.page_size == original_size
346+
original_size = widget.page_size
347+
widget.page_size = -5
348+
assert widget.page_size == original_size
341349

342-
widget.page_size = 10000
343-
assert widget.page_size == 1000
350+
widget.page_size = 10000
351+
assert widget.page_size == 1000
344352

345353

346354
def test_page_size_change_resets_page_and_sort(mock_df_deferred):
@@ -373,14 +381,16 @@ def test_page_size_change_resets_batches(mock_df_deferred):
373381
def test_sort_change_resets_batches(mock_df_deferred):
374382
from bigframes.display.anywidget import TableWidget
375383

376-
with bigframes.option_context("display.render_mode", "anywidget"):
377-
with mock.patch.object(TableWidget, "_initial_load"):
378-
widget = TableWidget(mock_df_deferred)
379-
widget._initial_load_complete = True
384+
with (
385+
bigframes.option_context("display.render_mode", "anywidget"),
386+
mock.patch.object(TableWidget, "_initial_load"),
387+
):
388+
widget = TableWidget(mock_df_deferred)
389+
widget._initial_load_complete = True
380390

381-
mock_df_deferred.to_pandas_batches.reset_mock()
391+
mock_df_deferred.to_pandas_batches.reset_mock()
382392

383-
widget.sort_context = [{"column": "B", "ascending": False}]
393+
widget.sort_context = [{"column": "B", "ascending": False}]
384394

385395
assert mock_df_deferred.to_pandas_batches.call_count >= 1
386396

@@ -510,22 +520,24 @@ def test_deferred_mode_execution_in_colab(mock_deferred_df, mock_df_deferred):
510520
batches.total_rows = 1
511521
mock_df_deferred.to_pandas_batches.return_value = batches
512522

513-
with mock.patch.dict(sys.modules, {"google.colab": mock.MagicMock()}):
514-
with bigframes.option_context("display.render_mode", "anywidget"):
515-
widget = TableWidget(mock_deferred_df)
516-
widget.is_deferred_mode = True
523+
with (
524+
mock.patch.dict(sys.modules, {"google.colab": mock.MagicMock()}),
525+
bigframes.option_context("display.render_mode", "anywidget"),
526+
):
527+
widget = TableWidget(mock_deferred_df)
528+
widget.is_deferred_mode = True
517529

518-
widget.start_execution = True
530+
widget.start_execution = True
519531

520-
thread = getattr(widget, "_execution_thread", None)
521-
if thread is not None:
522-
thread.join(timeout=5)
532+
thread = getattr(widget, "_execution_thread", None)
533+
if thread is not None:
534+
thread.join(timeout=5)
523535

524-
assert widget.is_deferred_mode is True
525-
assert widget.table_html == ""
536+
assert widget.is_deferred_mode is True
537+
assert widget.table_html == ""
526538

527-
# Simulate frontend ping callback
528-
widget.ping = 1
539+
# Simulate frontend ping callback
540+
widget.ping = 1
529541

530-
assert widget.is_deferred_mode is False
531-
assert widget.table_html != ""
542+
assert widget.is_deferred_mode is False
543+
assert widget.table_html != ""

packages/bigframes/tests/unit/display/test_html.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -203,19 +203,20 @@ def test_repr_mimebundle_head():
203203
)
204204

205205
# Mock _get_obj_metadata
206-
with patch("bigframes.display.html._get_obj_metadata", return_value=(False, False)):
207-
# Mock create_html_representation and create_text_representation
208-
with patch(
206+
with (
207+
patch("bigframes.display.html._get_obj_metadata", return_value=(False, False)),
208+
patch(
209209
"bigframes.display.html.create_html_representation", return_value="<html>"
210-
) as mock_create_html:
211-
with patch(
212-
"bigframes.display.plaintext.create_text_representation",
213-
return_value="text",
214-
) as mock_create_text:
215-
bundle = bf_html.repr_mimebundle_head(mock_df)
216-
217-
assert bundle == {"text/html": "<html>", "text/plain": "text"}
218-
mock_df._prepare_display_df.assert_called_once()
219-
mock_df._block.retrieve_repr_request_results.assert_called_once()
220-
mock_create_html.assert_called_once()
221-
mock_create_text.assert_called_once()
210+
) as mock_create_html,
211+
patch(
212+
"bigframes.display.plaintext.create_text_representation",
213+
return_value="text",
214+
) as mock_create_text,
215+
):
216+
bundle = bf_html.repr_mimebundle_head(mock_df)
217+
218+
assert bundle == {"text/html": "<html>", "text/plain": "text"}
219+
mock_df._prepare_display_df.assert_called_once()
220+
mock_df._block.retrieve_repr_request_results.assert_called_once()
221+
mock_create_html.assert_called_once()
222+
mock_create_text.assert_called_once()

packages/bigframes/tests/unit/display/test_render_mode.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import unittest.mock as mock
1616

17+
import pytest
18+
1719
import bigframes.display.html as bf_html
1820
import bigframes.pandas as bpd
1921

@@ -62,7 +64,10 @@ def test_repr_mimebundle_selection_logic():
6264

6365
# Test fallback to static deferred repr when anywidget fails
6466
mock_anywidget.side_effect = Exception("Anywidget failed")
65-
with bpd.option_context("display.repr_mode", "deferred"):
67+
with (
68+
bpd.option_context("display.repr_mode", "deferred"),
69+
pytest.warns(UserWarning, match="Anywidget mode is not available"),
70+
):
6671
bundle = bf_html.repr_mimebundle(mock_obj)
6772
assert bundle == {"text/plain": "deferred"}
6873
mock_deferred.assert_called_once()

0 commit comments

Comments
 (0)