Skip to content

Commit 86e1252

Browse files
committed
Add test for Shiny Express insert accordion panel behavior
Introduces a new app and Playwright test to verify dynamic updating and insertion of accordion panels in Shiny Express UI. Tests cover initial panel rendering, updating panel content and title, and adding new panels via action buttons.
1 parent e3ded2b commit 86e1252

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import datetime
2+
3+
from shiny import reactive
4+
from shiny.express import input, ui
5+
6+
with ui.accordion(id="my_accordion"):
7+
with ui.accordion_panel(title="About"):
8+
"This is a simple Shiny app."
9+
10+
with ui.accordion_panel(title="Panel 1"):
11+
"Some initial content for Panel 1."
12+
13+
with ui.accordion_panel(title="Panel 2", value="panel_2_val"):
14+
"Some initial content for Panel 2."
15+
16+
ui.input_action_button("update_button", "Update Panel 2")
17+
ui.input_action_button("add_panel_button", "Add New Panel")
18+
19+
panel_counter = reactive.value(3)
20+
21+
22+
@reactive.effect
23+
@reactive.event(input.update_button)
24+
def _():
25+
new_content = f"Content updated at: {datetime.datetime.now().strftime('%H:%M:%S')}"
26+
ui.update_accordion_panel(
27+
"my_accordion", "panel_2_val", new_content, title="Panel 2 (Updated)"
28+
)
29+
30+
31+
@reactive.effect
32+
@reactive.event(input.add_panel_button)
33+
def _():
34+
current_count = panel_counter.get()
35+
panel_counter.set(current_count + 1)
36+
ui.insert_accordion_panel(
37+
"my_accordion",
38+
f"Panel {current_count}",
39+
f"This is dynamically added panel {current_count}, created at {datetime.datetime.now().strftime('%H:%M:%S')}",
40+
)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from playwright.sync_api import Page
2+
3+
from shiny.playwright import controller
4+
from shiny.pytest import create_app_fixture
5+
from shiny.run import ShinyAppProc
6+
7+
app = create_app_fixture(["app-express.py"])
8+
9+
10+
def test_accordion_and_buttons(page: Page, app: ShinyAppProc) -> None:
11+
page.goto(app.url)
12+
13+
accordion = controller.Accordion(page, "my_accordion")
14+
update_button = controller.InputActionButton(page, "update_button")
15+
add_panel_button = controller.InputActionButton(page, "add_panel_button")
16+
17+
accordion.expect_panels(["About", "Panel 1", "panel_2_val"])
18+
19+
about_panel = accordion.accordion_panel("About")
20+
about_panel.expect_label("About")
21+
about_panel.expect_body("This is a simple Shiny app.")
22+
23+
panel_1 = accordion.accordion_panel("Panel 1")
24+
panel_1.expect_label("Panel 1")
25+
panel_1.expect_body("Some initial content for Panel 1.")
26+
27+
panel_2 = accordion.accordion_panel("panel_2_val")
28+
panel_2.expect_label("Panel 2")
29+
panel_2.expect_body("Some initial content for Panel 2.")
30+
31+
update_button.expect_label("Update Panel 2")
32+
update_button.click()
33+
34+
panel_2.expect_label("Panel 2 (Updated)")
35+
36+
add_panel_button.expect_label("Add New Panel")
37+
add_panel_button.click()
38+
39+
accordion.expect_panels(["About", "Panel 1", "panel_2_val", "Panel 3"])
40+
41+
panel_3 = accordion.accordion_panel("Panel 3")
42+
panel_3.expect_label("Panel 3")
43+
44+
add_panel_button.click()
45+
46+
accordion.expect_panels(["About", "Panel 1", "panel_2_val", "Panel 3", "Panel 4"])
47+
48+
panel_4 = accordion.accordion_panel("Panel 4")
49+
panel_4.expect_label("Panel 4")

0 commit comments

Comments
 (0)