From 6dc39338098585a64b5409575d46bff40624dc59 Mon Sep 17 00:00:00 2001 From: Winston Chang Date: Fri, 5 Jul 2024 15:31:09 -0500 Subject: [PATCH 1/4] Fixes from review feedback --- shiny/playwright/controller/_controls.py | 75 +++++++------------ .../test_deploys_express_dataframe.py | 2 +- .../test_0676_row_selection.py | 8 +- .../0696-resolve-id/test_0696_resolve_id.py | 5 +- .../test_1345_input_selected_rows.py | 2 +- .../test_1351_selected_row.py | 6 +- .../test_1390_selected_row_filtered.py | 34 ++++----- .../components/accordion/test_accordion.py | 4 +- .../data_frame/example/test_data_frame.py | 10 +-- .../test_validate_data_edit_mode.py | 2 +- .../test_validate_row_selection_edit_mode.py | 2 +- .../inputs/input_file/test_input_file.py | 2 +- .../shiny/inputs/test_input_checkbox.py | 8 +- .../shiny/inputs/test_input_dark_mode.py | 4 +- .../shiny/inputs/test_input_switch.py | 4 +- .../shiny/outputs/test_output_table.py | 4 +- 16 files changed, 74 insertions(+), 98 deletions(-) diff --git a/shiny/playwright/controller/_controls.py b/shiny/playwright/controller/_controls.py index 01679585c..f43f4edbb 100644 --- a/shiny/playwright/controller/_controls.py +++ b/shiny/playwright/controller/_controls.py @@ -1174,14 +1174,14 @@ def expect_page_mode(self, value: str, *, timeout: Timeout = None): ) return self - def expect_wc_attribute(self, value: str, *, timeout: Timeout = None): + def expect_ribute(self, value: str, *, timeout: Timeout = None): """ - Expect the `wc` attribute of the input dark mode to have a specific value. + Expect the attribute named `attribute` of the input dark mode to have a specific value. Parameters ---------- value - The expected value of the `wc` attribute. + The expected value of the `attribute` attribute. timeout The maximum time to wait for the expectation to be fulfilled. Defaults to `None`. """ @@ -1398,7 +1398,8 @@ def set(self, value: bool, *, timeout: Timeout = None, **kwargs: object) -> None value, timeout=timeout, **kwargs # pyright: ignore[reportArgumentType] ) - def toggle(self, *, timeout: Timeout = None, **kwargs: object) -> None: + # TODO-karan-test: Convert usage of _toggle() to set() + def _toggle(self, *, timeout: Timeout = None, **kwargs: object) -> None: """ Toggles the input checkbox. @@ -1480,6 +1481,7 @@ def __init__( ) +# TODO-future: Move class methods to a separate module class _MultipleDomItems: @staticmethod def assert_arr_is_unique( @@ -1711,9 +1713,6 @@ def expect_locator_values_in_list( raise e -# TODO-barret; continue from here - - class _RadioButtonCheckboxGroupBase(_UiWithLabel): loc_choice_labels: Locator @@ -1814,7 +1813,7 @@ def __init__( def set( self, - # Allow `selected` to be a single Pattern to perform matching against many items + # TODO-future: Allow `selected` to be a single Pattern to perform matching against many items selected: list[str], *, timeout: Timeout = None, @@ -2075,19 +2074,6 @@ class InputFile( Playwright `Locator` of the progress bar. """ - # id: str, - # label: TagChild, - # *, - # multiple: bool = False, - # accept: Optional[Union[str, list[str]]] = None, - # width: Optional[str] = None, - # button_label: str = "Browse...", - # placeholder: str = "No file selected", - # capture: Optional[Literal["environment", "user"]] = None, - # with page.expect_file_chooser() as fc_info: - # page.get_by_text("Upload").click() - # file_chooser = fc_info.value - # file_chooser.set_files("myfile.pdf") def __init__( self, page: Page, @@ -3700,7 +3686,12 @@ class _OutputImageBase(_OutputInlineContainerM, _OutputBase): Playwright `Locator` of the image. """ - def __init__(self, page: Page, id: str, loc_classes: str = "") -> None: + def __init__( + self, + page: Page, + id: str, + loc_classes: str = "", + ) -> None: """ Initializes an image output. @@ -3907,20 +3898,6 @@ def expect_empty(self, value: bool, *, timeout: Timeout = None) -> None: else: self.expect.not_to_be_empty(timeout=timeout) - def expect_text(self, value: str, *, timeout: Timeout = None) -> None: - """ - Asserts that the output has the expected text. - - Parameters - ---------- - value - The expected text. - timeout - The maximum time to wait for the text to appear. Defaults to `None`. - """ - - self.expect.to_have_text(value, timeout=timeout) - # When making selectors, use `xpath` so that direct decendents can be checked class OutputTable(_OutputBase): @@ -4025,7 +4002,7 @@ def expect_column_text( timeout=timeout, ) - def expect_n_col( + def expect_num_cols( self, value: int, *, @@ -4049,7 +4026,7 @@ def expect_n_col( timeout=timeout, ) - def expect_n_row( + def expect_num_rows( self, value: int, *, @@ -4191,9 +4168,9 @@ def set(self, open: bool, *, timeout: Timeout = None) -> None: The maximum time to wait for the sidebar to open or close. Defaults to `None`. """ if open ^ (self.loc_handle.get_attribute("aria-expanded") == "true"): - self.toggle(timeout=timeout) + self._toggle(timeout=timeout) - def toggle(self, *, timeout: Timeout = None) -> None: + def _toggle(self, *, timeout: Timeout = None) -> None: """ Toggles the sidebar open or closed. @@ -4958,9 +4935,9 @@ def set(self, open: bool, *, timeout: Timeout = None) -> None: self.loc.scroll_into_view_if_needed(timeout=timeout) expect_not_to_have_class(self.loc_body, "collapsing", timeout=timeout) if self._loc_body_visible.count() != int(open): - self.toggle(timeout=timeout) + self._toggle(timeout=timeout) - def toggle(self, *, timeout: Timeout = None) -> None: + def _toggle(self, *, timeout: Timeout = None) -> None: """ Toggles the state of the control. @@ -5159,9 +5136,9 @@ def set(self, open: bool, timeout: Timeout = None) -> None: The maximum time to wait for the popover to be visible and interactable. Defaults to `None`. """ if open ^ self.get_loc_overlay_body(timeout=timeout).count() > 0: - self.toggle() + self._toggle() - def toggle(self, timeout: Timeout = None) -> None: + def _toggle(self, timeout: Timeout = None) -> None: """ Toggles the state of the popover. @@ -5230,11 +5207,11 @@ def set(self, open: bool, timeout: Timeout = None) -> None: The maximum time to wait for the tooltip to be visible and interactable. Defaults to `None`. """ if open ^ self.get_loc_overlay_body(timeout=timeout).count() > 0: - self.toggle(timeout=timeout) + self._toggle(timeout=timeout) if not open: self.get_loc_overlay_body(timeout=timeout).click() - def toggle(self, timeout: Timeout = None) -> None: + def _toggle(self, timeout: Timeout = None) -> None: """ Toggles the state of the tooltip. @@ -5879,7 +5856,7 @@ def cell_locator(self, row: int, col: int) -> Locator: ) # TODO-barret; Should this be called `expect_row_count()`? - def expect_n_row(self, value: int, *, timeout: Timeout = None): + def expect_num_rows(self, value: int, *, timeout: Timeout = None): """ Expects the number of rows in the data frame. @@ -5894,7 +5871,7 @@ def expect_n_row(self, value: int, *, timeout: Timeout = None): value, timeout=timeout ) - def expect_selected_n_row(self, value: int, *, timeout: Timeout = None): + def expect_selected_num_rows(self, value: int, *, timeout: Timeout = None): """ Expects the number of selected rows in the data frame. @@ -6106,7 +6083,7 @@ def expect_column_label( timeout=timeout, ) - def expect_n_col( + def expect_num_cols( self, value: int, *, diff --git a/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py b/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py index b5ab56959..2a92eb87e 100644 --- a/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py +++ b/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py @@ -18,4 +18,4 @@ def test_express_dataframe_deploys(page: Page, app_url: str) -> None: page.goto(app_url) dataframe = controller.OutputDataFrame(page, "sample_data_frame") - dataframe.expect_n_row(6) + dataframe.expect_num_rows(6) diff --git a/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py b/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py index 48e77aabe..5b02ea32f 100644 --- a/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py +++ b/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py @@ -17,17 +17,17 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: selected_rows = controller.OutputCode(page, "selected_rows") grid.expect_cell("three", row=2, col=0) - detail.expect_n_row(0) - detail.expect_n_col(3) + detail.expect_num_rows(0) + detail.expect_num_cols(3) selected_rows.expect_value("()") grid.select_rows([2]) - detail.expect_n_row(1) + detail.expect_num_rows(1) detail.expect_cell("three", row=0, col=0) selected_rows.expect_value("(2,)") # Ensure that keys are in sorted order, not the order in which they were selected # row1.click(modifiers=["Shift"]) grid.loc_body.locator("td").nth(0).click(modifiers=["Shift"]) - detail.expect_n_row(3) + detail.expect_num_rows(3) selected_rows.expect_value("(0, 1, 2)") diff --git a/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py b/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py index 421aa66f4..f2edf417b 100644 --- a/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py +++ b/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py @@ -25,8 +25,7 @@ def resolve_id(id: str): return id dataframe = controller.OutputDataFrame(page, resolve_id("out_data_frame")) - # using expect_row_count instead of expect_n_row because the latter returns all the rows on the page - dataframe.expect_n_row(count + 1) + dataframe.expect_num_rows(count + 1) controller.OutputText(page, resolve_id("out_text")).expect_value( f"Output text content. `input.radio_buttons()`: `{letter}`" @@ -34,7 +33,7 @@ def resolve_id(id: str): controller.OutputTextVerbatim(page, resolve_id("out_text_verbatim")).expect_value( f"Output text verbatim content. `input.radio_buttons()`: `{letter}`" ) - controller.OutputTable(page, resolve_id("out_table")).expect_n_row(count + 1) + controller.OutputTable(page, resolve_id("out_table")).expect_num_rows(count + 1) # Mirrors ImageTransformer implementation src = penguin_imgs[count] diff --git a/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py b/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py index 4b2f62812..7013acf12 100644 --- a/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py +++ b/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py @@ -13,7 +13,7 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: selected_rows = controller.OutputTextVerbatim(page, "selected_rows") cell_selection = controller.OutputTextVerbatim(page, "cell_selection") - df.expect_n_row(3) + df.expect_num_rows(3) selected_rows.expect_value("Input selected rows: ()") cell_selection.expect_value("Cell selection rows: ()") diff --git a/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py b/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py index 52fd89cfd..9d2eaefbb 100644 --- a/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py +++ b/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py @@ -14,18 +14,18 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: clear_table = controller.InputActionButton(page, "clear_table") selected_rows = controller.OutputTextVerbatim(page, "number_of_selected_rows") - df.expect_n_row(0) + df.expect_num_rows(0) selected_rows.expect_value("Selected rows: 0") add_row.click() - df.expect_n_row(1) + df.expect_num_rows(1) selected_rows.expect_value("Selected rows: 0") df.cell_locator(0, 0).click() df.select_rows([0]) - df.expect_n_row(1) + df.expect_num_rows(1) selected_rows.expect_value("Selected rows: 1") clear_table.click() diff --git a/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py b/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py index cd99e4f24..3ffa33760 100644 --- a/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py +++ b/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py @@ -21,33 +21,33 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: def expect_selected_count(x: controller.OutputDataFrame, n: int) -> None: expect(x.loc_body.locator("tr[aria-selected=true]")).to_have_count(n) - my_df.expect_n_row(10) + my_df.expect_num_rows(10) expect_selected_count(my_df, 0) - selected_df.expect_n_row(0) + selected_df.expect_num_rows(0) selected_rows.expect_value("()") # Select row my_df.select_rows([5, 7]) - my_df.expect_n_row(10) + my_df.expect_num_rows(10) expect_selected_count(my_df, 2) - selected_df.expect_n_row(2) + selected_df.expect_num_rows(2) selected_rows.expect_value("(5, 7)") filter_text: ColumnFilterStr = {"col": 0, "value": "5"} # # Filter to different row # Currently this causes an error my_df.set_filter(filter_text) - my_df.expect_n_row(1) + my_df.expect_num_rows(1) expect_selected_count(my_df, 1) - selected_df.expect_n_row(1) + selected_df.expect_num_rows(1) selected_rows.expect_value("(5,)") # # Remove the filter my_df.set_filter(None) # Confirm the original data frame returns - my_df.expect_n_row(10) + my_df.expect_num_rows(10) # Confirm the previous row is still selected as no new selection has been made expect_selected_count(my_df, 2) - selected_df.expect_n_row(2) + selected_df.expect_num_rows(2) selected_rows.expect_value("(5, 7)") # Filter to non selected row @@ -55,30 +55,30 @@ def expect_selected_count(x: controller.OutputDataFrame, n: int) -> None: filter_text["value"] = "8" filter_text["col"] = 0 my_df.set_filter(filter_text) - my_df.expect_n_row(1) + my_df.expect_num_rows(1) expect_selected_count(my_df, 0) - selected_df.expect_n_row(0) + selected_df.expect_num_rows(0) selected_rows.expect_value("()") # Remove the filter # Confirm the original data frame returns my_df.set_filter(None) - my_df.expect_n_row(10) + my_df.expect_num_rows(10) expect_selected_count(my_df, 2) - selected_df.expect_n_row(2) + selected_df.expect_num_rows(2) selected_rows.expect_value("(5, 7)") # Update selection with new selection while under a filter my_df.set_filter(filter_text) - my_df.expect_n_row(1) + my_df.expect_num_rows(1) expect_selected_count(my_df, 0) - selected_df.expect_n_row(0) + selected_df.expect_num_rows(0) selected_rows.expect_value("()") my_df.select_rows([0]) my_df.set_filter(None) - my_df.expect_n_row(10) + my_df.expect_num_rows(10) expect_selected_count(my_df, 1) - selected_df.expect_n_row(1) + selected_df.expect_num_rows(1) selected_rows.expect_value("(8,)") # Remove selection @@ -88,5 +88,5 @@ def expect_selected_count(x: controller.OutputDataFrame, n: int) -> None: modifiers=[modifier] ) # TODO-karan-test: Support unselect row method expect_selected_count(my_df, 0) - selected_df.expect_n_row(0) + selected_df.expect_num_rows(0) selected_rows.expect_value("()") diff --git a/tests/playwright/shiny/components/accordion/test_accordion.py b/tests/playwright/shiny/components/accordion/test_accordion.py index 27cfdb6eb..4d8b6629e 100644 --- a/tests/playwright/shiny/components/accordion/test_accordion.py +++ b/tests/playwright/shiny/components/accordion/test_accordion.py @@ -70,10 +70,10 @@ def test_accordion(page: Page, local_app: ShinyAppProc) -> None: acc.expect_panels(["updated_section_a", "Section B", "Section C", "Section D"]) # workaround - toggle it twice Section A - acc_panel_updated_A.toggle() + acc_panel_updated_A._toggle() # add timeout to wait for css animation page.wait_for_timeout(100) - acc_panel_updated_A.toggle() + acc_panel_updated_A._toggle() output_txt_verbatim.expect_value( "input.acc(): ('updated_section_a', 'Section C', 'Section D')" ) diff --git a/tests/playwright/shiny/components/data_frame/example/test_data_frame.py b/tests/playwright/shiny/components/data_frame/example/test_data_frame.py index 6038e8550..01d811e08 100644 --- a/tests/playwright/shiny/components/data_frame/example/test_data_frame.py +++ b/tests/playwright/shiny/components/data_frame/example/test_data_frame.py @@ -94,13 +94,13 @@ def get_width() -> float: width1 = get_width() # Switch to narrow mode with expect_to_change(get_width): - controller.InputSwitch(page, "fullwidth").toggle() + controller.InputSwitch(page, "fullwidth")._toggle() width2 = get_width() assert width2 < width1 # Switch back to full width - controller.InputSwitch(page, "fullwidth").toggle() + controller.InputSwitch(page, "fullwidth")._toggle() @pytest.mark.flaky(reruns=reruns, delay=reruns_delay) @@ -118,7 +118,7 @@ def test_table_switch( scroll_to_end() # Switch to table - controller.InputSwitch(page, "gridstyle").toggle() + controller.InputSwitch(page, "gridstyle")._toggle() expect(grid_container).not_to_have_class(re.compile(r"\bshiny-data-grid-grid\b")) expect(grid_container).to_have_class(re.compile(r"\bshiny-data-grid-table\b")) @@ -262,7 +262,7 @@ def test_filter_table( ): page.goto(data_frame_app.url) - controller.InputSwitch(page, "gridstyle").toggle() + controller.InputSwitch(page, "gridstyle")._toggle() expect(grid_container).not_to_have_class(re.compile(r"\bshiny-data-grid-grid\b")) expect(grid_container).to_have_class(re.compile(r"\bshiny-data-grid-table\b")) @@ -368,5 +368,5 @@ def test_filter_disable(page: Page, data_frame_app: ShinyAppProc): page.goto(data_frame_app.url) expect(page.locator("tr.filters")).to_be_attached() - controller.InputSwitch(page, "filters").toggle() + controller.InputSwitch(page, "filters")._toggle() expect(page.locator("tr.filters")).not_to_be_attached() diff --git a/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py b/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py index ceea2bfc7..9caae7591 100644 --- a/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py +++ b/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py @@ -31,7 +31,7 @@ def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: ) data_frame.expect_cell("PAL0708", row=0, col=0) - data_frame.expect_n_col(17) + data_frame.expect_num_cols(17) data_frame.expect_class_state("ready", row=0, col=0) data_frame.expect_column_label(["Species"], col=3) data_frame.edit_cell("Study0708_edited", row=0, col=0) diff --git a/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py b/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py index 14dfcc545..6ce43cca1 100644 --- a/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py +++ b/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py @@ -19,7 +19,7 @@ def test_validate_row_selection_in_edit_mode( data_frame.edit_cell("N2A2", row=1, col=6) data_frame.expect_row_focus_state(False, row=1) data_frame.expect_class_state("editing", row=1, col=6) - data_frame.expect_selected_n_row(1) + data_frame.expect_selected_num_rows(1) data_frame.expect_selected_rows([1]) data_frame.save_cell("N3A2", row=1, col=6, save_key="Escape") data_frame.expect_cell("N1A2", row=1, col=6) diff --git a/tests/playwright/shiny/inputs/input_file/test_input_file.py b/tests/playwright/shiny/inputs/input_file/test_input_file.py index 8cee7aef7..a9f45195a 100644 --- a/tests/playwright/shiny/inputs/input_file/test_input_file.py +++ b/tests/playwright/shiny/inputs/input_file/test_input_file.py @@ -41,7 +41,7 @@ def test_input_file_kitchen(page: Page, local_app: ShinyAppProc) -> None: output_table = controller.OutputTable(page, "summary") output_table.expect_column_labels(["Row Count", "Column Count", "Column Names"]) - output_table.expect_n_row(1) + output_table.expect_num_rows(1) file2 = controller.InputFile(page, "file2") file2.set([file_info, file_info2]) diff --git a/tests/playwright/shiny/inputs/test_input_checkbox.py b/tests/playwright/shiny/inputs/test_input_checkbox.py index 65fb41ac3..abee922b1 100644 --- a/tests/playwright/shiny/inputs/test_input_checkbox.py +++ b/tests/playwright/shiny/inputs/test_input_checkbox.py @@ -19,16 +19,16 @@ def test_input_checkbox_kitchen(page: Page, app: ShinyAppProc) -> None: somevalue.expect_checked(False) somevalue.expect_width(None) - output_txt.expect_text("False") + output_txt.expect.to_have_text("False") somevalue.set(True) somevalue.expect_checked(True) - somevalue.toggle() + somevalue._toggle() somevalue.expect_checked(False) - somevalue.toggle() + somevalue._toggle() somevalue.expect_checked(True) - output_txt.expect_text("True") + output_txt.expect.to_have_text("True") diff --git a/tests/playwright/shiny/inputs/test_input_dark_mode.py b/tests/playwright/shiny/inputs/test_input_dark_mode.py index bb6bdd30e..46192d9b3 100644 --- a/tests/playwright/shiny/inputs/test_input_dark_mode.py +++ b/tests/playwright/shiny/inputs/test_input_dark_mode.py @@ -15,12 +15,12 @@ def test_input_dark_mode_follows_system_setting(page: Page, app: ShinyAppProc) - mode_switch = controller.InputDarkMode(page, "mode") mode_switch.expect_mode("light") - mode_switch.expect_wc_attribute("data-bs-theme") + mode_switch.expect_attribute("data-bs-theme") page.emulate_media(color_scheme="dark") mode_switch = controller.InputDarkMode(page, "mode") mode_switch.expect_mode("dark") - mode_switch.expect_wc_attribute("data-bs-theme") + mode_switch.expect_attribute("data-bs-theme") def test_input_dark_mode_switch(page: Page, app: ShinyAppProc) -> None: diff --git a/tests/playwright/shiny/inputs/test_input_switch.py b/tests/playwright/shiny/inputs/test_input_switch.py index f29a16150..7d9509649 100644 --- a/tests/playwright/shiny/inputs/test_input_switch.py +++ b/tests/playwright/shiny/inputs/test_input_switch.py @@ -24,10 +24,10 @@ def test_input_switch_kitchen(page: Page, app: ShinyAppProc) -> None: somevalue.expect_checked(True) - somevalue.toggle() + somevalue._toggle() somevalue.expect_checked(False) - somevalue.toggle() + somevalue._toggle() somevalue.expect_checked(True) expect(controller.OutputUi(page, "value").loc).to_have_text("True") diff --git a/tests/playwright/shiny/outputs/test_output_table.py b/tests/playwright/shiny/outputs/test_output_table.py index 21b7b9b13..eb451162c 100644 --- a/tests/playwright/shiny/outputs/test_output_table.py +++ b/tests/playwright/shiny/outputs/test_output_table.py @@ -12,8 +12,8 @@ def test_output_plot_kitchen(page: Page, app: ShinyAppProc) -> None: table = controller.OutputTable(page, "result") - table.expect_n_col(11) - table.expect_n_row(32) + table.expect_num_cols(11) + table.expect_num_rows(32) table.expect_cell("93", 3, 4) table.expect_cell("2.875", 2, 6) From 71771674c0c591ea528c7aad9eaf32030466bc6e Mon Sep 17 00:00:00 2001 From: Winston Chang Date: Fri, 5 Jul 2024 16:07:53 -0500 Subject: [PATCH 2/4] Code review changes --- shiny/playwright/controller/_controls.py | 55 +++++++++++-------- .../test_deploys_express_dataframe.py | 2 +- .../test_deploys_express_page_default.py | 8 +-- .../test_0676_row_selection.py | 8 +-- .../0696-resolve-id/test_0696_resolve_id.py | 4 +- .../test_1345_input_selected_rows.py | 2 +- .../test_1351_selected_row.py | 6 +- .../test_1390_selected_row_filtered.py | 34 ++++++------ .../html_columns_df/tabbing/test_tabbing.py | 4 +- .../html_columns_df/test_html_columns.py | 14 ++--- .../data_frame/styles/test_df_styles.py | 8 +-- .../test_validate_data_edit_mode.py | 12 ++-- .../test_validate_data_save.py | 2 +- .../test_validate_row_selection_edit_mode.py | 24 ++++---- .../navset_hidden/test_nav_hidden.py | 4 +- .../inputs/input_file/test_input_file.py | 2 +- .../shiny/outputs/test_output_table.py | 4 +- 17 files changed, 102 insertions(+), 91 deletions(-) diff --git a/shiny/playwright/controller/_controls.py b/shiny/playwright/controller/_controls.py index f43f4edbb..af62fbf1e 100644 --- a/shiny/playwright/controller/_controls.py +++ b/shiny/playwright/controller/_controls.py @@ -4002,7 +4002,7 @@ def expect_column_text( timeout=timeout, ) - def expect_num_cols( + def expect_ncol( self, value: int, *, @@ -4026,7 +4026,7 @@ def expect_num_cols( timeout=timeout, ) - def expect_num_rows( + def expect_nrow( self, value: int, *, @@ -4762,7 +4762,7 @@ def expect_panels( def set( self, - selected: str | list[str], + open: str | list[str], *, timeout: Timeout = None, ) -> None: @@ -4771,13 +4771,13 @@ def set( Parameters ---------- - selected - The selected accordion panel(s). + open + The open accordion panel(s). timeout The maximum time to wait for the accordion panel to be visible and interactable. Defaults to `None`. """ - if isinstance(selected, str): - selected = [selected] + if isinstance(open, str): + open = [open] for element in self.loc.element_handles(): element.wait_for_element_state(state="visible", timeout=timeout) element.scroll_into_view_if_needed(timeout=timeout) @@ -4786,9 +4786,7 @@ def set( raise ValueError( "Accordion panel does not have a `data-value` attribute" ) - self.accordion_panel(elem_value).set( - elem_value in selected, timeout=timeout - ) + self.accordion_panel(elem_value).set(elem_value in open, timeout=timeout) def accordion_panel( self, @@ -5284,7 +5282,9 @@ def get_loc_active_content(self, *, timeout: Timeout = None) -> Locator: f"div.tab-content[data-tabsetid='{datatab_id}'] > div.tab-pane.active" ) - def expect_content(self, value: PatternOrStr, *, timeout: Timeout = None) -> None: + def _expect_content_text( + self, value: PatternOrStr, *, timeout: Timeout = None + ) -> None: """ Expects the control to have the specified content. @@ -5419,7 +5419,9 @@ def expect_active(self, value: bool, *, timeout: Timeout = None) -> None: """ _expect_class_value(self.loc, "active", value, timeout=timeout) - def expect_content(self, value: PatternOrStr, *, timeout: Timeout = None) -> None: + def _expect_content_text( + self, value: PatternOrStr, *, timeout: Timeout = None + ) -> None: """ Expects the nav item content to have the specified text. @@ -5856,7 +5858,7 @@ def cell_locator(self, row: int, col: int) -> Locator: ) # TODO-barret; Should this be called `expect_row_count()`? - def expect_num_rows(self, value: int, *, timeout: Timeout = None): + def expect_nrow(self, value: int, *, timeout: Timeout = None): """ Expects the number of rows in the data frame. @@ -5933,7 +5935,7 @@ def expect_selected_rows(self, rows: list[int], *, timeout: Timeout = None): # Could not find the reason why. Raising the original error. raise e - def expect_row_focus_state( + def _expect_row_focus_state( self, in_focus: bool = True, *, row: int, timeout: Timeout = None ): """ @@ -6057,7 +6059,7 @@ def _cell_scroll_if_needed(self, *, row: int, col: int, timeout: Timeout): break cell.scroll_into_view_if_needed(timeout=timeout) - def expect_column_label( + def _expect_column_label( self, value: ListPatternOrStr, *, @@ -6083,7 +6085,7 @@ def expect_column_label( timeout=timeout, ) - def expect_num_cols( + def expect_ncol( self, value: int, *, @@ -6211,7 +6213,7 @@ def expect_class_state( "Invalid state. Select one of 'success', 'failure', 'saving', 'editing', 'ready'" ) - def edit_cell( + def _edit_cell_no_save( self, text: str, *, @@ -6400,13 +6402,15 @@ def set_filter( "Invalid filter value. Must be a string or a tuple/list of two numbers." ) - def save_cell( + def set_cell( self, text: str, *, row: int, col: int, - save_key: str, + finish_key: ( + Literal["Enter", "Shift+Enter", "Tab", "Shift+Tab", "Escape"] | None + ) = None, timeout: Timeout = None, ) -> None: """ @@ -6420,11 +6424,17 @@ def save_cell( The row number of the cell. col The column number of the cell. + finish_key + The key to save the value of the cell. If `None` (the default), no key will + be pressed and instead the page body will be clicked. timeout The maximum time to wait for the action to complete. Defaults to `None`. """ - self.edit_cell(text, row=row, col=col, timeout=timeout) - self.cell_locator(row=row, col=col).locator("> textarea").press(save_key) + self._edit_cell_no_save(text, row=row, col=col, timeout=timeout) + if finish_key is None: + self.page.locator("body").click() + else: + self.cell_locator(row=row, col=col).locator("> textarea").press(finish_key) def expect_cell_title( self, @@ -6435,7 +6445,8 @@ def expect_cell_title( timeout: Timeout = None, ) -> None: """ - Expects the validation message of the cell in the data frame. + Expects the validation message of the cell in the data frame, which will be in + the `title` attribute of the element. Parameters ---------- diff --git a/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py b/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py index 2a92eb87e..46fdd4e45 100644 --- a/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py +++ b/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py @@ -18,4 +18,4 @@ def test_express_dataframe_deploys(page: Page, app_url: str) -> None: page.goto(app_url) dataframe = controller.OutputDataFrame(page, "sample_data_frame") - dataframe.expect_num_rows(6) + dataframe.expect_nrow(6) diff --git a/tests/playwright/deploys/express-page_default/test_deploys_express_page_default.py b/tests/playwright/deploys/express-page_default/test_deploys_express_page_default.py index 56109abf1..36fdfc2d0 100644 --- a/tests/playwright/deploys/express-page_default/test_deploys_express_page_default.py +++ b/tests/playwright/deploys/express-page_default/test_deploys_express_page_default.py @@ -27,11 +27,11 @@ def test_page_default(page: Page, app_url: str) -> None: # Perform these tests second as their locators are not stable over time. # (They require that a locator be realized before finding the second locator) nav_html = controller.NavsetTab(page, "express_navset_tab") - nav_html.expect_content("pre 0pre 1pre 2") + nav_html._expect_content_text("pre 0pre 1pre 2") nav_html.set("div") - nav_html.expect_content("div 0\ndiv 1\ndiv 2") + nav_html._expect_content_text("div 0\ndiv 1\ndiv 2") nav_html.set("span") - nav_html.expect_content("span 0span 1span 2") + nav_html._expect_content_text("span 0span 1span 2") navset_card_tab = controller.NavsetTab(page, "express_navset_card_tab") - navset_card_tab.expect_content("") + navset_card_tab._expect_content_text("") diff --git a/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py b/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py index 5b02ea32f..6537b2bcf 100644 --- a/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py +++ b/tests/playwright/shiny/bugs/0676-row-selection/test_0676_row_selection.py @@ -17,17 +17,17 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: selected_rows = controller.OutputCode(page, "selected_rows") grid.expect_cell("three", row=2, col=0) - detail.expect_num_rows(0) - detail.expect_num_cols(3) + detail.expect_nrow(0) + detail.expect_ncol(3) selected_rows.expect_value("()") grid.select_rows([2]) - detail.expect_num_rows(1) + detail.expect_nrow(1) detail.expect_cell("three", row=0, col=0) selected_rows.expect_value("(2,)") # Ensure that keys are in sorted order, not the order in which they were selected # row1.click(modifiers=["Shift"]) grid.loc_body.locator("td").nth(0).click(modifiers=["Shift"]) - detail.expect_num_rows(3) + detail.expect_nrow(3) selected_rows.expect_value("(0, 1, 2)") diff --git a/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py b/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py index f2edf417b..1fb249eb5 100644 --- a/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py +++ b/tests/playwright/shiny/bugs/0696-resolve-id/test_0696_resolve_id.py @@ -25,7 +25,7 @@ def resolve_id(id: str): return id dataframe = controller.OutputDataFrame(page, resolve_id("out_data_frame")) - dataframe.expect_num_rows(count + 1) + dataframe.expect_nrow(count + 1) controller.OutputText(page, resolve_id("out_text")).expect_value( f"Output text content. `input.radio_buttons()`: `{letter}`" @@ -33,7 +33,7 @@ def resolve_id(id: str): controller.OutputTextVerbatim(page, resolve_id("out_text_verbatim")).expect_value( f"Output text verbatim content. `input.radio_buttons()`: `{letter}`" ) - controller.OutputTable(page, resolve_id("out_table")).expect_num_rows(count + 1) + controller.OutputTable(page, resolve_id("out_table")).expect_nrow(count + 1) # Mirrors ImageTransformer implementation src = penguin_imgs[count] diff --git a/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py b/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py index 7013acf12..a2424f4e7 100644 --- a/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py +++ b/tests/playwright/shiny/bugs/1345-render-data-frame-input/test_1345_input_selected_rows.py @@ -13,7 +13,7 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: selected_rows = controller.OutputTextVerbatim(page, "selected_rows") cell_selection = controller.OutputTextVerbatim(page, "cell_selection") - df.expect_num_rows(3) + df.expect_nrow(3) selected_rows.expect_value("Input selected rows: ()") cell_selection.expect_value("Cell selection rows: ()") diff --git a/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py b/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py index 9d2eaefbb..f6c406cc6 100644 --- a/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py +++ b/tests/playwright/shiny/bugs/1351-render-data-frame-selected/test_1351_selected_row.py @@ -14,18 +14,18 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: clear_table = controller.InputActionButton(page, "clear_table") selected_rows = controller.OutputTextVerbatim(page, "number_of_selected_rows") - df.expect_num_rows(0) + df.expect_nrow(0) selected_rows.expect_value("Selected rows: 0") add_row.click() - df.expect_num_rows(1) + df.expect_nrow(1) selected_rows.expect_value("Selected rows: 0") df.cell_locator(0, 0).click() df.select_rows([0]) - df.expect_num_rows(1) + df.expect_nrow(1) selected_rows.expect_value("Selected rows: 1") clear_table.click() diff --git a/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py b/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py index 3ffa33760..960ea8d10 100644 --- a/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py +++ b/tests/playwright/shiny/bugs/1390-df-selected-row-filtered/test_1390_selected_row_filtered.py @@ -21,33 +21,33 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: def expect_selected_count(x: controller.OutputDataFrame, n: int) -> None: expect(x.loc_body.locator("tr[aria-selected=true]")).to_have_count(n) - my_df.expect_num_rows(10) + my_df.expect_nrow(10) expect_selected_count(my_df, 0) - selected_df.expect_num_rows(0) + selected_df.expect_nrow(0) selected_rows.expect_value("()") # Select row my_df.select_rows([5, 7]) - my_df.expect_num_rows(10) + my_df.expect_nrow(10) expect_selected_count(my_df, 2) - selected_df.expect_num_rows(2) + selected_df.expect_nrow(2) selected_rows.expect_value("(5, 7)") filter_text: ColumnFilterStr = {"col": 0, "value": "5"} # # Filter to different row # Currently this causes an error my_df.set_filter(filter_text) - my_df.expect_num_rows(1) + my_df.expect_nrow(1) expect_selected_count(my_df, 1) - selected_df.expect_num_rows(1) + selected_df.expect_nrow(1) selected_rows.expect_value("(5,)") # # Remove the filter my_df.set_filter(None) # Confirm the original data frame returns - my_df.expect_num_rows(10) + my_df.expect_nrow(10) # Confirm the previous row is still selected as no new selection has been made expect_selected_count(my_df, 2) - selected_df.expect_num_rows(2) + selected_df.expect_nrow(2) selected_rows.expect_value("(5, 7)") # Filter to non selected row @@ -55,30 +55,30 @@ def expect_selected_count(x: controller.OutputDataFrame, n: int) -> None: filter_text["value"] = "8" filter_text["col"] = 0 my_df.set_filter(filter_text) - my_df.expect_num_rows(1) + my_df.expect_nrow(1) expect_selected_count(my_df, 0) - selected_df.expect_num_rows(0) + selected_df.expect_nrow(0) selected_rows.expect_value("()") # Remove the filter # Confirm the original data frame returns my_df.set_filter(None) - my_df.expect_num_rows(10) + my_df.expect_nrow(10) expect_selected_count(my_df, 2) - selected_df.expect_num_rows(2) + selected_df.expect_nrow(2) selected_rows.expect_value("(5, 7)") # Update selection with new selection while under a filter my_df.set_filter(filter_text) - my_df.expect_num_rows(1) + my_df.expect_nrow(1) expect_selected_count(my_df, 0) - selected_df.expect_num_rows(0) + selected_df.expect_nrow(0) selected_rows.expect_value("()") my_df.select_rows([0]) my_df.set_filter(None) - my_df.expect_num_rows(10) + my_df.expect_nrow(10) expect_selected_count(my_df, 1) - selected_df.expect_num_rows(1) + selected_df.expect_nrow(1) selected_rows.expect_value("(8,)") # Remove selection @@ -88,5 +88,5 @@ def expect_selected_count(x: controller.OutputDataFrame, n: int) -> None: modifiers=[modifier] ) # TODO-karan-test: Support unselect row method expect_selected_count(my_df, 0) - selected_df.expect_num_rows(0) + selected_df.expect_nrow(0) selected_rows.expect_value("()") diff --git a/tests/playwright/shiny/components/data_frame/html_columns_df/tabbing/test_tabbing.py b/tests/playwright/shiny/components/data_frame/html_columns_df/tabbing/test_tabbing.py index 106c75ead..494b3d771 100644 --- a/tests/playwright/shiny/components/data_frame/html_columns_df/tabbing/test_tabbing.py +++ b/tests/playwright/shiny/components/data_frame/html_columns_df/tabbing/test_tabbing.py @@ -10,12 +10,12 @@ def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: data_frame = controller.OutputDataFrame(page, "iris_df") # Data frame with html content in the first two columns; Edit a cell in the third column and try to hit `shift + tab`. It should not submit the edit in the current cell and stay at the current cell (not moving to the second or first column) data_frame.expect_cell("1.4", row=0, col=2) - data_frame.save_cell("152", row=0, col=2, save_key="Shift+Tab") + data_frame.set_cell("152", row=0, col=2, finish_key="Shift+Tab") data_frame.expect_cell("1.4", row=0, col=2) data_frame.expect_cell_class("cell-edit-editing", row=0, col=2) # Data frame with html content in the last two columns; Edit a cell in the third from last column and try to hit `tab`. It should not submit the edit in the current cell and stay at the current cell (not moving to the last two columns) data_frame.expect_cell("1.4", row=0, col=2) - data_frame.save_cell("152", row=0, col=2, save_key="Tab") + data_frame.set_cell("152", row=0, col=2, finish_key="Tab") data_frame.expect_cell("1.4", row=0, col=2) data_frame.expect_cell_class("cell-edit-editing", row=0, col=2) diff --git a/tests/playwright/shiny/components/data_frame/html_columns_df/test_html_columns.py b/tests/playwright/shiny/components/data_frame/html_columns_df/test_html_columns.py index f30acd9e5..cf7dbef36 100644 --- a/tests/playwright/shiny/components/data_frame/html_columns_df/test_html_columns.py +++ b/tests/playwright/shiny/components/data_frame/html_columns_df/test_html_columns.py @@ -22,7 +22,7 @@ def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: # assert patching works data_frame.expect_cell("N1A1", row=0, col=6) - data_frame.save_cell("N1A11", row=0, col=6, save_key="Enter") + data_frame.set_cell("N1A11", row=0, col=6, finish_key="Enter") data_frame.expect_cell("ID: N1A11", row=0, col=6) # assert sorting works @@ -52,7 +52,7 @@ def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: data_frame.expect_cell("152", row=0, col=1) # if a column is sorted, editing should not change the order - data_frame.save_cell("152", row=0, col=1, save_key="Enter") + data_frame.set_cell("152", row=0, col=1, finish_key="Enter") data_frame.expect_cell("151", row=1, col=1) # assert HTMLDependency works by verifying javascript variable @@ -72,7 +72,7 @@ def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: data_frame.expect_cell("3", row=0, col=1) # respect filtering even after edits when filters have been applied - data_frame.save_cell("3", row=0, col=1, save_key="Enter") + data_frame.set_cell("3", row=0, col=1, finish_key="Enter") data_frame.expect_cell("4", row=1, col=1) # assert that html columns are not editable @@ -96,17 +96,17 @@ def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: # Editing a cell in the first row and hitting `shift+enter` should not submit the change and stay editing the current cell data_frame.expect_cell("N25A2", row=0, col=6) - data_frame.save_cell("NAAAAA", row=0, col=6, save_key="Shift+Enter") + data_frame.set_cell("NAAAAA", row=0, col=6, finish_key="Shift+Enter") data_frame.expect_cell("N25A2", row=0, col=6) - data_frame.save_cell("NBBBBB", row=0, col=6, save_key="Escape") + data_frame.set_cell("NBBBBB", row=0, col=6, finish_key="Escape") data_frame.expect_cell("N25A2", row=0, col=6) # Editing a cell in the last row and hitting `enter` should not submit the change and stay editing the current cell # data_frame.set_column_filter(7, text="No") # Test scrolling to last row - data_frame.save_cell("NAAAAA", row=7, col=6, save_key="Enter") + data_frame.set_cell("NAAAAA", row=7, col=6, finish_key="Enter") data_frame.expect_cell("N29A2", row=7, col=6) - data_frame.save_cell("NAAAAA", row=7, col=6, save_key="Escape") + data_frame.set_cell("NAAAAA", row=7, col=6, finish_key="Escape") data_frame.expect_cell("N29A2", row=7, col=6) # Test scrolling up to top diff --git a/tests/playwright/shiny/components/data_frame/styles/test_df_styles.py b/tests/playwright/shiny/components/data_frame/styles/test_df_styles.py index 056245cf8..55f292194 100644 --- a/tests/playwright/shiny/components/data_frame/styles/test_df_styles.py +++ b/tests/playwright/shiny/components/data_frame/styles/test_df_styles.py @@ -93,14 +93,14 @@ def style_for_cell(row: int, col: int) -> dict[str, Jsonifiable] | None: expect_styles(fn_styles, [styles[0]]) expect_styles(list_styles, light_blue_with_style) - fn_styles.save_cell("new value", row=0, col=0, save_key="Enter") + fn_styles.set_cell("new value", row=0, col=0) expect_styles(fn_styles, [styles[0], styles[1]]) - fn_styles.save_cell("new value2", row=0, col=0, save_key="Enter") + fn_styles.set_cell("new value2", row=0, col=0) expect_styles(fn_styles, [styles[0], styles[1], styles[2]]) - fn_styles.save_cell("new value3", row=0, col=0, save_key="Enter") + fn_styles.set_cell("new value3", row=0, col=0) expect_styles(fn_styles, [styles[0], styles[1], styles[2], styles[3]]) - fn_styles.save_cell("new value4", row=0, col=0, save_key="Enter") + fn_styles.set_cell("new value4", row=0, col=0) expect_styles(fn_styles, [styles[0]]) diff --git a/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py b/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py index 9caae7591..d5bad8e70 100644 --- a/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py +++ b/tests/playwright/shiny/components/data_frame/validate_data_edit_mode/test_validate_data_edit_mode.py @@ -31,19 +31,19 @@ def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: ) data_frame.expect_cell("PAL0708", row=0, col=0) - data_frame.expect_num_cols(17) + data_frame.expect_ncol(17) data_frame.expect_class_state("ready", row=0, col=0) - data_frame.expect_column_label(["Species"], col=3) - data_frame.edit_cell("Study0708_edited", row=0, col=0) + data_frame._expect_column_label(["Species"], col=3) + data_frame._edit_cell_no_save("Study0708_edited", row=0, col=0) data_frame.expect_class_state("editing", row=0, col=0) - data_frame.save_cell("Study0708_edited", row=0, col=0, save_key="Enter") + data_frame.set_cell("Study0708_edited", row=0, col=0, finish_key="Enter") # data_frame.expect_class_state("saving", row=0, col=0) data_frame.expect_class_state("editing", row=1, col=0) data_frame.expect_class_state("success", row=0, col=0) data_frame.expect_cell("Study0708_edited", row=0, col=0) data_frame.expect_cell("Torgersen", row=0, col=4) - data_frame.save_cell("Stonington", row=0, col=4, save_key="Enter") + data_frame.set_cell("Stonington", row=0, col=4, finish_key="Enter") data_frame.expect_class_state("failure", row=0, col=4) data_frame.expect_cell_title( "Penguin island should be one of 'Torgersen', 'Biscoe', 'Dream'", row=0, col=4 @@ -51,5 +51,5 @@ def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: data_frame.expect_cell("Torgersen", row=0, col=4) data_frame.expect_cell("39.5", row=1, col=9) - data_frame.save_cell("Stonington", row=1, col=9, save_key="Shift+Enter") + data_frame.set_cell("Stonington", row=1, col=9, finish_key="Shift+Enter") data_frame.expect_class_state("editing", row=0, col=9) diff --git a/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py b/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py index 0c333c1d7..e9dda83a5 100644 --- a/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py +++ b/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py @@ -8,6 +8,6 @@ def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) data_frame = controller.OutputDataFrame(page, "penguins_df") - data_frame.save_cell("Study0708_edited", row=1, col=1, save_key="Enter") + data_frame.set_cell("Study0708_edited", row=1, col=1) data_frame.expect_class_state("saving", row=1, col=1) data_frame.expect_class_state("editing", row=2, col=1) diff --git a/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py b/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py index 6ce43cca1..beee97ac2 100644 --- a/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py +++ b/tests/playwright/shiny/components/data_frame/validate_row_selection_edit_mode/test_validate_row_selection_edit_mode.py @@ -16,28 +16,28 @@ def test_validate_row_selection_in_edit_mode( data_frame = controller.OutputDataFrame(page, "penguins_df") data_frame.expect_cell("N1A2", row=1, col=6) - data_frame.edit_cell("N2A2", row=1, col=6) - data_frame.expect_row_focus_state(False, row=1) + data_frame._edit_cell_no_save("N2A2", row=1, col=6) + data_frame._expect_row_focus_state(False, row=1) data_frame.expect_class_state("editing", row=1, col=6) data_frame.expect_selected_num_rows(1) data_frame.expect_selected_rows([1]) - data_frame.save_cell("N3A2", row=1, col=6, save_key="Escape") + data_frame.set_cell("N3A2", row=1, col=6, finish_key="Escape") data_frame.expect_cell("N1A2", row=1, col=6) - data_frame.expect_row_focus_state(True, row=1) + data_frame._expect_row_focus_state(True, row=1) page.keyboard.press("Escape") - data_frame.expect_row_focus_state(False, row=1) + data_frame._expect_row_focus_state(False, row=1) # Enable rows selection and editable. # Select (and verify) a row. Edit a cell content in that row. # Click a cell in another row. Verify the new row is selected and focused. # Verify the old row is not selected. Verify the old row cell value was updated. data_frame.expect_cell("N1A2", row=1, col=6) - data_frame.edit_cell("N2A2", row=1, col=6) - data_frame.expect_row_focus_state(False, row=1) + data_frame._edit_cell_no_save("N2A2", row=1, col=6) + data_frame._expect_row_focus_state(False, row=1) data_frame.expect_class_state("editing", row=1, col=6) data_frame.cell_locator(row=2, col=6).click() - data_frame.expect_row_focus_state(True, row=2) - data_frame.expect_row_focus_state(False, row=1) + data_frame._expect_row_focus_state(True, row=2) + data_frame._expect_row_focus_state(False, row=1) data_frame.expect_cell("N2A2", row=1, col=6) # Enable rows selection and editable. @@ -48,11 +48,11 @@ def test_validate_row_selection_in_edit_mode( # Verify that cell is editing. data_frame.cell_locator(row=1, col=2).click() page.keyboard.press("Enter") - data_frame.expect_row_focus_state(False, row=1) + data_frame._expect_row_focus_state(False, row=1) page.keyboard.press("Escape") - data_frame.expect_row_focus_state(True, row=1) + data_frame._expect_row_focus_state(True, row=1) page.keyboard.press("Escape") - data_frame.edit_cell("Temp value", row=1, col=16) + data_frame._edit_cell_no_save("Temp value", row=1, col=16) page.keyboard.press("Escape") page.keyboard.press("Enter") data_frame.expect_class_state("editing", row=1, col=0) diff --git a/tests/playwright/shiny/components/navset_hidden/test_nav_hidden.py b/tests/playwright/shiny/components/navset_hidden/test_nav_hidden.py index 6d0a61516..cddbfa5d8 100644 --- a/tests/playwright/shiny/components/navset_hidden/test_nav_hidden.py +++ b/tests/playwright/shiny/components/navset_hidden/test_nav_hidden.py @@ -12,7 +12,7 @@ def test_navset_hidden(page: Page, local_app: ShinyAppProc) -> None: navset_hidden = controller.NavsetHidden(page, "hidden_tabs") input_radio_buttons = controller.InputRadioButtons(page, "controller") navset_hidden.expect_nav_values(["panel1", "panel2", "panel3"]) - navset_hidden.expect_content("Panel 1 content") + navset_hidden._expect_content_text("Panel 1 content") input_radio_buttons.set("2") input_radio_buttons.expect_choices(["1", "2", "3"]) - navset_hidden.expect_content("Panel 2 content") + navset_hidden._expect_content_text("Panel 2 content") diff --git a/tests/playwright/shiny/inputs/input_file/test_input_file.py b/tests/playwright/shiny/inputs/input_file/test_input_file.py index a9f45195a..332e160d4 100644 --- a/tests/playwright/shiny/inputs/input_file/test_input_file.py +++ b/tests/playwright/shiny/inputs/input_file/test_input_file.py @@ -41,7 +41,7 @@ def test_input_file_kitchen(page: Page, local_app: ShinyAppProc) -> None: output_table = controller.OutputTable(page, "summary") output_table.expect_column_labels(["Row Count", "Column Count", "Column Names"]) - output_table.expect_num_rows(1) + output_table.expect_nrow(1) file2 = controller.InputFile(page, "file2") file2.set([file_info, file_info2]) diff --git a/tests/playwright/shiny/outputs/test_output_table.py b/tests/playwright/shiny/outputs/test_output_table.py index eb451162c..5abaf00fd 100644 --- a/tests/playwright/shiny/outputs/test_output_table.py +++ b/tests/playwright/shiny/outputs/test_output_table.py @@ -12,8 +12,8 @@ def test_output_plot_kitchen(page: Page, app: ShinyAppProc) -> None: table = controller.OutputTable(page, "result") - table.expect_num_cols(11) - table.expect_num_rows(32) + table.expect_ncol(11) + table.expect_nrow(32) table.expect_cell("93", 3, 4) table.expect_cell("2.875", 2, 6) From 2cd10939aa0b10c6954f5a8945b4f665a43e9ce6 Mon Sep 17 00:00:00 2001 From: Barret Schloerke Date: Mon, 8 Jul 2024 16:27:35 -0400 Subject: [PATCH 3/4] Missed name changes --- shiny/playwright/controller/_controls.py | 2 +- tests/playwright/shiny/components/nav/test_nav.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shiny/playwright/controller/_controls.py b/shiny/playwright/controller/_controls.py index af62fbf1e..42cc5c5df 100644 --- a/shiny/playwright/controller/_controls.py +++ b/shiny/playwright/controller/_controls.py @@ -1174,7 +1174,7 @@ def expect_page_mode(self, value: str, *, timeout: Timeout = None): ) return self - def expect_ribute(self, value: str, *, timeout: Timeout = None): + def expect_attribute(self, value: str, *, timeout: Timeout = None): """ Expect the attribute named `attribute` of the input dark mode to have a specific value. diff --git a/tests/playwright/shiny/components/nav/test_nav.py b/tests/playwright/shiny/components/nav/test_nav.py index e764e12bb..bf4578ea9 100644 --- a/tests/playwright/shiny/components/nav/test_nav.py +++ b/tests/playwright/shiny/components/nav/test_nav.py @@ -53,7 +53,7 @@ class LayoutInfo: element = nav_info.control(page, el_name) element.expect_nav_values(["a", "b", "c"]) element.expect_value("a") - element.expect_content(nav_info.verify + ": tab a content") + element._expect_content_text(nav_info.verify + ": tab a content") element.set("b") element.expect_value("b") - element.expect_content(nav_info.verify + ": tab b content") + element._expect_content_text(nav_info.verify + ": tab b content") From 8a6c9ad1a5b64f0f7b09e58f7001cbd1d4535814 Mon Sep 17 00:00:00 2001 From: Barret Schloerke Date: Mon, 8 Jul 2024 16:43:04 -0400 Subject: [PATCH 4/4] Update test_validate_data_save.py --- .../data_frame/validate_data_save/test_validate_data_save.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py b/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py index e9dda83a5..206498adc 100644 --- a/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py +++ b/tests/playwright/shiny/components/data_frame/validate_data_save/test_validate_data_save.py @@ -8,6 +8,6 @@ def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) data_frame = controller.OutputDataFrame(page, "penguins_df") - data_frame.set_cell("Study0708_edited", row=1, col=1) + data_frame.set_cell("Study0708_edited", row=1, col=1, finish_key="Enter") data_frame.expect_class_state("saving", row=1, col=1) data_frame.expect_class_state("editing", row=2, col=1)