From d9f32755af615d992e07a8476098ff755367af0d Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Mon, 24 Jun 2024 18:47:57 -0700 Subject: [PATCH 1/5] Change controls to controller --- shiny/_template_utils.py | 8 +- shiny/playwright/__init__.py | 4 +- .../{controls => controller}/__init__.py | 0 .../{controls => controller}/_controls.py | 0 .../test_deploys_express_accordion.py | 4 +- .../test_deploys_express_dataframe.py | 4 +- .../test_deploys_express_page_default.py | 6 +- .../test_deploys_express_page_fillable.py | 6 +- .../test_deploys_express_page_fluid.py | 6 +- .../test_deploys_express_page_sidebar.py | 6 +- tests/playwright/shiny/async/test_async.py | 12 +-- .../test_update_slider_datetime_value.py | 8 +- .../bugs/0666-sidebar/test_sidebar_colors.py | 8 +- .../test_0676_row_selection.py | 8 +- .../shiny/bugs/0696-resolve-id/mod_state.py | 6 +- .../0696-resolve-id/test_0696_resolve_id.py | 90 ++++++++----------- .../test_1345_input_selected_rows.py | 8 +- .../test_1351_selected_row.py | 14 ++- .../test_1390_selected_row_filtered.py | 10 +-- .../components/accordion/test_accordion.py | 18 ++-- .../busy_indicators/test_busy_indicators.py | 12 +-- .../components/card-input/test_card-input.py | 10 +-- .../data_view_info/test_df_data_view_info.py | 12 +-- .../data_frame/example/test_data_frame.py | 22 ++--- .../df_organization/test_df_organization.py | 18 ++-- .../html_columns_df/tabbing/test_tabbing.py | 4 +- .../html_columns_df/test_html_columns.py | 12 +-- .../row_selection/test_row_selection.py | 24 +++-- .../test_validate_column_labels.py | 6 +- .../test_validate_data_edit_mode.py | 4 +- .../test_validate_data_save.py | 4 +- .../shiny/components/nav/test_nav.py | 2 +- .../navset_hidden/test_nav_hidden.py | 6 +- .../shiny/components/popover/test_popover.py | 4 +- .../shiny/components/test_sidebar.py | 18 ++-- .../shiny/components/tooltip/test_tooltip.py | 4 +- .../value_box/kitchensink/test_valuebox_ks.py | 22 ++--- .../value_box/smoke/test_valuebox.py | 4 +- .../test_output_transformer_example.py | 10 +-- .../card/kitchensink/test_card_ks.py | 10 +-- .../shiny/experimental/card/test_card.py | 4 +- .../inputs/input_file/test_input_file.py | 10 +-- .../test_input_radio_checkbox_group_app.py | 24 ++--- .../input_slider/test_input_slider_app.py | 32 +++---- .../test_input_task_button.py | 16 ++-- .../test_input_task_button2.py | 14 +-- .../inputs/test_input_action_button_link.py | 12 +-- .../shiny/inputs/test_input_checkbox.py | 6 +- .../shiny/inputs/test_input_checkbox_group.py | 4 +- .../shiny/inputs/test_input_dark_mode.py | 14 +-- .../shiny/inputs/test_input_date.py | 22 ++--- .../shiny/inputs/test_input_date_range.py | 16 ++-- .../shiny/inputs/test_input_numeric.py | 10 +-- .../shiny/inputs/test_input_password.py | 12 +-- .../shiny/inputs/test_input_radio_buttons.py | 4 +- .../shiny/inputs/test_input_select.py | 4 +- .../shiny/inputs/test_input_selectize.py | 4 +- .../shiny/inputs/test_input_slider.py | 8 +- .../shiny/inputs/test_input_switch.py | 8 +- .../shiny/inputs/test_input_text.py | 10 +-- .../shiny/inputs/test_input_text_area.py | 16 ++-- .../shiny/inputs/test_inputs_update.py | 43 ++++----- .../test_module_conditional.py | 6 +- .../shiny/outputs/test_output_image.py | 4 +- .../shiny/outputs/test_output_plot.py | 4 +- .../shiny/outputs/test_output_table.py | 4 +- .../shiny/outputs/test_output_text.py | 10 +-- .../shiny/outputs/test_output_ui.py | 15 ++-- .../shiny/plot-sizing/test_plot_sizing.py | 4 +- .../test_output_transformer_async.py | 18 ++-- .../reactive_event/test_reactive_event.py | 12 +-- .../shiny/session/flush/test_on_flush.py | 12 +-- .../shiny/shiny-express/hold/test_hold.py | 4 +- 73 files changed, 393 insertions(+), 427 deletions(-) rename shiny/playwright/{controls => controller}/__init__.py (100%) rename shiny/playwright/{controls => controller}/_controls.py (100%) diff --git a/shiny/_template_utils.py b/shiny/_template_utils.py index 26e97d412..31189fe94 100644 --- a/shiny/_template_utils.py +++ b/shiny/_template_utils.py @@ -399,20 +399,20 @@ def path_does_not_exist(x: Path) -> bool | str: f"""\ from playwright.sync_api import Page -from shiny.playwright.controls import +from shiny.playwright import controller from shiny.run import ShinyAppProc def {test_name}(page: Page, local_app: ShinyAppProc): page.goto(local_app.url) - # Add tests code here + # Add test code here """ if is_same_dir else f"""\ from playwright.sync_api import Page -from shiny.playwright.controls import +from shiny.playwright import controller from shiny.pytest import create_app_fixture from shiny.run import ShinyAppProc @@ -422,7 +422,7 @@ def {test_name}(page: Page, local_app: ShinyAppProc): def {test_name}(page: Page, app: ShinyAppProc): page.goto(app.url) - # Add tests code here + # Add test code here """ ) # Make sure test file directory exists diff --git a/shiny/playwright/__init__.py b/shiny/playwright/__init__.py index bc6e14e21..d20bb93d2 100644 --- a/shiny/playwright/__init__.py +++ b/shiny/playwright/__init__.py @@ -23,6 +23,6 @@ ) except ImportError: pass -from . import controls, expect +from . import controller, expect -__all__ = ["expect", "controls"] +__all__ = ["expect", "controller"] diff --git a/shiny/playwright/controls/__init__.py b/shiny/playwright/controller/__init__.py similarity index 100% rename from shiny/playwright/controls/__init__.py rename to shiny/playwright/controller/__init__.py diff --git a/shiny/playwright/controls/_controls.py b/shiny/playwright/controller/_controls.py similarity index 100% rename from shiny/playwright/controls/_controls.py rename to shiny/playwright/controller/_controls.py diff --git a/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py b/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py index 175a2135d..5423e9c57 100644 --- a/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py +++ b/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py @@ -7,7 +7,7 @@ skip_if_not_chrome, ) -from shiny.playwright.controls import Accordion +from shiny.playwright import controller app_url = create_deploys_app_url_fixture("shiny_express_accordion") @@ -17,7 +17,7 @@ def test_express_accordion(page: Page, app_url: str) -> None: page.goto(app_url) - acc = Accordion(page, "express_accordion") + acc = controller.controller.Accordion(page, "express_accordion") acc_panel_2 = acc.accordion_panel("Panel 2") acc_panel_2.expect_open(True) acc_panel_2.expect_body("n = 50") 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 6db4a356f..51115566b 100644 --- a/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py +++ b/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py @@ -7,7 +7,7 @@ skip_if_not_chrome, ) -from shiny.playwright.controls import OutputDataFrame +from shiny.playwright import controller app_url = create_deploys_app_url_fixture("shiny-express-dataframe") @@ -17,5 +17,5 @@ def test_express_dataframe_deploys(page: Page, app_url: str) -> None: page.goto(app_url) - dataframe = OutputDataFrame(page, "sample_data_frame") + dataframe = controller.controller.OutputDataFrame(page, "sample_data_frame") dataframe.expect_n_row(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 4ce83ba51..56fb73e6b 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 @@ -7,7 +7,7 @@ skip_if_not_chrome, ) -from shiny.playwright.controls import NavsetTab +from shiny.playwright import controller TIMEOUT = 2 * 60 * 1000 @@ -26,12 +26,12 @@ 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 = NavsetTab(page, "express_navset_tab") + nav_html = controller.controller.NavsetTab(page, "express_navset_tab") nav_html.expect_content("pre 0pre 1pre 2") nav_html.set("div") nav_html.expect_content("div 0\ndiv 1\ndiv 2") nav_html.set("span") nav_html.expect_content("span 0span 1span 2") - navset_card_tab = NavsetTab(page, "express_navset_card_tab") + navset_card_tab = controller.controller.NavsetTab(page, "express_navset_card_tab") navset_card_tab.expect_content("") diff --git a/tests/playwright/deploys/express-page_fillable/test_deploys_express_page_fillable.py b/tests/playwright/deploys/express-page_fillable/test_deploys_express_page_fillable.py index cebd220f6..c528f8723 100644 --- a/tests/playwright/deploys/express-page_fillable/test_deploys_express_page_fillable.py +++ b/tests/playwright/deploys/express-page_fillable/test_deploys_express_page_fillable.py @@ -7,7 +7,7 @@ skip_if_not_chrome, ) -from shiny.playwright.controls import Card, OutputTextVerbatim +from shiny.playwright import controller app_url = create_deploys_app_url_fixture("express_page_fillable") @@ -17,8 +17,8 @@ def test_express_page_fillable(page: Page, app_url: str) -> None: page.goto(app_url) - card = Card(page, "card") - output_txt = OutputTextVerbatim(page, "txt") + card = controller.Card(page, "card") + output_txt = controller.OutputTextVerbatim(page, "txt") output_txt.expect_value("50") bounding_box = card.loc.bounding_box() assert bounding_box is not None diff --git a/tests/playwright/deploys/express-page_fluid/test_deploys_express_page_fluid.py b/tests/playwright/deploys/express-page_fluid/test_deploys_express_page_fluid.py index 9735d40a1..567e9da66 100644 --- a/tests/playwright/deploys/express-page_fluid/test_deploys_express_page_fluid.py +++ b/tests/playwright/deploys/express-page_fluid/test_deploys_express_page_fluid.py @@ -7,7 +7,7 @@ skip_if_not_chrome, ) -from shiny.playwright.controls import Card, OutputTextVerbatim +from shiny.playwright import controller app_url = create_deploys_app_url_fixture("express_page_fluid") @@ -17,8 +17,8 @@ def test_express_page_fluid(page: Page, app_url: str) -> None: page.goto(app_url) - card = Card(page, "card") - output_txt = OutputTextVerbatim(page, "txt") + card = controller.Card(page, "card") + output_txt = controller.OutputTextVerbatim(page, "txt") output_txt.expect_value("50") bounding_box = card.loc.bounding_box() assert bounding_box is not None diff --git a/tests/playwright/deploys/express-page_sidebar/test_deploys_express_page_sidebar.py b/tests/playwright/deploys/express-page_sidebar/test_deploys_express_page_sidebar.py index e4687916b..0fdfcb7fe 100644 --- a/tests/playwright/deploys/express-page_sidebar/test_deploys_express_page_sidebar.py +++ b/tests/playwright/deploys/express-page_sidebar/test_deploys_express_page_sidebar.py @@ -7,7 +7,7 @@ skip_if_not_chrome, ) -from shiny.playwright.controls import OutputTextVerbatim, Sidebar +from shiny.playwright import controller app_url = create_deploys_app_url_fixture("express_page_sidebar") @@ -17,7 +17,7 @@ def test_express_page_sidebar(page: Page, app_url: str) -> None: page.goto(app_url) - sidebar = Sidebar(page, "sidebar") + sidebar = controller.Sidebar(page, "sidebar") sidebar.expect_text("SidebarTitle Sidebar Content") - output_txt = OutputTextVerbatim(page, "txt") + output_txt = controller.OutputTextVerbatim(page, "txt") output_txt.expect_value("50") diff --git a/tests/playwright/shiny/async/test_async.py b/tests/playwright/shiny/async/test_async.py index f81ebc673..bbb9b60c4 100644 --- a/tests/playwright/shiny/async/test_async.py +++ b/tests/playwright/shiny/async/test_async.py @@ -3,26 +3,22 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import ( - InputActionButton, - InputTextArea, - OutputTextVerbatim, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_async_app(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - InputTextArea(page, "value").set("Hello\nGoodbye") - InputActionButton(page, "go").click() + controller.InputTextArea(page, "value").set("Hello\nGoodbye") + controller.InputActionButton(page, "go").click() # TODO-future; Make into proper class progress = page.locator("#shiny-notification-panel") expect(progress).to_be_visible() expect(progress).to_contain_text("Calculating...") - OutputTextVerbatim(page, "hash_output").expect_value( + controller.OutputTextVerbatim(page, "hash_output").expect_value( "2e220fb9d401bf832115305b9ae0277e7b8b1a9368c6526e450acd255e0ec0c2", timeout=2000 ) diff --git a/tests/playwright/shiny/bugs/0648-update-slider-datetime-value/test_update_slider_datetime_value.py b/tests/playwright/shiny/bugs/0648-update-slider-datetime-value/test_update_slider_datetime_value.py index a3fff9a92..3393313ab 100644 --- a/tests/playwright/shiny/bugs/0648-update-slider-datetime-value/test_update_slider_datetime_value.py +++ b/tests/playwright/shiny/bugs/0648-update-slider-datetime-value/test_update_slider_datetime_value.py @@ -4,7 +4,7 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputActionButton, InputSlider, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -16,9 +16,9 @@ def check_case( min: tuple[Optional[str], Optional[str]] = (None, None), max: tuple[Optional[str], Optional[str]] = (None, None), ): - slider_times = InputSlider(page, f"{id}-times") - btn_reset = InputActionButton(page, f"{id}-reset") - out_txt = OutputTextVerbatim(page, f"{id}-txt") + slider_times = controller.InputSlider(page, f"{id}-times") + btn_reset = controller.InputActionButton(page, f"{id}-reset") + out_txt = controller.OutputTextVerbatim(page, f"{id}-txt") if value[0] is not None: out_txt.expect_value(value[0]) diff --git a/tests/playwright/shiny/bugs/0666-sidebar/test_sidebar_colors.py b/tests/playwright/shiny/bugs/0666-sidebar/test_sidebar_colors.py index b32b7490d..d70ff6e4d 100644 --- a/tests/playwright/shiny/bugs/0666-sidebar/test_sidebar_colors.py +++ b/tests/playwright/shiny/bugs/0666-sidebar/test_sidebar_colors.py @@ -3,8 +3,8 @@ from colors import bg_color, fg_color from playwright.sync_api import Page, expect -from shiny.playwright.controls import Sidebar -from shiny.playwright.controls._controls import _expect_class_value +from shiny.playwright import controller +from shiny.playwright.controller._controls import _expect_class_value from shiny.run import ShinyAppProc @@ -38,7 +38,7 @@ def test_sidebar_bg_colors(page: Page, local_app: ShinyAppProc) -> None: expect(sidebar).to_have_css("background-color", bg_color) expect(sidebar).to_have_css("color", fg_color) - s1 = Sidebar(page, "s1") + s1 = controller.Sidebar(page, "s1") s1.expect_position("left") - s2 = Sidebar(page, "s2") + s2 = controller.Sidebar(page, "s2") s2.expect_position("right") 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 7fe3cd018..48e77aabe 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 @@ -2,7 +2,7 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputCode, OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -12,9 +12,9 @@ def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: # The purpose of this test is to make sure that the data grid can work on Pandas # data frames that use an index that is not simply 0-based integers. - grid = OutputDataFrame(page, "grid") - detail = OutputDataFrame(page, "detail") - selected_rows = OutputCode(page, "selected_rows") + grid = controller.OutputDataFrame(page, "grid") + detail = controller.OutputDataFrame(page, "detail") + selected_rows = controller.OutputCode(page, "selected_rows") grid.expect_cell("three", row=2, col=0) detail.expect_n_row(0) diff --git a/tests/playwright/shiny/bugs/0696-resolve-id/mod_state.py b/tests/playwright/shiny/bugs/0696-resolve-id/mod_state.py index c8ec56bfa..983b1b297 100644 --- a/tests/playwright/shiny/bugs/0696-resolve-id/mod_state.py +++ b/tests/playwright/shiny/bugs/0696-resolve-id/mod_state.py @@ -4,7 +4,7 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputTextVerbatim +from shiny.playwright import controller def expect_state( @@ -14,7 +14,7 @@ def expect_state( value: object, ): new_module_id = f"{module_id}-" if module_id else "" - OutputTextVerbatim( + controller.OutputTextVerbatim( page, f"{new_module_id}status_{key}", ).expect_value(f"ui.{key}: `{value}`") @@ -28,7 +28,7 @@ def expect_x_state( ): new_module_id = f"{module_id}-" if module_id else "" new_key = key.replace("x_", "") - OutputTextVerbatim( + controller.OutputTextVerbatim( page, f"{new_module_id}status_x_{new_key}", ).expect_value(f"x.ui.{new_key}: `{value}`") 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 e1d8fc972..421aa66f4 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 @@ -11,31 +11,7 @@ from playwright.sync_api import Page from shiny._utils import guess_mime_type -from shiny.playwright.controls import ( - DownloadButton, - DownloadLink, - InputActionButton, - InputActionLink, - InputCheckbox, - InputCheckboxGroup, - InputDate, - InputDateRange, - InputFile, - InputNumeric, - InputRadioButtons, - InputSelect, - InputSelectize, - InputSlider, - InputSwitch, - InputText, - InputTextArea, - OutputDataFrame, - OutputImage, - OutputTable, - OutputText, - OutputTextVerbatim, - OutputUi, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc img_path = Path(__file__).parent / "imgs" @@ -48,17 +24,17 @@ def resolve_id(id: str): return f"{module_id}-{id}" return id - dataframe = OutputDataFrame(page, resolve_id("out_data_frame")) + 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) - OutputText(page, resolve_id("out_text")).expect_value( + controller.OutputText(page, resolve_id("out_text")).expect_value( f"Output text content. `input.radio_buttons()`: `{letter}`" ) - OutputTextVerbatim(page, resolve_id("out_text_verbatim")).expect_value( + controller.OutputTextVerbatim(page, resolve_id("out_text_verbatim")).expect_value( f"Output text verbatim content. `input.radio_buttons()`: `{letter}`" ) - OutputTable(page, resolve_id("out_table")).expect_n_row(count + 1) + controller.OutputTable(page, resolve_id("out_table")).expect_n_row(count + 1) # Mirrors ImageTransformer implementation src = penguin_imgs[count] @@ -68,12 +44,12 @@ def resolve_id(id: str): content_type = guess_mime_type(src) img_src = f"data:{content_type};base64,{data_str}" # Done Mirror - OutputImage(page, resolve_id("out_image")).expect_img_src(img_src) + controller.OutputImage(page, resolve_id("out_image")).expect_img_src(img_src) # TODO-future; Test OutputPlot - # OutputPlot(page, resolve_id("out_plot")). + # controller.OutputPlot(page, resolve_id("out_plot")). - OutputUi(page, resolve_id("out_ui")).expect.to_have_text( + controller.OutputUi(page, resolve_id("out_ui")).expect.to_have_text( f"Output UI content. input.radio_buttons(): {letter}" ) @@ -84,23 +60,31 @@ def resolve_id(id: str): return f"{module_id}-{id}" return id - InputNumeric(page, resolve_id("input_numeric")).expect_label("Numeric") - InputText(page, resolve_id("input_text")).expect_label("Text") - InputTextArea(page, resolve_id("input_text_area")).expect_label("Text area") - InputSelect(page, resolve_id("input_select")).expect_label("Select") - InputSelectize(page, resolve_id("input_selectize")).expect_label("Selectize") - InputCheckbox(page, resolve_id("input_checkbox")).expect_label("Checkbox") - InputSwitch(page, resolve_id("input_switch")).expect_label("Switch") - InputCheckboxGroup(page, resolve_id("input_checkbox_group")).expect_label( - "Checkbox group" + controller.InputNumeric(page, resolve_id("input_numeric")).expect_label("Numeric") + controller.InputText(page, resolve_id("input_text")).expect_label("Text") + controller.InputTextArea(page, resolve_id("input_text_area")).expect_label( + "Text area" ) - InputRadioButtons(page, resolve_id("input_radio_buttons")).expect_label( + controller.InputSelect(page, resolve_id("input_select")).expect_label("Select") + controller.InputSelectize(page, resolve_id("input_selectize")).expect_label( + "Selectize" + ) + controller.InputCheckbox(page, resolve_id("input_checkbox")).expect_label( + "Checkbox" + ) + controller.InputSwitch(page, resolve_id("input_switch")).expect_label("Switch") + controller.InputCheckboxGroup( + page, resolve_id("input_checkbox_group") + ).expect_label("Checkbox group") + controller.InputRadioButtons(page, resolve_id("input_radio_buttons")).expect_label( "Radio buttons" ) - InputFile(page, resolve_id("input_file")).expect_label("File") - InputSlider(page, resolve_id("input_slider")).expect_label("Slider") - InputDate(page, resolve_id("input_date")).expect_label("Date") - InputDateRange(page, resolve_id("input_date_range")).expect_label("Date range") + controller.InputFile(page, resolve_id("input_file")).expect_label("File") + controller.InputSlider(page, resolve_id("input_slider")).expect_label("Slider") + controller.InputDate(page, resolve_id("input_date")).expect_label("Date") + controller.InputDateRange(page, resolve_id("input_date_range")).expect_label( + "Date range" + ) def expect_default_outputs(page: Page, module_id: str): @@ -120,13 +104,13 @@ def test_module_support(page: Page, local_app: ShinyAppProc) -> None: expect_labels(page, mod_id) # Click x3 `update_mod2` - update_mod2 = InputActionButton(page, "update_mod2") + update_mod2 = controller.InputActionButton(page, "update_mod2") for i in range(3): update_mod2.click() - InputActionButton(page, "mod2-input_action_button").click() - InputActionLink(page, "mod2-input_action_link").click() + controller.InputActionButton(page, "mod2-input_action_button").click() + controller.InputActionLink(page, "mod2-input_action_link").click() with page.expect_download() as download_button_info: - download_button = DownloadButton(page, "mod2-download_button") + download_button = controller.DownloadButton(page, "mod2-download_button") download_button.click() download = download_button_info.value # wait for download to complete @@ -136,7 +120,7 @@ def test_module_support(page: Page, local_app: ShinyAppProc) -> None: with open(download_path, "r") as f: assert f.read() == f"session,type,count\nmod2,button,{i + 1}\n" with page.expect_download() as download_link_info: - download_link = DownloadLink(page, "mod2-download_link") + download_link = controller.DownloadLink(page, "mod2-download_link") download_link.click() download = download_link_info.value # wait for download to complete @@ -146,7 +130,9 @@ def test_module_support(page: Page, local_app: ShinyAppProc) -> None: with open(download_path, "r") as f: assert f.read() == f"session,type,count\nmod2,link,{i + 1}\n" - InputFile(page, "mod2-input_file").set(Path(__file__).parent / "test_file.txt") + controller.InputFile(page, "mod2-input_file").set( + Path(__file__).parent / "test_file.txt" + ) # Make sure the global session and first module was not affected expect_default_mod_state(page, "") 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 ba13320f3..4b2f62812 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 @@ -2,16 +2,16 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputDataFrame, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - df = OutputDataFrame(page, "df1") - selected_rows = OutputTextVerbatim(page, "selected_rows") - cell_selection = OutputTextVerbatim(page, "cell_selection") + df = controller.OutputDataFrame(page, "df1") + selected_rows = controller.OutputTextVerbatim(page, "selected_rows") + cell_selection = controller.OutputTextVerbatim(page, "cell_selection") df.expect_n_row(3) selected_rows.expect_value("Input selected 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 036e140b5..52fd89cfd 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 @@ -2,21 +2,17 @@ from playwright.sync_api import Page -from shiny.playwright.controls import ( - InputActionButton, - OutputDataFrame, - OutputTextVerbatim, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - df = OutputDataFrame(page, "df1") - add_row = InputActionButton(page, "add_row") - clear_table = InputActionButton(page, "clear_table") - selected_rows = OutputTextVerbatim(page, "number_of_selected_rows") + df = controller.OutputDataFrame(page, "df1") + add_row = controller.InputActionButton(page, "add_row") + clear_table = controller.InputActionButton(page, "clear_table") + selected_rows = controller.OutputTextVerbatim(page, "number_of_selected_rows") df.expect_n_row(0) selected_rows.expect_value("Selected rows: 0") 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 92d934bc6..51ae0846d 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 @@ -4,20 +4,20 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import OutputCode, OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_row_selection(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - my_df = OutputDataFrame(page, "my_df") - selected_df = OutputDataFrame(page, "selected_df") - selected_rows = OutputCode(page, "selected_rows") + my_df = controller.OutputDataFrame(page, "my_df") + selected_df = controller.OutputDataFrame(page, "selected_df") + selected_rows = controller.OutputCode(page, "selected_rows") # TODO-karan-test: We should add a locator for selected rows # TODO-karan-test; We should add a expected selected row count method? - def expect_selected_count(x: OutputDataFrame, n: int) -> 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) diff --git a/tests/playwright/shiny/components/accordion/test_accordion.py b/tests/playwright/shiny/components/accordion/test_accordion.py index f5895056d..27cfdb6eb 100644 --- a/tests/playwright/shiny/components/accordion/test_accordion.py +++ b/tests/playwright/shiny/components/accordion/test_accordion.py @@ -2,7 +2,7 @@ from examples.example_apps import reruns, reruns_delay from playwright.sync_api import Page -from shiny.playwright.controls import Accordion, InputActionButton, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -10,15 +10,15 @@ def test_accordion(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - acc = Accordion(page, "acc") + acc = controller.Accordion(page, "acc") acc_panel_A = acc.accordion_panel("Section A") - output_txt_verbatim = OutputTextVerbatim(page, "acc_txt") - alternate_button = InputActionButton(page, "alternate") - open_all_button = InputActionButton(page, "open_all") - close_all_button = InputActionButton(page, "close_all") - toggle_b_button = InputActionButton(page, "toggle_b") - toggle_updates_button = InputActionButton(page, "toggle_updates") - toggle_efg_button = InputActionButton(page, "toggle_efg") + output_txt_verbatim = controller.OutputTextVerbatim(page, "acc_txt") + alternate_button = controller.InputActionButton(page, "alternate") + open_all_button = controller.InputActionButton(page, "open_all") + close_all_button = controller.InputActionButton(page, "close_all") + toggle_b_button = controller.InputActionButton(page, "toggle_b") + toggle_updates_button = controller.InputActionButton(page, "toggle_updates") + toggle_efg_button = controller.InputActionButton(page, "toggle_efg") output_txt_verbatim.expect_value("input.acc(): ('Section A',)") diff --git a/tests/playwright/shiny/components/busy_indicators/test_busy_indicators.py b/tests/playwright/shiny/components/busy_indicators/test_busy_indicators.py index 12347fb03..ffb1f48e0 100644 --- a/tests/playwright/shiny/components/busy_indicators/test_busy_indicators.py +++ b/tests/playwright/shiny/components/busy_indicators/test_busy_indicators.py @@ -3,11 +3,7 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import ( - InputRadioButtons, - InputTaskButton, - OutputTextVerbatim, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -29,8 +25,8 @@ def get_pulse_computed_property(page: Page, property_name: str) -> str: def test_busy_indicators(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - spinner_type = InputRadioButtons(page, "busy_indicator_type") - render_button = InputTaskButton(page, "rerender") + spinner_type = controller.InputRadioButtons(page, "busy_indicator_type") + render_button = controller.InputTaskButton(page, "rerender") # Verify spinner indicator behavior spinner_properties = [ @@ -51,7 +47,7 @@ def test_busy_indicators(page: Page, local_app: ShinyAppProc) -> None: assert get_spinner_computed_property(page, element_id, "width") == height # Verify pulse indicator behavior - output_txt = OutputTextVerbatim(page, "counter") + output_txt = controller.OutputTextVerbatim(page, "counter") output_txt.expect_value("0") spinner_type.set("pulse") render_button.click() diff --git a/tests/playwright/shiny/components/card-input/test_card-input.py b/tests/playwright/shiny/components/card-input/test_card-input.py index 7b14da909..8311c9470 100644 --- a/tests/playwright/shiny/components/card-input/test_card-input.py +++ b/tests/playwright/shiny/components/card-input/test_card-input.py @@ -3,7 +3,7 @@ import pytest from playwright.sync_api import Page -from shiny.playwright.controls import Card, OutputCode, ValueBox +from shiny.playwright import controller from shiny.run import ShinyAppProc, run_shiny_app @@ -21,10 +21,10 @@ def test_card_input(page: Page, app_path: str, sel_card: str, sel_vb: str) -> No page.goto(sa.url) - card = Card(page, sel_card) - vb = ValueBox(page, sel_vb) - out_card = OutputCode(page, "out_card") - out_vb = OutputCode(page, "out_value_box") + card = controller.Card(page, sel_card) + vb = controller.ValueBox(page, sel_vb) + out_card = controller.OutputCode(page, "out_card") + out_vb = controller.OutputCode(page, "out_value_box") # Open and close card full screen, check input value ------ card.expect_full_screen(False) diff --git a/tests/playwright/shiny/components/data_frame/data_view_info/test_df_data_view_info.py b/tests/playwright/shiny/components/data_frame/data_view_info/test_df_data_view_info.py index bcf07a58b..693bc6e0b 100644 --- a/tests/playwright/shiny/components/data_frame/data_view_info/test_df_data_view_info.py +++ b/tests/playwright/shiny/components/data_frame/data_view_info/test_df_data_view_info.py @@ -1,18 +1,18 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputDataFrame, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - data_frame = OutputDataFrame(page, "testing-penguins_df") + data_frame = controller.OutputDataFrame(page, "testing-penguins_df") - sort = OutputTextVerbatim(page, "testing-sort") - filter = OutputTextVerbatim(page, "testing-filter") - rows = OutputTextVerbatim(page, "testing-rows") - selected_rows = OutputTextVerbatim(page, "testing-selected_rows") + sort = controller.OutputTextVerbatim(page, "testing-sort") + filter = controller.OutputTextVerbatim(page, "testing-filter") + rows = controller.OutputTextVerbatim(page, "testing-rows") + selected_rows = controller.OutputTextVerbatim(page, "testing-selected_rows") sort.expect_value("()") filter.expect_value("()") 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 cc2c4b32e..6038e8550 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 @@ -9,7 +9,7 @@ from examples.example_apps import reruns, reruns_delay from playwright.sync_api import Locator, Page, expect -from shiny.playwright.controls import InputSelect, InputSwitch +from shiny.playwright import controller from shiny.playwright.expect import expect_to_change from shiny.run import ShinyAppProc @@ -94,13 +94,13 @@ def get_width() -> float: width1 = get_width() # Switch to narrow mode with expect_to_change(get_width): - InputSwitch(page, "fullwidth").toggle() + controller.InputSwitch(page, "fullwidth").toggle() width2 = get_width() assert width2 < width1 # Switch back to full width - InputSwitch(page, "fullwidth").toggle() + controller.InputSwitch(page, "fullwidth").toggle() @pytest.mark.flaky(reruns=reruns, delay=reruns_delay) @@ -113,12 +113,12 @@ def test_table_switch( scroll_to_end: Callable[[], None], ): page.goto(data_frame_app.url) - select_dataset = InputSelect(page, "dataset") + select_dataset = controller.InputSelect(page, "dataset") scroll_to_end() # Switch to table - 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")) @@ -143,7 +143,7 @@ def test_sort( grid_container: Locator, ): page.goto(data_frame_app.url) - select_dataset = InputSelect(page, "dataset") + select_dataset = controller.InputSelect(page, "dataset") select_dataset.set("diamonds") select_dataset.expect.to_have_value("diamonds") @@ -181,7 +181,7 @@ def test_multi_selection( snapshot: Any, ): page.goto(data_frame_app.url) - InputSelect(page, "selection_mode").set("rows") + controller.InputSelect(page, "selection_mode").set("rows") first_cell = grid_container.locator("tbody tr:first-child td:first-child") def detail_text(): @@ -215,7 +215,7 @@ def test_single_selection( snapshot: Any, ): page.goto(data_frame_app.url) - InputSelect(page, "selection_mode").set("row") + controller.InputSelect(page, "selection_mode").set("row") first_cell = grid_container.locator("tbody tr:first-child td:first-child") def detail_text(): @@ -262,7 +262,7 @@ def test_filter_table( ): page.goto(data_frame_app.url) - 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")) @@ -355,7 +355,7 @@ def _filter_test_impl( expect(grid.locator("tbody tr")).to_have_count(5) # Ensure changing dataset resets filters - select_dataset = InputSelect(page, "dataset") + select_dataset = controller.InputSelect(page, "dataset") select_dataset.set("attention") select_dataset.expect.to_have_value("attention") expect(page.get_by_text("Unnamed: 0")).to_be_attached() @@ -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() - 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/html_columns_df/df_organization/test_df_organization.py b/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py index fd4d070ef..6a2f328ee 100644 --- a/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py +++ b/tests/playwright/shiny/components/data_frame/html_columns_df/df_organization/test_df_organization.py @@ -1,17 +1,17 @@ from playwright.sync_api import Page -from shiny.playwright.controls import InputActionButton, OutputCode, OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_dataframe_organization_methods(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - data_frame = OutputDataFrame(page, "iris_df") - data_view_rows = OutputCode(page, "data_view_rows") - data_view_selected_true = OutputCode(page, "data_view_selected_true") - data_view_selected_false = OutputCode(page, "data_view_selected_false") - cell_selection = OutputCode(page, "cell_selection") - reset_df = InputActionButton(page, "reset_df") + data_frame = controller.OutputDataFrame(page, "iris_df") + data_view_rows = controller.OutputCode(page, "data_view_rows") + data_view_selected_true = controller.OutputCode(page, "data_view_selected_true") + data_view_selected_false = controller.OutputCode(page, "data_view_selected_false") + cell_selection = controller.OutputCode(page, "cell_selection") + reset_df = controller.InputActionButton(page, "reset_df") def reset_data_frame(): reset_df.click() @@ -61,7 +61,7 @@ def reset_data_frame(): cell_selection.expect_value("()") # filter programmatically reset_data_frame() - InputActionButton(page, "update_filter").click() + controller.InputActionButton(page, "update_filter").click() data_view_rows.expect_value("(3, 4, 5)") data_view_selected_true.expect_value("[]") data_view_selected_false.expect_value("[ 51 100 101]") @@ -84,7 +84,7 @@ def reset_data_frame(): reset_data_frame() # sort columns programmatically - InputActionButton(page, "update_sort").click() + controller.InputActionButton(page, "update_sort").click() data_view_rows.expect_value("(0, 4, 3, 2, 1, 5)") data_view_selected_true.expect_value("[]") data_view_selected_false.expect_value("[ 0 100 51 50 1 101]") 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 e3e9afe6f..106c75ead 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 @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - data_frame = OutputDataFrame(page, "iris_df") + 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") 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 7750c903e..70ce93c74 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 @@ -1,22 +1,18 @@ from playwright.sync_api import Page -from shiny.playwright.controls import ( - InputActionButton, - OutputDataFrame, - OutputTextVerbatim, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_validate_html_columns(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - data_frame = OutputDataFrame(page, "penguins_df") + data_frame = controller.OutputDataFrame(page, "penguins_df") # verify shiny reactive output UI in cell - output_txt = OutputTextVerbatim(page, "test_cell_text") + output_txt = controller.OutputTextVerbatim(page, "test_cell_text") output_txt.expect_value("test_cell_value 0") - test_button = InputActionButton(page, "test_cell_button") + test_button = controller.InputActionButton(page, "test_cell_button") test_button.click() output_txt.expect_value("test_cell_value 1") diff --git a/tests/playwright/shiny/components/data_frame/row_selection/test_row_selection.py b/tests/playwright/shiny/components/data_frame/row_selection/test_row_selection.py index b1020a04a..824b2e610 100644 --- a/tests/playwright/shiny/components/data_frame/row_selection/test_row_selection.py +++ b/tests/playwright/shiny/components/data_frame/row_selection/test_row_selection.py @@ -1,27 +1,33 @@ from playwright.sync_api import Page -from shiny.playwright.controls import InputActionButton, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def expect_row_selection(page: Page, prefix_main: str, prefix_secondary: str): # TODO: Karan, add Dataframe helpers methods for selected_rows - main_txt_rows = OutputTextVerbatim(page, f"{prefix_main}selected_rows") - other_txt_rows = OutputTextVerbatim(page, f"{prefix_secondary}selected_rows") + main_txt_rows = controller.OutputTextVerbatim(page, f"{prefix_main}selected_rows") + other_txt_rows = controller.OutputTextVerbatim( + page, f"{prefix_secondary}selected_rows" + ) - main_selected_row_count = OutputTextVerbatim( + main_selected_row_count = controller.OutputTextVerbatim( page, f"{prefix_main}selected_row_count" ) - other_selected_row_count = OutputTextVerbatim( + other_selected_row_count = controller.OutputTextVerbatim( page, f"{prefix_secondary}selected_row_count" ) - main_grid_row_count = OutputTextVerbatim(page, f"{prefix_main}grid_row_count") - other_grid_row_count = OutputTextVerbatim(page, f"{prefix_secondary}grid_row_count") + main_grid_row_count = controller.OutputTextVerbatim( + page, f"{prefix_main}grid_row_count" + ) + other_grid_row_count = controller.OutputTextVerbatim( + page, f"{prefix_secondary}grid_row_count" + ) - main_select_btn = InputActionButton(page, f"{prefix_main}select") - main_clear_btn = InputActionButton(page, f"{prefix_main}clear") + main_select_btn = controller.InputActionButton(page, f"{prefix_main}select") + main_clear_btn = controller.InputActionButton(page, f"{prefix_main}clear") main_txt_rows.expect_value("()") other_txt_rows.expect_value("()") diff --git a/tests/playwright/shiny/components/data_frame/validate_column_labels/test_validate_column_labels.py b/tests/playwright/shiny/components/data_frame/validate_column_labels/test_validate_column_labels.py index ca3424cc0..39c166f27 100644 --- a/tests/playwright/shiny/components/data_frame/validate_column_labels/test_validate_column_labels.py +++ b/tests/playwright/shiny/components/data_frame/validate_column_labels/test_validate_column_labels.py @@ -1,14 +1,14 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_validate_column_labels(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - w_filters = OutputDataFrame(page, "w_filters") - wo_filters = OutputDataFrame(page, "wo_filters") + w_filters = controller.OutputDataFrame(page, "w_filters") + wo_filters = controller.OutputDataFrame(page, "wo_filters") ex_labels = [ "Sample Number", 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 fcd4a864f..ceea2bfc7 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 @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - data_frame = OutputDataFrame(page, "penguins_df") + data_frame = controller.OutputDataFrame(page, "penguins_df") data_frame.expect_column_labels( [ "studyName", 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 0b9e74bf5..0c333c1d7 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 @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputDataFrame +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_validate_data_edit_mode(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - data_frame = OutputDataFrame(page, "penguins_df") + data_frame = controller.OutputDataFrame(page, "penguins_df") data_frame.save_cell("Study0708_edited", row=1, col=1, save_key="Enter") 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/nav/test_nav.py b/tests/playwright/shiny/components/nav/test_nav.py index 1d4cdf241..e764e12bb 100644 --- a/tests/playwright/shiny/components/nav/test_nav.py +++ b/tests/playwright/shiny/components/nav/test_nav.py @@ -4,7 +4,7 @@ from playwright.sync_api import Page -from shiny.playwright.controls import ( +from shiny.playwright.controller import ( NavsetBar, NavsetCardPill, NavsetCardTab, 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 978a9ac0d..6d0a61516 100644 --- a/tests/playwright/shiny/components/navset_hidden/test_nav_hidden.py +++ b/tests/playwright/shiny/components/navset_hidden/test_nav_hidden.py @@ -1,7 +1,7 @@ # import pytest from playwright.sync_api import Page -from shiny.playwright.controls import InputRadioButtons, NavsetHidden +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -9,8 +9,8 @@ def test_navset_hidden(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) # navset_hidden - navset_hidden = NavsetHidden(page, "hidden_tabs") - input_radio_buttons = InputRadioButtons(page, "controller") + 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") input_radio_buttons.set("2") diff --git a/tests/playwright/shiny/components/popover/test_popover.py b/tests/playwright/shiny/components/popover/test_popover.py index ada43e906..61cfbf47e 100644 --- a/tests/playwright/shiny/components/popover/test_popover.py +++ b/tests/playwright/shiny/components/popover/test_popover.py @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import Popover +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_popover(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - popover = Popover(page, "popover_id") + popover = controller.Popover(page, "popover_id") popover.expect_active(False) popover.set(True) popover.expect_active(True) diff --git a/tests/playwright/shiny/components/test_sidebar.py b/tests/playwright/shiny/components/test_sidebar.py index d902d530d..cc2520f96 100644 --- a/tests/playwright/shiny/components/test_sidebar.py +++ b/tests/playwright/shiny/components/test_sidebar.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import OutputTextVerbatim, Sidebar +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("sidebar") @@ -10,8 +10,8 @@ def test_sidebar_position_and_open(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - left_sidebar = Sidebar(page, "sidebar_left") - output_txt_left = OutputTextVerbatim(page, "state_left") + left_sidebar = controller.Sidebar(page, "sidebar_left") + output_txt_left = controller.OutputTextVerbatim(page, "state_left") left_sidebar.set(True) output_txt_left.expect_value("input.sidebar_left(): True") left_sidebar.expect_open(True) @@ -24,8 +24,8 @@ def test_sidebar_position_and_open(page: Page, app: ShinyAppProc) -> None: left_sidebar.expect_open(True) output_txt_left.expect_value("input.sidebar_left(): True") - right_sidebar = Sidebar(page, "sidebar_right") - output_txt_right = OutputTextVerbatim(page, "state_right") + right_sidebar = controller.Sidebar(page, "sidebar_right") + output_txt_right = controller.OutputTextVerbatim(page, "state_right") right_sidebar.expect_text("Right sidebar content") output_txt_right.expect_value("input.sidebar_right(): True") right_sidebar.expect_handle(True) @@ -34,8 +34,8 @@ def test_sidebar_position_and_open(page: Page, app: ShinyAppProc) -> None: right_sidebar.expect_open(False) output_txt_right.expect_value("input.sidebar_right(): False") - closed_sidebar = Sidebar(page, "sidebar_closed") - output_txt_closed = OutputTextVerbatim(page, "state_closed") + closed_sidebar = controller.Sidebar(page, "sidebar_closed") + output_txt_closed = controller.OutputTextVerbatim(page, "state_closed") output_txt_closed.expect_value("input.sidebar_closed(): False") closed_sidebar.expect_handle(True) closed_sidebar.expect_open(False) @@ -44,8 +44,8 @@ def test_sidebar_position_and_open(page: Page, app: ShinyAppProc) -> None: closed_sidebar.expect_open(True) output_txt_closed.expect_value("input.sidebar_closed(): True") - always_sidebar = Sidebar(page, "sidebar_always") - output_txt_always = OutputTextVerbatim(page, "state_always") + always_sidebar = controller.Sidebar(page, "sidebar_always") + output_txt_always = controller.OutputTextVerbatim(page, "state_always") always_sidebar.expect_text("Always sidebar content") output_txt_always.expect_value("input.sidebar_always(): True") # Handle is included but it should have `display: none` diff --git a/tests/playwright/shiny/components/tooltip/test_tooltip.py b/tests/playwright/shiny/components/tooltip/test_tooltip.py index c8f33bbf1..b568fd4c5 100644 --- a/tests/playwright/shiny/components/tooltip/test_tooltip.py +++ b/tests/playwright/shiny/components/tooltip/test_tooltip.py @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import Tooltip +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_tooltip(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - tooltip = Tooltip(page, "tooltip_id") + tooltip = controller.Tooltip(page, "tooltip_id") tooltip.expect_active(False) tooltip.set(True) tooltip.expect_active(True) diff --git a/tests/playwright/shiny/components/value_box/kitchensink/test_valuebox_ks.py b/tests/playwright/shiny/components/value_box/kitchensink/test_valuebox_ks.py index 16fb9b07a..d49b58722 100644 --- a/tests/playwright/shiny/components/value_box/kitchensink/test_valuebox_ks.py +++ b/tests/playwright/shiny/components/value_box/kitchensink/test_valuebox_ks.py @@ -1,25 +1,25 @@ from playwright.sync_api import Page -from shiny.playwright.controls import ValueBox -from shiny.playwright.controls._controls import expect_to_have_class +from shiny.playwright import controller +from shiny.playwright.controller._controls import expect_to_have_class from shiny.run import ShinyAppProc -def get_value_box_bg_color(value_box: ValueBox) -> str: +def get_value_box_bg_color(value_box: controller.ValueBox) -> str: value_box_bg_color = value_box.loc_container.evaluate( "el => window.getComputedStyle(el).getPropertyValue('background-color');" ) return value_box_bg_color -def get_value_box_fg_color(value_box: ValueBox) -> str: +def get_value_box_fg_color(value_box: controller.ValueBox) -> str: value_box_fg_color = value_box.loc_container.evaluate( "el => window.getComputedStyle(el).getPropertyValue('color');" ) return value_box_fg_color -def get_title_tag_name(value_box: ValueBox) -> str: +def get_title_tag_name(value_box: controller.ValueBox) -> str: title_tag_name = ( value_box.loc_title.locator("*") .nth(0) @@ -28,7 +28,7 @@ def get_title_tag_name(value_box: ValueBox) -> str: return title_tag_name -def get_value_tag_name(value_box: ValueBox) -> str: +def get_value_tag_name(value_box: controller.ValueBox) -> str: value_tag_name = ( value_box.loc.locator("*").nth(0).evaluate("el => el.tagName.toLowerCase()") ) @@ -49,7 +49,7 @@ def get_value_tag_name(value_box: ValueBox) -> str: def test_valuebox(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - value_box1 = ValueBox(page, "valuebox1") + value_box1 = controller.ValueBox(page, "valuebox1") value_box1.expect_height(None) # verify showcase layout uses 'showcase_top_right()' expect_to_have_class(value_box1.loc_container, "showcase-top-right") @@ -67,7 +67,7 @@ def test_valuebox(page: Page, local_app: ShinyAppProc) -> None: value_box1.close_full_screen() value_box1.expect_full_screen(False) - value_box2 = ValueBox(page, "valuebox2") + value_box2 = controller.ValueBox(page, "valuebox2") value_box2.expect_height(None) # verify showcase layout uses 'showcase_left_center()' expect_to_have_class(value_box2.loc_container, "showcase-left-center") @@ -78,7 +78,7 @@ def test_valuebox(page: Page, local_app: ShinyAppProc) -> None: assert get_value_box_bg_color(value_box2) == "rgb(0, 123, 194)" value_box2.expect_full_screen_available(False) - value_box3 = ValueBox(page, "valuebox3") + value_box3 = controller.ValueBox(page, "valuebox3") value_box3.expect_height(None) # verify showcase layout uses 'showcase_bottom()' expect_to_have_class(value_box3.loc_container, "showcase-bottom") @@ -89,7 +89,7 @@ def test_valuebox(page: Page, local_app: ShinyAppProc) -> None: value_box3.expect_full_screen_available(True) assert get_value_box_bg_color(value_box3) == "rgb(255, 255, 255)" - value_box4 = ValueBox(page, "valuebox4") + value_box4 = controller.ValueBox(page, "valuebox4") value_box4.expect_height(None) value_box4.expect_title("No showcase - w/o Fullscreen (default)") value_box4.expect_value("No theme - only defaults") @@ -98,7 +98,7 @@ def test_valuebox(page: Page, local_app: ShinyAppProc) -> None: value_box4.expect_full_screen_available(False) assert get_value_box_bg_color(value_box4) == "rgb(255, 255, 255)" - value_box5 = ValueBox(page, "valuebox5") + value_box5 = controller.ValueBox(page, "valuebox5") value_box5.expect_height("500px") assert get_title_tag_name(value_box5) == "p" value_box5.expect_title("No showcase w/ showcase layout") diff --git a/tests/playwright/shiny/components/value_box/smoke/test_valuebox.py b/tests/playwright/shiny/components/value_box/smoke/test_valuebox.py index c2715289a..3eaa07e0e 100644 --- a/tests/playwright/shiny/components/value_box/smoke/test_valuebox.py +++ b/tests/playwright/shiny/components/value_box/smoke/test_valuebox.py @@ -1,7 +1,7 @@ import pytest from playwright.sync_api import Page -from shiny.playwright.controls import ValueBox +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -9,7 +9,7 @@ def test_valuebox(page: Page, local_app: ShinyAppProc, value_box_id: str) -> None: page.goto(local_app.url) - value_box = ValueBox(page, value_box_id) + value_box = controller.ValueBox(page, value_box_id) value_box.expect_full_screen(False) value_box.open_full_screen() value_box.expect_full_screen(True) diff --git a/tests/playwright/shiny/deprecated/output_transformer/test_output_transformer_example.py b/tests/playwright/shiny/deprecated/output_transformer/test_output_transformer_example.py index 8f0a50874..c3391946a 100644 --- a/tests/playwright/shiny/deprecated/output_transformer/test_output_transformer_example.py +++ b/tests/playwright/shiny/deprecated/output_transformer/test_output_transformer_example.py @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_output_image_kitchen(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - OutputTextVerbatim(page, "no_output").expect_value("DATA SUMMARY") - OutputTextVerbatim(page, "no_parens").expect_value("DATA SUMMARY") - OutputTextVerbatim(page, "to_upper").expect_value("DATA SUMMARY") - OutputTextVerbatim(page, "to_lower").expect_value("data summary") + controller.OutputTextVerbatim(page, "no_output").expect_value("DATA SUMMARY") + controller.OutputTextVerbatim(page, "no_parens").expect_value("DATA SUMMARY") + controller.OutputTextVerbatim(page, "to_upper").expect_value("DATA SUMMARY") + controller.OutputTextVerbatim(page, "to_lower").expect_value("data summary") diff --git a/tests/playwright/shiny/experimental/card/kitchensink/test_card_ks.py b/tests/playwright/shiny/experimental/card/kitchensink/test_card_ks.py index 276c9df10..b62071077 100644 --- a/tests/playwright/shiny/experimental/card/kitchensink/test_card_ks.py +++ b/tests/playwright/shiny/experimental/card/kitchensink/test_card_ks.py @@ -1,10 +1,10 @@ from playwright.sync_api import Page -from shiny.playwright.controls import Card +from shiny.playwright import controller from shiny.run import ShinyAppProc -def get_body_tag_name(card: Card) -> str: +def get_body_tag_name(card: controller.Card) -> str: body_tag_name = ( card.loc_body.locator("*").nth(0).evaluate("el => el.tagName.toLowerCase()") ) @@ -23,7 +23,7 @@ def get_body_tag_name(card: Card) -> str: def test_card_kitchensink(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - card = Card(page, "card1") + card = controller.Card(page, "card1") card.expect_max_height(None) card.expect_min_height(None) card.expect_height(None) @@ -40,7 +40,7 @@ def test_card_kitchensink(page: Page, local_app: ShinyAppProc) -> None: card.close_full_screen() card.expect_full_screen(False) - card = Card(page, "card2") + card = controller.Card(page, "card2") card.expect_max_height(None) card.expect_min_height(None) card.expect_height(None) @@ -53,7 +53,7 @@ def test_card_kitchensink(page: Page, local_app: ShinyAppProc) -> None: card.expect_full_screen(False) card.expect_full_screen_available(False) - card = Card(page, "card3") + card = controller.Card(page, "card3") card.expect_max_height("500px") card.expect_min_height("200px") card.expect_header("Fill is False. Fullscreen is False") diff --git a/tests/playwright/shiny/experimental/card/test_card.py b/tests/playwright/shiny/experimental/card/test_card.py index cc18b137e..880a664ff 100644 --- a/tests/playwright/shiny/experimental/card/test_card.py +++ b/tests/playwright/shiny/experimental/card/test_card.py @@ -1,13 +1,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import Card +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_card(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - card = Card(page, "card1") + card = controller.Card(page, "card1") card.expect_max_height(None) card.expect_min_height(None) card.expect_height(None) 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 5972d8899..8cee7aef7 100644 --- a/tests/playwright/shiny/inputs/input_file/test_input_file.py +++ b/tests/playwright/shiny/inputs/input_file/test_input_file.py @@ -2,14 +2,14 @@ from playwright.sync_api import FilePayload, Page, expect -from shiny.playwright.controls import InputFile, OutputTable, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_input_file_kitchen(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - file1 = InputFile(page, "file1") + file1 = controller.InputFile(page, "file1") expect(file1.loc_label).to_have_text("Choose CSV File") expect(file1.loc_button).to_have_text("Browse...") @@ -38,15 +38,15 @@ def test_input_file_kitchen(page: Page, local_app: ShinyAppProc) -> None: file1.expect_complete() - output_table = OutputTable(page, "summary") + output_table = controller.OutputTable(page, "summary") output_table.expect_column_labels(["Row Count", "Column Count", "Column Names"]) output_table.expect_n_row(1) - file2 = InputFile(page, "file2") + file2 = controller.InputFile(page, "file2") file2.set([file_info, file_info2]) expect(file2.loc_file_display).to_have_value("2 files") - OutputTextVerbatim(page, "file2_info").expect_value( + controller.OutputTextVerbatim(page, "file2_info").expect_value( """File name: mtcars.csv File type: text/csv File size: 129 bytes diff --git a/tests/playwright/shiny/inputs/input_radio_checkbox_group/test_input_radio_checkbox_group_app.py b/tests/playwright/shiny/inputs/input_radio_checkbox_group/test_input_radio_checkbox_group_app.py index c7e1a1226..384aa15bb 100644 --- a/tests/playwright/shiny/inputs/input_radio_checkbox_group/test_input_radio_checkbox_group_app.py +++ b/tests/playwright/shiny/inputs/input_radio_checkbox_group/test_input_radio_checkbox_group_app.py @@ -2,21 +2,21 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputCheckboxGroup, InputRadioButtons -from shiny.playwright.controls._controls import PatternOrStr +from shiny.playwright import controller +from shiny.playwright.controller._controls import PatternOrStr from shiny.run import ShinyAppProc def test_input_checkbox_group_kitchen(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - radio1 = InputRadioButtons(page, "radio1") - radio2 = InputRadioButtons(page, "radio2") - check1 = InputCheckboxGroup(page, "check1") - check2 = InputCheckboxGroup(page, "check2") + radio1 = controller.InputRadioButtons(page, "radio1") + radio2 = controller.InputRadioButtons(page, "radio2") + check1 = controller.InputCheckboxGroup(page, "check1") + check2 = controller.InputCheckboxGroup(page, "check2") def assert_radio_check( - x: InputRadioButtons | InputCheckboxGroup, + x: controller.InputRadioButtons | controller.InputCheckboxGroup, label: str, choices: list[PatternOrStr], choice_labels: list[PatternOrStr], @@ -27,7 +27,7 @@ def assert_radio_check( x.expect_label(label) x.expect_choices(choices) x.expect_choice_labels(choice_labels) - if isinstance(x, InputRadioButtons): + if isinstance(x, controller.InputRadioButtons): if not isinstance(selected, str): raise TypeError("selected must be a string for radio buttons") x.expect_selected(selected) @@ -90,13 +90,13 @@ def test_locator_debugging(page: Page, local_app: ShinyAppProc) -> None: # Non-existent div try: - not_exist = InputRadioButtons(page, "does-not-exist") + not_exist = controller.InputRadioButtons(page, "does-not-exist") not_exist.expect_choices(["a", "b", "c"], timeout=timeout) except AssertionError as e: assert "expected to have count '1'" in str(e) assert "Actual value: 0" in str(e) - check1 = InputCheckboxGroup(page, "check1") + check1 = controller.InputCheckboxGroup(page, "check1") # Make sure it works check1.expect_choices(["red", "green", "blue"]) @@ -127,13 +127,13 @@ def test_locator_existance(page: Page, local_app: ShinyAppProc) -> None: # Non-existent div try: - not_exist = InputCheckboxGroup(page, "does-not-exist") + not_exist = controller.InputCheckboxGroup(page, "does-not-exist") not_exist.set(["green"], timeout=timeout) except AssertionError as e: assert "expected to have count '1'" in str(e) assert "Actual value: 0" in str(e) - check1 = InputCheckboxGroup(page, "check1") + check1 = controller.InputCheckboxGroup(page, "check1") # Make sure it works check1.set([]) diff --git a/tests/playwright/shiny/inputs/input_slider/test_input_slider_app.py b/tests/playwright/shiny/inputs/input_slider/test_input_slider_app.py index 1a0ba1a5d..a8d288574 100644 --- a/tests/playwright/shiny/inputs/input_slider/test_input_slider_app.py +++ b/tests/playwright/shiny/inputs/input_slider/test_input_slider_app.py @@ -3,7 +3,7 @@ from playwright.sync_api import Page -from shiny.playwright.controls import InputSlider, InputSliderRange, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc from shiny.types import MISSING @@ -11,7 +11,7 @@ def test_slider_regular(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - s0 = InputSlider(page, "s0") + s0 = controller.InputSlider(page, "s0") s0.expect_label("Integer") s0.expect_value("500") s0.expect_min("0") @@ -25,18 +25,18 @@ def test_slider_regular(page: Page, local_app: ShinyAppProc) -> None: s0.expect_timezone(None) s0.expect_drag_range(None) s0.expect_animate(exists=False) - OutputTextVerbatim(page, "txt0").expect_value("500") + controller.OutputTextVerbatim(page, "txt0").expect_value("500") new_val = "20" s0.set(new_val) s0.expect_value(new_val) - OutputTextVerbatim(page, "txt0").expect_value(new_val) + controller.OutputTextVerbatim(page, "txt0").expect_value(new_val) def test_slider_range(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - s1 = InputSliderRange(page, "s1") + s1 = controller.InputSliderRange(page, "s1") s1.expect_label("Range") s1.expect_value(("200", "500")) s1.expect_min("1") @@ -50,7 +50,7 @@ def test_slider_range(page: Page, local_app: ShinyAppProc) -> None: s1.expect_timezone(None) s1.expect_drag_range("true") s1.expect_animate(exists=False) - OutputTextVerbatim(page, "txt1").expect_value("(200, 500)") + controller.OutputTextVerbatim(page, "txt1").expect_value("(200, 500)") new_val = ("605", "840") s1.set(new_val, max_err_values=1000) @@ -61,13 +61,15 @@ def test_slider_range(page: Page, local_app: ShinyAppProc) -> None: s1.expect_value((new_val[0], MISSING)) s1.expect_value((MISSING, new_val[1])) s1.expect_value(new_val) - OutputTextVerbatim(page, "txt1").expect_value(f"({new_val[0]}, {new_val[1]})") + controller.OutputTextVerbatim(page, "txt1").expect_value( + f"({new_val[0]}, {new_val[1]})" + ) def test_slider_custom_format(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - s2 = InputSlider(page, "s2") + s2 = controller.InputSlider(page, "s2") s2.expect_label("Custom Format") s2.expect_value("$0") s2.expect_min("0") @@ -81,17 +83,17 @@ def test_slider_custom_format(page: Page, local_app: ShinyAppProc) -> None: s2.expect_timezone(None) s2.expect_drag_range(None) s2.expect_animate_options(loop=True, interval=500) - OutputTextVerbatim(page, "txt2").expect_value("0") + controller.OutputTextVerbatim(page, "txt2").expect_value("0") s2.set("$7,500") s2.expect_value("$7,500") - OutputTextVerbatim(page, "txt2").expect_value("7500") + controller.OutputTextVerbatim(page, "txt2").expect_value("7500") def test_slider_loop(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - s3 = InputSlider(page, "s3") + s3 = controller.InputSlider(page, "s3") s3.expect_label("Looping Animation") s3.expect_value("1,000") s3.expect_min("1") @@ -105,11 +107,11 @@ def test_slider_loop(page: Page, local_app: ShinyAppProc) -> None: s3.expect_timezone(None) s3.expect_drag_range(None) s3.expect_animate_options(loop=True, interval=300) - OutputTextVerbatim(page, "txt3").expect_value("1000") + controller.OutputTextVerbatim(page, "txt3").expect_value("1000") s3.set("1,441") s3.expect_value("1,441") - OutputTextVerbatim(page, "txt3").expect_value("1441") + controller.OutputTextVerbatim(page, "txt3").expect_value("1441") # Play for a little bit s3.click_play() @@ -125,7 +127,7 @@ def test_slider_loop(page: Page, local_app: ShinyAppProc) -> None: def test_slider_play(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - s4 = InputSlider(page, "s4") + s4 = controller.InputSlider(page, "s4") s4.expect_label("Single Animation") s4.expect_value("1") s4.expect_min("0") @@ -139,7 +141,7 @@ def test_slider_play(page: Page, local_app: ShinyAppProc) -> None: s4.expect_timezone(None) s4.expect_drag_range(None) s4.expect_animate_options(loop=False, interval=100) - OutputTextVerbatim(page, "txt4").expect_value("1") + controller.OutputTextVerbatim(page, "txt4").expect_value("1") s4.click_play() s4.expect_value("5") diff --git a/tests/playwright/shiny/inputs/input_task_button/test_input_task_button.py b/tests/playwright/shiny/inputs/input_task_button/test_input_task_button.py index 807acd5ad..ddcb31b0f 100644 --- a/tests/playwright/shiny/inputs/input_task_button/test_input_task_button.py +++ b/tests/playwright/shiny/inputs/input_task_button/test_input_task_button.py @@ -4,13 +4,13 @@ from playwright.sync_api import Page -from shiny.playwright.controls import InputNumeric, InputTaskButton, OutputText +from shiny.playwright import controller from shiny.run import ShinyAppProc def click_extended_task_button( - button: InputTaskButton, - current_time: OutputText, + button: controller.InputTaskButton, + current_time: controller.OutputText, ) -> str: button.expect_state("ready") button.click(timeout=0) @@ -20,10 +20,10 @@ def click_extended_task_button( def test_input_action_task_button(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - y = InputNumeric(page, "y") + y = controller.InputNumeric(page, "y") y.set("4") - result = OutputText(page, "show_result") - current_time = OutputText(page, "current_time") + result = controller.OutputText(page, "show_result") + current_time = controller.OutputText(page, "current_time") # Make sure the time has content current_time.expect.not_to_be_empty() @@ -31,7 +31,7 @@ def test_input_action_task_button(page: Page, local_app: ShinyAppProc) -> None: result.expect_value("3") # Extended task - button_task = InputTaskButton(page, "btn_task") + button_task = controller.InputTaskButton(page, "btn_task") button_task.expect_label_busy("\n \n Processing...") button_task.expect_label_ready("Non-blocking task") button_task.expect_auto_reset(True) @@ -51,7 +51,7 @@ def test_input_action_task_button(page: Page, local_app: ShinyAppProc) -> None: result.expect_value("5") # Blocking verification - button_block = InputTaskButton(page, "btn_block") + button_block = controller.InputTaskButton(page, "btn_block") button_block.expect_label_busy("\n \n Blocking...") button_block.expect_label_ready("Block compute") button_block.expect_auto_reset(True) diff --git a/tests/playwright/shiny/inputs/input_task_button2/test_input_task_button2.py b/tests/playwright/shiny/inputs/input_task_button2/test_input_task_button2.py index bc7348d1f..d6ec2ddea 100644 --- a/tests/playwright/shiny/inputs/input_task_button2/test_input_task_button2.py +++ b/tests/playwright/shiny/inputs/input_task_button2/test_input_task_button2.py @@ -2,12 +2,12 @@ from playwright.sync_api import Page -from shiny.playwright.controls import InputTaskButton, OutputText +from shiny.playwright import controller from shiny.run import ShinyAppProc def click_extended_task_button( - button: InputTaskButton, + button: controller.InputTaskButton, ) -> None: button.expect_state("ready") button.click(timeout=0) @@ -18,12 +18,16 @@ def click_extended_task_button( def test_input_action_task_button(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - OutputText(page, "mod1-text_counter").expect_value("Button clicked 0 times") + controller.OutputText(page, "mod1-text_counter").expect_value( + "Button clicked 0 times" + ) # Extended task - button_task = InputTaskButton(page, "mod1-btn") + button_task = controller.InputTaskButton(page, "mod1-btn") button_task.expect_label_ready("Go") button_task.expect_auto_reset(True) click_extended_task_button(button_task) - OutputText(page, "mod1-text_counter").expect_value("Button clicked 1 times") + controller.OutputText(page, "mod1-text_counter").expect_value( + "Button clicked 1 times" + ) diff --git a/tests/playwright/shiny/inputs/test_input_action_button_link.py b/tests/playwright/shiny/inputs/test_input_action_button_link.py index fdde05dd1..794e0bddd 100644 --- a/tests/playwright/shiny/inputs/test_input_action_button_link.py +++ b/tests/playwright/shiny/inputs/test_input_action_button_link.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputActionButton, InputActionLink +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("update_action_button") @@ -10,20 +10,20 @@ def test_input_action_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - button2 = InputActionButton(page, "goButton2") + button2 = controller.InputActionButton(page, "goButton2") expect(button2.loc).to_have_text("🤩 Go 2") button2.expect_label("🤩 Go 2") button2.expect_width(None) - link = InputActionLink(page, "goLink") + link = controller.InputActionLink(page, "goLink") link.expect_label("Go Link") - button1 = InputActionButton(page, "goButton") + button1 = controller.InputActionButton(page, "goButton") button1.expect_label("Go") - button3 = InputActionButton(page, "goButton3") + button3 = controller.InputActionButton(page, "goButton3") button3.expect_label("Go 3") - InputActionButton(page, "update").click() + controller.InputActionButton(page, "update").click() button1.expect_label("📅 New label") button2.expect_label("🤩 Go 2") diff --git a/tests/playwright/shiny/inputs/test_input_checkbox.py b/tests/playwright/shiny/inputs/test_input_checkbox.py index f92bebb5b..65fb41ac3 100644 --- a/tests/playwright/shiny/inputs/test_input_checkbox.py +++ b/tests/playwright/shiny/inputs/test_input_checkbox.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputCheckbox, OutputUi +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_checkbox") @@ -10,9 +10,9 @@ def test_input_checkbox_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - somevalue = InputCheckbox(page, "somevalue") + somevalue = controller.InputCheckbox(page, "somevalue") # use output_ui - output_txt = OutputUi(page, "value") + output_txt = controller.OutputUi(page, "value") expect(somevalue.loc_label).to_have_text("Some value") somevalue.expect_label("Some value") diff --git a/tests/playwright/shiny/inputs/test_input_checkbox_group.py b/tests/playwright/shiny/inputs/test_input_checkbox_group.py index ead8b4739..46c20a373 100644 --- a/tests/playwright/shiny/inputs/test_input_checkbox_group.py +++ b/tests/playwright/shiny/inputs/test_input_checkbox_group.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputCheckboxGroup +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_checkbox_group") @@ -10,7 +10,7 @@ def test_input_checkbox_group_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - colors = InputCheckboxGroup(page, "colors") + colors = controller.InputCheckboxGroup(page, "colors") expect(colors.loc_label).to_have_text("Choose color(s):") colors.expect_label("Choose color(s):") diff --git a/tests/playwright/shiny/inputs/test_input_dark_mode.py b/tests/playwright/shiny/inputs/test_input_dark_mode.py index 82301ea98..bb6bdd30e 100644 --- a/tests/playwright/shiny/inputs/test_input_dark_mode.py +++ b/tests/playwright/shiny/inputs/test_input_dark_mode.py @@ -3,7 +3,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page -from shiny.playwright.controls import InputActionButton, InputDarkMode, NavsetBar +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_dark_mode") @@ -13,12 +13,12 @@ def test_input_dark_mode_follows_system_setting(page: Page, app: ShinyAppProc) - page.emulate_media(color_scheme="light") page.goto(app.url) - mode_switch = InputDarkMode(page, "mode") + mode_switch = controller.InputDarkMode(page, "mode") mode_switch.expect_mode("light") mode_switch.expect_wc_attribute("data-bs-theme") page.emulate_media(color_scheme="dark") - mode_switch = InputDarkMode(page, "mode") + mode_switch = controller.InputDarkMode(page, "mode") mode_switch.expect_mode("dark") mode_switch.expect_wc_attribute("data-bs-theme") @@ -27,10 +27,10 @@ def test_input_dark_mode_switch(page: Page, app: ShinyAppProc) -> None: page.emulate_media(color_scheme="light") page.goto(app.url) - mode_switch = InputDarkMode(page, "mode") - navbar = NavsetBar(page, "page") - make_light = InputActionButton(page, "make_light") - make_dark = InputActionButton(page, "make_dark") + mode_switch = controller.InputDarkMode(page, "mode") + navbar = controller.NavsetBar(page, "page") + make_light = controller.InputActionButton(page, "make_light") + make_dark = controller.InputActionButton(page, "make_dark") # Test clicking the dark mode switch mode_switch.expect_mode("light").click().expect_mode("dark") diff --git a/tests/playwright/shiny/inputs/test_input_date.py b/tests/playwright/shiny/inputs/test_input_date.py index 582d35317..38e8f74f8 100644 --- a/tests/playwright/shiny/inputs/test_input_date.py +++ b/tests/playwright/shiny/inputs/test_input_date.py @@ -7,14 +7,14 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputDate +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_date") def expect_date( - date: InputDate, + date: controller.InputDate, value: str | Literal["today"] = "today", *, label: str = "Date:", @@ -46,7 +46,7 @@ def expect_date( def test_input_date_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - date1 = InputDate(page, "date1") + date1 = controller.InputDate(page, "date1") date1.expect_label("Date:") expect(date1.loc_label).to_have_text("Date:") @@ -56,22 +56,22 @@ def test_input_date_kitchen(page: Page, app: ShinyAppProc) -> None: date1.set("2016-02-15") expect_date(date1, "2016-02-15") - expect_date(InputDate(page, "date2")) + expect_date(controller.InputDate(page, "date2")) - expect_date(InputDate(page, "date3"), "02/29/16", format="mm/dd/yy") + expect_date(controller.InputDate(page, "date3"), "02/29/16", format="mm/dd/yy") - expect_date(InputDate(page, "date3"), "02/29/16", format="mm/dd/yy") + expect_date(controller.InputDate(page, "date3"), "02/29/16", format="mm/dd/yy") - expect_date(InputDate(page, "date4"), "2016-02-29") + expect_date(controller.InputDate(page, "date4"), "2016-02-29") - expect_date(InputDate(page, "date5"), language="ru", weekstart=1) + expect_date(controller.InputDate(page, "date5"), language="ru", weekstart=1) - expect_date(InputDate(page, "date6"), startview="decade") + expect_date(controller.InputDate(page, "date6"), startview="decade") - expect_date(InputDate(page, "date7"), daysofweekdisabled=[1, 2]) + expect_date(controller.InputDate(page, "date7"), daysofweekdisabled=[1, 2]) expect_date( - InputDate(page, "date8"), + controller.InputDate(page, "date8"), "2016-02-29", datesdisabled=["2016-03-01", "2016-03-02"], ) diff --git a/tests/playwright/shiny/inputs/test_input_date_range.py b/tests/playwright/shiny/inputs/test_input_date_range.py index b59b7fae7..e5f9c7a6e 100644 --- a/tests/playwright/shiny/inputs/test_input_date_range.py +++ b/tests/playwright/shiny/inputs/test_input_date_range.py @@ -7,14 +7,14 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputDateRange +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_date_range") def expect_date_range( - date: InputDateRange, + date: controller.InputDateRange, start_value: str | Literal["today"] = "today", end_value: str | Literal["today"] = "today", *, @@ -52,7 +52,7 @@ def expect_date_range( def test_input_date_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - daterange1 = InputDateRange(page, "daterange1") + daterange1 = controller.InputDateRange(page, "daterange1") daterange1.expect_label("Date range:") expect(daterange1.loc_label).to_have_text("Date range:") @@ -62,10 +62,10 @@ def test_input_date_kitchen(page: Page, app: ShinyAppProc) -> None: daterange1.set(("2012-02-02", "2012-11-15")) expect_date_range(daterange1, "2012-02-02", "2012-11-15") - expect_date_range(InputDateRange(page, "daterange2")) + expect_date_range(controller.InputDateRange(page, "daterange2")) expect_date_range( - InputDateRange(page, "daterange3"), + controller.InputDateRange(page, "daterange3"), "01/01/01", "12/31/10", format="mm/dd/yy", @@ -75,16 +75,16 @@ def test_input_date_kitchen(page: Page, app: ShinyAppProc) -> None: ) expect_date_range( - InputDateRange(page, "daterange4"), + controller.InputDateRange(page, "daterange4"), str(datetime.date(2001, 1, 1)), str(datetime.date(2010, 12, 31)), ) expect_date_range( - InputDateRange(page, "daterange5"), + controller.InputDateRange(page, "daterange5"), language="de", weekstart=1, ) expect_date_range( - InputDateRange(page, "daterange6"), + controller.InputDateRange(page, "daterange6"), startview="decade", ) diff --git a/tests/playwright/shiny/inputs/test_input_numeric.py b/tests/playwright/shiny/inputs/test_input_numeric.py index c44251acc..0ad346ff7 100644 --- a/tests/playwright/shiny/inputs/test_input_numeric.py +++ b/tests/playwright/shiny/inputs/test_input_numeric.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputNumeric, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_numeric") @@ -26,7 +26,7 @@ def test_input_numeric_kitchen(page: Page, app: ShinyAppProc) -> None: # page.set_default_timeout(1000) - obs = InputNumeric(page, "obs") + obs = controller.InputNumeric(page, "obs") obs.expect.to_have_value("10") expect(obs.loc).to_have_value("10") @@ -45,7 +45,7 @@ def test_input_numeric_typical(page: Page, app: ShinyAppProc) -> None: # page.set_default_timeout(1000) - obs = InputNumeric(page, "obs") + obs = controller.InputNumeric(page, "obs") obs.expect.to_have_value("10") obs.loc.fill("42") obs.expect.not_to_have_value("10") @@ -58,11 +58,11 @@ def test_input_numeric_app(page: Page, app: ShinyAppProc) -> None: # with page and app: page.goto(app.url) - obs = InputNumeric(page, "obs") + obs = controller.InputNumeric(page, "obs") # obs.label.expect.to_have_text("Observed") obs.expect.to_have_value("10") - value = OutputTextVerbatim(page, "value") + value = controller.OutputTextVerbatim(page, "value") value.expect_value("10") output = page.locator("#value") diff --git a/tests/playwright/shiny/inputs/test_input_password.py b/tests/playwright/shiny/inputs/test_input_password.py index 4524ac249..23ef93160 100644 --- a/tests/playwright/shiny/inputs/test_input_password.py +++ b/tests/playwright/shiny/inputs/test_input_password.py @@ -1,11 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import ( - InputActionButton, - InputPassword, - OutputTextVerbatim, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_password") @@ -14,7 +10,7 @@ def test_input_password_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - password = InputPassword(page, "password") + password = controller.InputPassword(page, "password") password.expect.to_have_value("") expect(password.loc).to_have_value("") @@ -28,6 +24,6 @@ def test_input_password_kitchen(page: Page, app: ShinyAppProc) -> None: password_value = "test password" password.set(password_value) - InputActionButton(page, "go").click() + controller.InputActionButton(page, "go").click() password.expect_value(password_value) - OutputTextVerbatim(page, "value").expect.to_have_text(password_value) + controller.OutputTextVerbatim(page, "value").expect.to_have_text(password_value) diff --git a/tests/playwright/shiny/inputs/test_input_radio_buttons.py b/tests/playwright/shiny/inputs/test_input_radio_buttons.py index 6d94742eb..24bbc85b7 100644 --- a/tests/playwright/shiny/inputs/test_input_radio_buttons.py +++ b/tests/playwright/shiny/inputs/test_input_radio_buttons.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputRadioButtons +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_radio_buttons") @@ -10,7 +10,7 @@ def test_input_checkbox_group_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - rb = InputRadioButtons(page, "rb") + rb = controller.InputRadioButtons(page, "rb") expect(rb.loc_label).to_have_text("Choose one:") rb.expect_label("Choose one:") diff --git a/tests/playwright/shiny/inputs/test_input_select.py b/tests/playwright/shiny/inputs/test_input_select.py index 16f810b6f..451aa8578 100644 --- a/tests/playwright/shiny/inputs/test_input_select.py +++ b/tests/playwright/shiny/inputs/test_input_select.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputSelect +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_select") @@ -10,7 +10,7 @@ def test_input_select_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - state = InputSelect(page, "state") + state = controller.InputSelect(page, "state") expect(state.loc_label).to_have_text("Choose a state:") state.expect_label("Choose a state:") diff --git a/tests/playwright/shiny/inputs/test_input_selectize.py b/tests/playwright/shiny/inputs/test_input_selectize.py index 35e7bdba5..6769858c3 100644 --- a/tests/playwright/shiny/inputs/test_input_selectize.py +++ b/tests/playwright/shiny/inputs/test_input_selectize.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputSelectize +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_selectize") @@ -10,7 +10,7 @@ def test_input_selectize_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - state = InputSelectize(page, "state") + state = controller.InputSelectize(page, "state") expect(state.loc_label).to_have_text("Choose a state:") state.expect_label("Choose a state:") diff --git a/tests/playwright/shiny/inputs/test_input_slider.py b/tests/playwright/shiny/inputs/test_input_slider.py index f3d5b2b66..4a724c914 100644 --- a/tests/playwright/shiny/inputs/test_input_slider.py +++ b/tests/playwright/shiny/inputs/test_input_slider.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputSlider, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc slider_app = create_doc_example_core_fixture("input_slider") @@ -13,7 +13,7 @@ def test_input_slider_kitchen(page: Page, slider_app: ShinyAppProc) -> None: # page.set_default_timeout(1000) - obs = InputSlider(page, "obs") + obs = controller.InputSlider(page, "obs") expect(obs.loc_label).to_have_text("Number of bins:") @@ -63,8 +63,8 @@ def test_input_slider_kitchen(page: Page, slider_app: ShinyAppProc) -> None: def test_input_slider_output(page: Page, template_app: ShinyAppProc) -> None: page.goto(template_app.url) - slider = InputSlider(page, "n") - txt = OutputTextVerbatim(page, "txt") + slider = controller.InputSlider(page, "n") + txt = controller.OutputTextVerbatim(page, "txt") txt.expect_value("n*2 is 40") slider.expect_label("N") diff --git a/tests/playwright/shiny/inputs/test_input_switch.py b/tests/playwright/shiny/inputs/test_input_switch.py index a00565609..f29a16150 100644 --- a/tests/playwright/shiny/inputs/test_input_switch.py +++ b/tests/playwright/shiny/inputs/test_input_switch.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputSwitch, OutputUi +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_switch") @@ -10,7 +10,7 @@ def test_input_switch_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - somevalue = InputSwitch(page, "somevalue") + somevalue = controller.InputSwitch(page, "somevalue") expect(somevalue.loc_label).to_have_text("Some value") somevalue.expect_label("Some value") @@ -18,7 +18,7 @@ def test_input_switch_kitchen(page: Page, app: ShinyAppProc) -> None: somevalue.expect_checked(False) somevalue.expect_width(None) - expect(OutputUi(page, "value").loc).to_have_text("False") + expect(controller.OutputUi(page, "value").loc).to_have_text("False") somevalue.set(True) @@ -30,4 +30,4 @@ def test_input_switch_kitchen(page: Page, app: ShinyAppProc) -> None: somevalue.toggle() somevalue.expect_checked(True) - expect(OutputUi(page, "value").loc).to_have_text("True") + expect(controller.OutputUi(page, "value").loc).to_have_text("True") diff --git a/tests/playwright/shiny/inputs/test_input_text.py b/tests/playwright/shiny/inputs/test_input_text.py index b23c2af42..77eeb2703 100644 --- a/tests/playwright/shiny/inputs/test_input_text.py +++ b/tests/playwright/shiny/inputs/test_input_text.py @@ -3,7 +3,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputText, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_text") @@ -14,7 +14,7 @@ def test_input_text_kitchen(page: Page, app: ShinyAppProc) -> None: # page.set_default_timeout(1000) - caption = InputText(page, "caption") + caption = controller.InputText(page, "caption") caption.expect.to_have_value("Data summary") expect(caption.loc).to_have_value("Data summary") @@ -40,7 +40,7 @@ def test_input_text_kitchen(page: Page, app: ShinyAppProc) -> None: def test_input_text_typical(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - caption = InputText(page, "caption") + caption = controller.InputText(page, "caption") caption.expect.to_have_value("Data summary") caption.set("test value") caption.expect.not_to_have_value("Data summary") @@ -50,10 +50,10 @@ def test_input_text_typical(page: Page, app: ShinyAppProc) -> None: def test_input_text_app(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - caption = InputText(page, "caption") + caption = controller.InputText(page, "caption") caption.expect.to_have_value("Data summary") - value = OutputTextVerbatim(page, "value") + value = controller.OutputTextVerbatim(page, "value") value.expect_value("Data summary") caption.set("test value") diff --git a/tests/playwright/shiny/inputs/test_input_text_area.py b/tests/playwright/shiny/inputs/test_input_text_area.py index da331eb3a..a475b6b98 100644 --- a/tests/playwright/shiny/inputs/test_input_text_area.py +++ b/tests/playwright/shiny/inputs/test_input_text_area.py @@ -3,7 +3,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Locator, Page, expect -from shiny.playwright.controls import InputTextArea, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("input_text_area") @@ -14,7 +14,7 @@ def test_input_text_area_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - caption = InputTextArea(page, "caption_regular") + caption = controller.InputTextArea(page, "caption_regular") caption.expect.to_have_value(default_txt) expect(caption.loc).to_have_value(default_txt) @@ -37,13 +37,13 @@ def test_input_text_area_kitchen(page: Page, app: ShinyAppProc) -> None: caption.expect_spellcheck(None) caption.expect_autoresize(False) - InputTextArea(page, "caption_autoresize").expect_autoresize(True) + controller.InputTextArea(page, "caption_autoresize").expect_autoresize(True) def test_input_text_typical(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - caption = InputTextArea(page, "caption_regular") + caption = controller.InputTextArea(page, "caption_regular") caption.expect.to_have_value(default_txt) caption.set("test value") caption.expect.not_to_have_value(default_txt) @@ -53,10 +53,10 @@ def test_input_text_typical(page: Page, app: ShinyAppProc) -> None: def test_input_text_app(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - caption = InputTextArea(page, "caption_regular") + caption = controller.InputTextArea(page, "caption_regular") caption.expect.to_have_value(default_txt) - value = OutputTextVerbatim(page, "value_regular") + value = controller.OutputTextVerbatim(page, "value_regular") value.expect_value(default_txt) caption.set("test value") @@ -78,8 +78,8 @@ def get_box_height(locator: Locator) -> float: def test_autoresize(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - input_area = InputTextArea(page, "caption_autoresize") - output_txt_verbatim = OutputTextVerbatim(page, "value_autoresize") + input_area = controller.InputTextArea(page, "caption_autoresize") + output_txt_verbatim = controller.OutputTextVerbatim(page, "value_autoresize") input_area.set("test value") # use bounding box approach since height is dynamic initial_height = get_box_height(input_area.loc) diff --git a/tests/playwright/shiny/inputs/test_inputs_update.py b/tests/playwright/shiny/inputs/test_inputs_update.py index 7ac72c3f5..caeef992e 100644 --- a/tests/playwright/shiny/inputs/test_inputs_update.py +++ b/tests/playwright/shiny/inputs/test_inputs_update.py @@ -3,18 +3,7 @@ from conftest import create_example_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import ( - InputCheckbox, - InputCheckboxGroup, - InputDate, - InputDateRange, - InputNumeric, - InputRadioButtons, - InputSelect, - InputSlider, - InputSliderRange, - InputText, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc from shiny.types import MISSING @@ -25,35 +14,35 @@ def check_vals(page: Page, label: str, num: int): opt_labels = [f"option label {num} {type}" for type in ["A", "B"]] opt_vals = [f"option-{num}-{type}" for type in ["A", "B"]] - text = InputText(page, "inText") + text = controller.InputText(page, "inText") text.expect_label(f"New {label}") text.expect_value(f"New text {num}") - innum = InputNumeric(page, "inNumber") + innum = controller.InputNumeric(page, "inNumber") innum.expect_label("Number input:") innum.expect_value(str(num)) - innum2 = InputNumeric(page, "inNumber2") + innum2 = controller.InputNumeric(page, "inNumber2") innum2.expect_label(f"Number {label}") innum2.expect_value(str(num)) - slider = InputSlider(page, "inSlider") + slider = controller.InputSlider(page, "inSlider") slider.expect_label(f"Slider {label}") slider.expect_value(str(num)) - slider2 = InputSliderRange(page, "inSlider2") + slider2 = controller.InputSliderRange(page, "inSlider2") slider2.expect_label("Slider input 2:") slider2.expect_value((str(num - 1), str(num + 1))) - slider3 = InputSliderRange(page, "inSlider3") + slider3 = controller.InputSliderRange(page, "inSlider3") slider3.expect_value((MISSING, str(num + 2))) slider3.expect_label("Slider input 3:") - date = InputDate(page, "inDate") + date = controller.InputDate(page, "inDate") date.expect_label(f"Date {label}") date.expect_value(f"2013-04-{num:02}") - date_range_input = InputDateRange(page, "inDateRange") + date_range_input = controller.InputDateRange(page, "inDateRange") date_range_input.expect_label(f"Date range {label}") date_range_input.date_start.expect_value(f"2013-01-{num:02}") date_range_input.date_end.expect_value(f"2013-12-{num:02}") @@ -61,29 +50,29 @@ def check_vals(page: Page, label: str, num: int): # min=date(2001, 1, num), # max=date(2030, 1, num), - cb = InputCheckbox(page, "inCheckbox") + cb = controller.InputCheckbox(page, "inCheckbox") cb.expect_label("Checkbox input") cb.expect_checked((num % 2) == 1) - cb_grp_input = InputCheckboxGroup(page, "inCheckboxGroup") + cb_grp_input = controller.InputCheckboxGroup(page, "inCheckboxGroup") cb_grp_input.expect_label(f"Checkbox group {label}") cb_grp_input.expect_choices(opt_vals) cb_grp_input.expect_choice_labels(opt_labels) cb_grp_input.expect_selected([opt_vals[0]]) - radio_btns_input = InputRadioButtons(page, "inRadio") + radio_btns_input = controller.InputRadioButtons(page, "inRadio") radio_btns_input.expect_label(f"Radio {label}") radio_btns_input.expect_choice_labels(opt_labels) radio_btns_input.expect_choices(opt_vals) radio_btns_input.expect_selected(opt_vals[0]) - select = InputSelect(page, "inSelect") + select = controller.InputSelect(page, "inSelect") select.expect_label(f"Select {label}") select.expect_choice_labels(opt_labels) select.expect_choices(opt_vals) select.expect_selected(opt_vals[0]) - selectize = InputSelect(page, "inSelect2") + selectize = controller.InputSelect(page, "inSelect2") selectize.expect_label(f"Select label {label}") selectize.expect_choices(opt_vals) selectize.expect_selected(opt_vals[1]) @@ -107,6 +96,6 @@ def test_updates(page: Page, inputs_update_app: ShinyAppProc): for n in [9, 10]: label = f"LABEL {n} TEXT" - InputText(page, "control_label").set(label) - InputSlider(page, "control_num").set(str(n)) + controller.InputText(page, "control_label").set(label) + controller.InputSlider(page, "control_num").set(str(n)) check_vals(page, label, n) diff --git a/tests/playwright/shiny/module-conditional/test_module_conditional.py b/tests/playwright/shiny/module-conditional/test_module_conditional.py index bc0739087..547b98b2c 100644 --- a/tests/playwright/shiny/module-conditional/test_module_conditional.py +++ b/tests/playwright/shiny/module-conditional/test_module_conditional.py @@ -1,6 +1,6 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import InputCheckbox +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -9,7 +9,7 @@ def test_async_app(page: Page, local_app: ShinyAppProc) -> None: # Non-module version - cb_show = InputCheckbox(page, "show") + cb_show = controller.InputCheckbox(page, "show") expect(cb_show.loc).to_be_visible() expect(cb_show.loc).not_to_be_checked() @@ -22,7 +22,7 @@ def test_async_app(page: Page, local_app: ShinyAppProc) -> None: # Module version - cb_mod_show = InputCheckbox(page, "mod-show") + cb_mod_show = controller.InputCheckbox(page, "mod-show") expect(cb_mod_show.loc).to_be_visible() expect(cb_mod_show.loc).not_to_be_checked() diff --git a/tests/playwright/shiny/outputs/test_output_image.py b/tests/playwright/shiny/outputs/test_output_image.py index f1c3c0e06..ce30f9816 100644 --- a/tests/playwright/shiny/outputs/test_output_image.py +++ b/tests/playwright/shiny/outputs/test_output_image.py @@ -3,7 +3,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page -from shiny.playwright.controls import OutputImage +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("output_image") @@ -12,7 +12,7 @@ def test_output_image_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - img = OutputImage(page, "image") + img = controller.OutputImage(page, "image") img.expect_inline(False) diff --git a/tests/playwright/shiny/outputs/test_output_plot.py b/tests/playwright/shiny/outputs/test_output_plot.py index e2cfb59f3..b9bce3a60 100644 --- a/tests/playwright/shiny/outputs/test_output_plot.py +++ b/tests/playwright/shiny/outputs/test_output_plot.py @@ -3,7 +3,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page -from shiny.playwright.controls import OutputPlot +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("output_plot") @@ -12,7 +12,7 @@ def test_output_plot_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - plot = OutputPlot(page, "p") + plot = controller.OutputPlot(page, "p") plot.expect_inline(False) plot.expect_height("400px") diff --git a/tests/playwright/shiny/outputs/test_output_table.py b/tests/playwright/shiny/outputs/test_output_table.py index 3f494dcad..21b7b9b13 100644 --- a/tests/playwright/shiny/outputs/test_output_table.py +++ b/tests/playwright/shiny/outputs/test_output_table.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page -from shiny.playwright.controls import OutputTable +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("output_table") @@ -10,7 +10,7 @@ def test_output_plot_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - table = OutputTable(page, "result") + table = controller.OutputTable(page, "result") table.expect_n_col(11) table.expect_n_row(32) diff --git a/tests/playwright/shiny/outputs/test_output_text.py b/tests/playwright/shiny/outputs/test_output_text.py index c0a56ce5d..ae2624d43 100644 --- a/tests/playwright/shiny/outputs/test_output_text.py +++ b/tests/playwright/shiny/outputs/test_output_text.py @@ -1,7 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page -from shiny.playwright.controls import InputText, OutputText, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("output_text") @@ -10,10 +10,10 @@ def test_output_text_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - txt = InputText(page, "txt") - text = OutputText(page, "text") - verb = OutputTextVerbatim(page, "verb") - verb_no_placeholder = OutputTextVerbatim(page, "verb_no_placeholder") + txt = controller.InputText(page, "txt") + text = controller.OutputText(page, "text") + verb = controller.OutputTextVerbatim(page, "verb") + verb_no_placeholder = controller.OutputTextVerbatim(page, "verb_no_placeholder") txt.set("") # Reset text diff --git a/tests/playwright/shiny/outputs/test_output_ui.py b/tests/playwright/shiny/outputs/test_output_ui.py index 97ae129b9..bd5c71c45 100644 --- a/tests/playwright/shiny/outputs/test_output_ui.py +++ b/tests/playwright/shiny/outputs/test_output_ui.py @@ -1,12 +1,7 @@ from conftest import create_doc_example_core_fixture from playwright.sync_api import Page, expect -from shiny.playwright.controls import ( - InputActionButton, - InputSlider, - InputText, - OutputUi, -) +from shiny.playwright import controller from shiny.run import ShinyAppProc app = create_doc_example_core_fixture("output_ui") @@ -15,7 +10,7 @@ def test_output_ui_kitchen(page: Page, app: ShinyAppProc) -> None: page.goto(app.url) - more_controls = OutputUi(page, "moreControls") + more_controls = controller.OutputUi(page, "moreControls") more_controls.expect_inline(False) @@ -24,12 +19,12 @@ def test_output_ui_kitchen(page: Page, app: ShinyAppProc) -> None: expect(page.locator("#n")).to_have_count(0) expect(page.locator("#label")).to_have_count(0) - InputActionButton(page, "add").click() + controller.InputActionButton(page, "add").click() more_controls.expect_empty(False) expect(more_controls.loc).not_to_have_text("") expect(page.locator("#n")).to_have_count(1) expect(page.locator("#label")).to_have_count(1) - InputSlider(page, "n").expect_value("500") - InputText(page, "label").expect_value("") + controller.InputSlider(page, "n").expect_value("500") + controller.InputText(page, "label").expect_value("") diff --git a/tests/playwright/shiny/plot-sizing/test_plot_sizing.py b/tests/playwright/shiny/plot-sizing/test_plot_sizing.py index ae1fa7664..24af4558b 100644 --- a/tests/playwright/shiny/plot-sizing/test_plot_sizing.py +++ b/tests/playwright/shiny/plot-sizing/test_plot_sizing.py @@ -2,7 +2,7 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputPlot +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -38,7 +38,7 @@ def test_output_image_kitchen(page: Page, local_app: ShinyAppProc) -> None: for tab, plots in plotids_by_tab.items(): page.click(f"a[data-toggle='tab'][data-value='{tab}']") for plotid in plots: - img = OutputPlot(page, plotid) + img = controller.OutputPlot(page, plotid) # These assertions are mostly to ensure that the plots load before we # evaluate their sizes img.expect_inline(False) diff --git a/tests/playwright/shiny/server/output_transformer/test_output_transformer_async.py b/tests/playwright/shiny/server/output_transformer/test_output_transformer_async.py index a8681ad0f..7199e9f5c 100644 --- a/tests/playwright/shiny/server/output_transformer/test_output_transformer_async.py +++ b/tests/playwright/shiny/server/output_transformer/test_output_transformer_async.py @@ -1,15 +1,19 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_output_transformer(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - OutputTextVerbatim(page, "t1").expect_value("t1; no call; sync") - OutputTextVerbatim(page, "t2").expect_value("t2; no call; async") - OutputTextVerbatim(page, "t3").expect_value("t3; call; sync") - OutputTextVerbatim(page, "t4").expect_value("t4; call; async") - OutputTextVerbatim(page, "t5").expect_value("t5; call; sync; w/ extra_txt") - OutputTextVerbatim(page, "t6").expect_value("t6; call; async; w/ extra_txt") + controller.OutputTextVerbatim(page, "t1").expect_value("t1; no call; sync") + controller.OutputTextVerbatim(page, "t2").expect_value("t2; no call; async") + controller.OutputTextVerbatim(page, "t3").expect_value("t3; call; sync") + controller.OutputTextVerbatim(page, "t4").expect_value("t4; call; async") + controller.OutputTextVerbatim(page, "t5").expect_value( + "t5; call; sync; w/ extra_txt" + ) + controller.OutputTextVerbatim(page, "t6").expect_value( + "t6; call; async; w/ extra_txt" + ) diff --git a/tests/playwright/shiny/server/reactive_event/test_reactive_event.py b/tests/playwright/shiny/server/reactive_event/test_reactive_event.py index 5bca87642..5dc011786 100644 --- a/tests/playwright/shiny/server/reactive_event/test_reactive_event.py +++ b/tests/playwright/shiny/server/reactive_event/test_reactive_event.py @@ -1,17 +1,17 @@ from playwright.sync_api import Page -from shiny.playwright.controls import InputActionButton, OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_output_image_kitchen(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - btn_count = InputActionButton(page, "btn_count") - btn_trigger = InputActionButton(page, "btn_trigger") - txt_immediate = OutputTextVerbatim(page, "txt_immediate") - txt_render_delayed = OutputTextVerbatim(page, "txt_render_delayed") - txt_reactive_delayed = OutputTextVerbatim(page, "txt_reactive_delayed") + btn_count = controller.InputActionButton(page, "btn_count") + btn_trigger = controller.InputActionButton(page, "btn_trigger") + txt_immediate = controller.OutputTextVerbatim(page, "txt_immediate") + txt_render_delayed = controller.OutputTextVerbatim(page, "txt_render_delayed") + txt_reactive_delayed = controller.OutputTextVerbatim(page, "txt_reactive_delayed") txt_immediate.expect_value("0") txt_render_delayed.expect_value("") diff --git a/tests/playwright/shiny/session/flush/test_on_flush.py b/tests/playwright/shiny/session/flush/test_on_flush.py index 1b0bd7a1c..4473f3288 100644 --- a/tests/playwright/shiny/session/flush/test_on_flush.py +++ b/tests/playwright/shiny/session/flush/test_on_flush.py @@ -1,6 +1,6 @@ from playwright.sync_api import Page -from shiny.playwright.controls import OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc @@ -8,24 +8,24 @@ def test_output_image_kitchen(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - OutputTextVerbatim(page, "all_txt").expect_value( + controller.OutputTextVerbatim(page, "all_txt").expect_value( "('a-3-flush', 'bx-3-first-flush', 'by-3-first-flush', 'bx-3-second-flush', " "'by-3-second-flush', 'c-3-flush', 'a-3-flushed', 'bx-3-first-flushed', " "'by-3-first-flushed', 'bx-3-second-flushed', 'by-3-second-flushed', " "'c-3-flushed')" ) - OutputTextVerbatim(page, "flush_txt").expect_value( + controller.OutputTextVerbatim(page, "flush_txt").expect_value( "('a-3-flush', 'bx-3-first-flush', 'by-3-first-flush', 'bx-3-second-flush', " "'by-3-second-flush', 'c-3-flush')" ) - OutputTextVerbatim(page, "flushed_txt").expect_value( + controller.OutputTextVerbatim(page, "flushed_txt").expect_value( "('a-3-flushed', 'bx-3-first-flushed', 'by-3-first-flushed', " "'bx-3-second-flushed', 'by-3-second-flushed', 'c-3-flushed')" ) # Session end messages have not flushed yet - OutputTextVerbatim(page, "session_end_txt").expect_value("[]") + controller.OutputTextVerbatim(page, "session_end_txt").expect_value("[]") page.reload() # Session end messages have flushed - OutputTextVerbatim(page, "session_end_txt").expect_value( + controller.OutputTextVerbatim(page, "session_end_txt").expect_value( "['session ended - sync - test1', 'session ended - async - test2', 'session ended - async - test3', 'session ended - sync - test4']" ) diff --git a/tests/playwright/shiny/shiny-express/hold/test_hold.py b/tests/playwright/shiny/shiny-express/hold/test_hold.py index f58d20aab..e10799b1c 100644 --- a/tests/playwright/shiny/shiny-express/hold/test_hold.py +++ b/tests/playwright/shiny/shiny-express/hold/test_hold.py @@ -1,13 +1,13 @@ from playwright.sync_api import Page, expect -from shiny.playwright.controls import OutputTextVerbatim +from shiny.playwright import controller from shiny.run import ShinyAppProc def test_express_page_fluid(page: Page, local_app: ShinyAppProc) -> None: page.goto(local_app.url) - txt = OutputTextVerbatim(page, "visible") + txt = controller.OutputTextVerbatim(page, "visible") txt.expect_value("40") expect(page.locator("#visible")).to_have_count(1) From 94da7fd0d3492a9256cae6c14951a3b87683c3db Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Mon, 24 Jun 2024 18:58:33 -0700 Subject: [PATCH 2/5] remove extra controller --- .../express-accordion/test_deploys_express_accordion.py | 2 +- .../express-dataframe/test_deploys_express_dataframe.py | 2 +- .../express-page_default/test_deploys_express_page_default.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py b/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py index 5423e9c57..4160084d6 100644 --- a/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py +++ b/tests/playwright/deploys/express-accordion/test_deploys_express_accordion.py @@ -17,7 +17,7 @@ def test_express_accordion(page: Page, app_url: str) -> None: page.goto(app_url) - acc = controller.controller.Accordion(page, "express_accordion") + acc = controller.Accordion(page, "express_accordion") acc_panel_2 = acc.accordion_panel("Panel 2") acc_panel_2.expect_open(True) acc_panel_2.expect_body("n = 50") 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 51115566b..b5ab56959 100644 --- a/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py +++ b/tests/playwright/deploys/express-dataframe/test_deploys_express_dataframe.py @@ -17,5 +17,5 @@ def test_express_dataframe_deploys(page: Page, app_url: str) -> None: page.goto(app_url) - dataframe = controller.controller.OutputDataFrame(page, "sample_data_frame") + dataframe = controller.OutputDataFrame(page, "sample_data_frame") dataframe.expect_n_row(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 56fb73e6b..56109abf1 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 @@ -26,12 +26,12 @@ 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.controller.NavsetTab(page, "express_navset_tab") + nav_html = controller.NavsetTab(page, "express_navset_tab") nav_html.expect_content("pre 0pre 1pre 2") nav_html.set("div") nav_html.expect_content("div 0\ndiv 1\ndiv 2") nav_html.set("span") nav_html.expect_content("span 0span 1span 2") - navset_card_tab = controller.controller.NavsetTab(page, "express_navset_card_tab") + navset_card_tab = controller.NavsetTab(page, "express_navset_card_tab") navset_card_tab.expect_content("") From dab04cd2f9dd09f53c8e070a7dfb9cfa9f36088e Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Mon, 24 Jun 2024 19:07:56 -0700 Subject: [PATCH 3/5] update testing documentation --- docs/_quartodoc-testing.yml | 90 ++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/docs/_quartodoc-testing.yml b/docs/_quartodoc-testing.yml index e9c7de237..2fe4ab268 100644 --- a/docs/_quartodoc-testing.yml +++ b/docs/_quartodoc-testing.yml @@ -13,66 +13,66 @@ quartodoc: - title: UI Layouts desc: Methods for interacting with Shiny app multiple UI component controls. contents: - - playwright.controls.Accordion - - playwright.controls.AccordionPanel - - playwright.controls.Card - - playwright.controls.Popover - - playwright.controls.Sidebar - - playwright.controls.Tooltip + - playwright.controller.Accordion + - playwright.controller.AccordionPanel + - playwright.controller.Card + - playwright.controller.Popover + - playwright.controller.Sidebar + - playwright.controller.Tooltip - title: UI Inputs desc: Methods for interacting with Shiny app input value controls. contents: - - playwright.controls.InputActionLink - - playwright.controls.InputCheckbox - - playwright.controls.InputCheckboxGroup - - playwright.controls.InputDarkMode - - playwright.controls.InputDate - - playwright.controls.InputDateRange - - playwright.controls.InputFile - - playwright.controls.InputNumeric - - playwright.controls.InputPassword - - playwright.controls.InputRadioButtons - - playwright.controls.InputSelect - - playwright.controls.InputSelectize - - playwright.controls.InputSlider - - playwright.controls.InputSliderRange - - playwright.controls.InputSwitch - - playwright.controls.InputTaskButton - - playwright.controls.InputText - - playwright.controls.InputTextArea + - playwright.controller.InputActionLink + - playwright.controller.InputCheckbox + - playwright.controller.InputCheckboxGroup + - playwright.controller.InputDarkMode + - playwright.controller.InputDate + - playwright.controller.InputDateRange + - playwright.controller.InputFile + - playwright.controller.InputNumeric + - playwright.controller.InputPassword + - playwright.controller.InputRadioButtons + - playwright.controller.InputSelect + - playwright.controller.InputSelectize + - playwright.controller.InputSlider + - playwright.controller.InputSliderRange + - playwright.controller.InputSwitch + - playwright.controller.InputTaskButton + - playwright.controller.InputText + - playwright.controller.InputTextArea - title: Value boxes desc: Methods for interacting with Shiny app valuebox controls. contents: - - playwright.controls.ValueBox + - playwright.controller.ValueBox - title: Navigation (tab) panels desc: Methods for interacting with Shiny app UI content controls. contents: - - playwright.controls.NavItem - - playwright.controls.NavsetBar - - playwright.controls.NavsetCardPill - - playwright.controls.NavsetCardTab - - playwright.controls.NavsetCardUnderline - - playwright.controls.NavsetHidden - - playwright.controls.NavsetPill - - playwright.controls.NavsetPillList - - playwright.controls.NavsetTab - - playwright.controls.NavsetUnderline + - playwright.controller.NavItem + - playwright.controller.NavsetBar + - playwright.controller.NavsetCardPill + - playwright.controller.NavsetCardTab + - playwright.controller.NavsetCardUnderline + - playwright.controller.NavsetHidden + - playwright.controller.NavsetPill + - playwright.controller.NavsetPillList + - playwright.controller.NavsetTab + - playwright.controller.NavsetUnderline - title: Upload and download desc: Methods for interacting with Shiny app uploading and downloading controls. contents: - - playwright.controls.DownloadButton - - playwright.controls.DownloadLink + - playwright.controller.DownloadButton + - playwright.controller.DownloadLink - title: Rendering outputs desc: Render output in a variety of ways. contents: - - playwright.controls.OutputCode - - playwright.controls.OutputDataFrame - - playwright.controls.OutputImage - - playwright.controls.OutputPlot - - playwright.controls.OutputTable - - playwright.controls.OutputText - - playwright.controls.OutputTextVerbatim - - playwright.controls.OutputUi + - playwright.controller.OutputCode + - playwright.controller.OutputDataFrame + - playwright.controller.OutputImage + - playwright.controller.OutputPlot + - playwright.controller.OutputTable + - playwright.controller.OutputText + - playwright.controller.OutputTextVerbatim + - playwright.controller.OutputUi - title: "Playwright Expect" desc: "Methods for testing the state of a locator within a Shiny app." contents: From e7fb7d8514b5c2abc3f0cb4d56eff2c585238374 Mon Sep 17 00:00:00 2001 From: Karan Gathani Date: Mon, 24 Jun 2024 19:10:44 -0700 Subject: [PATCH 4/5] refactor controls to controller for uniformity in docs --- docs/_quartodoc-testing.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_quartodoc-testing.yml b/docs/_quartodoc-testing.yml index 2fe4ab268..9a69b6810 100644 --- a/docs/_quartodoc-testing.yml +++ b/docs/_quartodoc-testing.yml @@ -11,7 +11,7 @@ quartodoc: show_signature_annotations: false sections: - title: UI Layouts - desc: Methods for interacting with Shiny app multiple UI component controls. + desc: Methods for interacting with Shiny app multiple UI component controller. contents: - playwright.controller.Accordion - playwright.controller.AccordionPanel @@ -20,7 +20,7 @@ quartodoc: - playwright.controller.Sidebar - playwright.controller.Tooltip - title: UI Inputs - desc: Methods for interacting with Shiny app input value controls. + desc: Methods for interacting with Shiny app input value controller. contents: - playwright.controller.InputActionLink - playwright.controller.InputCheckbox @@ -41,11 +41,11 @@ quartodoc: - playwright.controller.InputText - playwright.controller.InputTextArea - title: Value boxes - desc: Methods for interacting with Shiny app valuebox controls. + desc: Methods for interacting with Shiny app valuebox controller. contents: - playwright.controller.ValueBox - title: Navigation (tab) panels - desc: Methods for interacting with Shiny app UI content controls. + desc: Methods for interacting with Shiny app UI content controller. contents: - playwright.controller.NavItem - playwright.controller.NavsetBar @@ -58,7 +58,7 @@ quartodoc: - playwright.controller.NavsetTab - playwright.controller.NavsetUnderline - title: Upload and download - desc: Methods for interacting with Shiny app uploading and downloading controls. + desc: Methods for interacting with Shiny app uploading and downloading controller. contents: - playwright.controller.DownloadButton - playwright.controller.DownloadLink From 38c9d85954a94b3b8babd9b02095f9dd9e7cc480 Mon Sep 17 00:00:00 2001 From: Barret Schloerke Date: Tue, 25 Jun 2024 11:21:58 -0400 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5532c12a..7b3978d5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### New features +* Expose `shiny.playwright`, `shiny.run`, and `shiny.pytest` modules that allow users to testing their Shiny apps. (#1448, #1456, #1481) + * `shiny.playwright` contains `controller` and `expect` submodules. `controller` will contain many classes to interact with (and verify!) your Shiny app using Playwright. `expect` contains expectation functions that enhance standard Playwright expectation methods. + * `shiny.run` contains the `run_shiny_app` command and the return type `ShinyAppProc`. `ShinyAppProc` can be used to type the Shiny app pytest fixtures. + * `shiny.pytest` contains pytest test fixtures. The `local_app` pytest fixture is automatically available and runs a sibling `app.py` file. Where as `create_app_fixture(PATH_TO_APP)` allows for a Shiny app to be instantiated from a different folder. + +* Added CLI command `shiny add test` to add a test file to an existing Shiny app. (#1461) + * `@render.data_frame` has added a few new methods: * `.data_view_rows()` is a reactive value representing the sorted and filtered row numbers. This value wraps `input._data_view_rows()`(#1374) * `.sort()` is a reactive value representing the sorted column information (dictionaries containing `col: int` and `desc: bool`). This value wraps `input._sort()`. (#1374) @@ -60,8 +67,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### New features -* Expose shiny.pytest, shiny.run and shiny.playwright modules that allow users to testing their Shiny apps. (#1448, #1456) - * Added busy indicators to provide users with a visual cue when the server is busy calculating outputs or otherwise serving requests to the client. More specifically, a spinner is shown on each calculating/recalculating output, and a pulsing banner is shown at the top of the page when the app is otherwise busy. Use the new `ui.busy_indicator.options()` function to customize the appearance of the busy indicators and `ui.busy_indicator.use()` to disable/enable them. (#918) * Added support for creating modules using Shiny Express syntax, and using modules in Shiny Express apps. (#1220)