Skip to content

Commit b8200d8

Browse files
committed
Test navset hidden
1 parent 9c224d4 commit b8200d8

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from typing import Any, Dict
2+
3+
from shiny import Inputs, reactive
4+
from shiny.express import app_opts, expressify, input, module, session, ui
5+
6+
app_opts(bookmark_store="url")
7+
8+
9+
navset_configs: Dict[str, Dict[str, Dict[str, Any]]] = {
10+
"navset_hidden": {
11+
"default": {},
12+
},
13+
}
14+
15+
16+
@expressify
17+
def create_navset(navset_name: str, input: Inputs) -> None:
18+
navset_function = getattr(ui, navset_name)
19+
20+
@expressify
21+
def make_navset(navset_variant: str, **navset_kwargs):
22+
letters = ["a", "b", "c"]
23+
navset_fn_id = f"{navset_name}_{navset_variant}"
24+
ui.h3(f"Variant: {navset_variant}")
25+
with navset_function(id=navset_fn_id, **navset_kwargs):
26+
for suffix in letters:
27+
id = f"{navset_fn_id}_{suffix}"
28+
with ui.nav_panel(id, value=id):
29+
ui.markdown(f"{id} content")
30+
31+
btn_id = f"{navset_fn_id}_button"
32+
ui.input_action_button(
33+
id=btn_id,
34+
label=f"Cycle content for {navset_fn_id}",
35+
)
36+
37+
@reactive.effect
38+
@reactive.event(input[btn_id], ignore_init=True)
39+
def _():
40+
# Cycle the content by changing the nav panel value
41+
current_idx = input[btn_id]()
42+
next_letter = letters[current_idx % len(letters)]
43+
next_id = f"{navset_fn_id}_{next_letter}"
44+
45+
ui.update_navs(navset_fn_id, selected=next_id)
46+
47+
for navset_variant, params in navset_configs[navset_name].items():
48+
make_navset(navset_variant, **params.copy())
49+
50+
51+
with ui.card():
52+
ui.card_header("Hidden Bookmark Navset Demo")
53+
54+
# Non-modular section
55+
ui.h3("Non-Module Section")
56+
57+
with ui.navset_tab(id="navsets_collection"):
58+
for navset_name in navset_configs.keys():
59+
with ui.nav_panel(navset_name):
60+
create_navset(navset_name, input=input)
61+
62+
@module
63+
def navset_module(input, output, session):
64+
ui.h3("Navset Module")
65+
66+
with ui.navset_tab(id="navsets_collection"):
67+
for navset_name in navset_configs.keys():
68+
with ui.nav_panel(navset_name):
69+
create_navset(navset_name, input=input)
70+
71+
navset_module("first")
72+
73+
ui.input_bookmark_button()
74+
75+
76+
@session.bookmark.on_bookmarked
77+
async def _(url: str):
78+
await session.bookmark.update_query_string(url)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from typing import Type
2+
3+
import pytest
4+
from playwright.sync_api import Page
5+
6+
from shiny.playwright import controller
7+
from shiny.pytest import create_app_fixture
8+
from shiny.run import ShinyAppProc
9+
10+
app = create_app_fixture("app-hidden.py")
11+
12+
13+
@pytest.mark.parametrize(
14+
"navset_name,navset_variant,navset_controller",
15+
[
16+
("navset_hidden", "default", controller.NavsetHidden),
17+
],
18+
)
19+
def test_navset_hidden_bookmarking(
20+
page: Page,
21+
app: ShinyAppProc,
22+
navset_name: str,
23+
navset_variant: str,
24+
navset_controller: Type[controller._navs._NavsetBase],
25+
) -> None:
26+
page.goto(app.url)
27+
28+
# Non-module navsets
29+
navset_collection = controller.NavsetTab(page, "navsets_collection")
30+
navset_collection.set(navset_name)
31+
navset_id = f"{navset_name}_{navset_variant}"
32+
navset_cont = navset_controller(page, navset_id)
33+
navset_btn = controller.InputActionButton(page, f"{navset_id}_button")
34+
navset_btn.click()
35+
navset_btn.click()
36+
37+
# Module navsets
38+
mod_navset_collection = controller.NavsetTab(page, "first-navsets_collection")
39+
mod_navset_collection.set(navset_name)
40+
mod_navset_cont = navset_controller(page, f"first-{navset_id}")
41+
mod_navset_btn = controller.InputActionButton(page, f"first-{navset_id}_button")
42+
mod_navset_btn.click()
43+
44+
# Click bookmark button
45+
controller.InputBookmarkButton(page).click()
46+
47+
# Reload page
48+
page.reload()
49+
50+
# Assert
51+
navset_collection.expect_value(navset_name)
52+
navset_cont.expect_value(f"{navset_id}_c")
53+
mod_navset_collection.expect_value(navset_name)
54+
mod_navset_cont.expect_value(f"{navset_id}_b")

0 commit comments

Comments
 (0)