|  | 
|  | 1 | +# import pytest | 
|  | 2 | +import pytest | 
|  | 3 | +from playwright.sync_api import Page, expect | 
|  | 4 | + | 
|  | 5 | +from shiny.playwright import controller | 
|  | 6 | +from shiny.run import ShinyAppProc | 
|  | 7 | + | 
|  | 8 | + | 
|  | 9 | +@pytest.mark.flaky(reruns=3, reruns_delay=2) | 
|  | 10 | +def test_dynamic_navs(page: Page, local_app: ShinyAppProc) -> None: | 
|  | 11 | +    page.goto(local_app.url) | 
|  | 12 | + | 
|  | 13 | +    # Page begins with 2 tabs: "Hello" and "Foo" and a nav menu with 2 static items. | 
|  | 14 | +    navset_tab = controller.NavsetTab(page, "tabs") | 
|  | 15 | + | 
|  | 16 | +    # Click add-foo to add a new Foo tab | 
|  | 17 | +    addfoo = controller.InputActionButton(page, "addFoo") | 
|  | 18 | +    addfoo.click() | 
|  | 19 | +    controller.NavsetTab(page, "tabs").expect_nav_titles( | 
|  | 20 | +        ["Hello", "Foo", "Foo-1", "Static1", "Static2"] | 
|  | 21 | +    ) | 
|  | 22 | +    # Test Foo-1 tab is added | 
|  | 23 | +    navpanel = controller.NavPanel(page, "tabs", "Foo").loc.filter(has_text="Foo-1") | 
|  | 24 | +    expect(navpanel).to_have_text("Foo-1") | 
|  | 25 | + | 
|  | 26 | +    # Click hide-tab to hide the Foo tabs | 
|  | 27 | +    hidetab = controller.InputActionButton(page, "hideTab") | 
|  | 28 | +    hidetab.click() | 
|  | 29 | + | 
|  | 30 | +    # Expect the Foo tabs to be hidden | 
|  | 31 | +    navpanel = controller.NavPanel(page, "tabs", "Foo").loc.filter(has_text="Foo-1") | 
|  | 32 | +    expect(navpanel).to_be_hidden() | 
|  | 33 | +    navpanel = controller.NavPanel(page, "tabs", "Foo").loc.filter( | 
|  | 34 | +        has_text="This is the Foo tab" | 
|  | 35 | +    ) | 
|  | 36 | +    expect(navpanel).to_be_hidden() | 
|  | 37 | + | 
|  | 38 | +    # Click show-tab to show the Foo tabs again | 
|  | 39 | +    showtab = controller.InputActionButton(page, "showTab") | 
|  | 40 | +    showtab.click() | 
|  | 41 | + | 
|  | 42 | +    # Expect the Foo tabs to be visible again | 
|  | 43 | +    navpanel2 = controller.NavPanel(page, "tabs", "Foo").loc.first | 
|  | 44 | +    expect(navpanel2).to_be_visible() | 
|  | 45 | +    navpanel3 = controller.NavPanel(page, "tabs", "Foo").loc.last | 
|  | 46 | +    expect(navpanel3).to_be_visible() | 
|  | 47 | + | 
|  | 48 | +    # Click remove-foo to remove the Foo tabs | 
|  | 49 | +    removefoo = controller.InputActionButton(page, "removeFoo") | 
|  | 50 | +    removefoo.click() | 
|  | 51 | +    controller.NavsetTab(page, "tabs").expect_nav_titles( | 
|  | 52 | +        ["Hello", "Static1", "Static2"] | 
|  | 53 | +    ) | 
|  | 54 | + | 
|  | 55 | +    # Click add to add a dynamic tab | 
|  | 56 | +    add = controller.InputActionButton(page, "add") | 
|  | 57 | +    add.click() | 
|  | 58 | +    controller.NavsetTab(page, "tabs").expect_nav_titles( | 
|  | 59 | +        ["Hello", "Static1", "Dynamic-1", "Static2"] | 
|  | 60 | +    ) | 
|  | 61 | + | 
|  | 62 | +    # Click add again to add another dynamic tab | 
|  | 63 | +    add.click() | 
|  | 64 | +    controller.NavsetTab(page, "tabs").expect_nav_titles( | 
|  | 65 | +        ["Hello", "Static1", "Dynamic-1", "Dynamic-2", "Static2"] | 
|  | 66 | +    ) | 
|  | 67 | + | 
|  | 68 | +    page.get_by_role("button", name="Menu", exact=True).click() | 
|  | 69 | + | 
|  | 70 | +    navpanel3 = controller.NavPanel(page, "tabs", "s1").loc | 
|  | 71 | +    expect(navpanel3).to_be_visible() | 
|  | 72 | + | 
|  | 73 | +    # Click hide-menu to hide the static menu | 
|  | 74 | +    hidemenu = controller.InputActionButton(page, "hideMenu") | 
|  | 75 | +    hidemenu.click() | 
|  | 76 | + | 
|  | 77 | +    # Expect the Menu to be hidden | 
|  | 78 | +    navpanel3 = controller.NavPanel(page, "tabs", "s1").loc | 
|  | 79 | +    expect(navpanel3).to_be_hidden() | 
|  | 80 | + | 
|  | 81 | +    # Click show-menu to show the static menu again | 
|  | 82 | +    showmenu = controller.InputActionButton(page, "showMenu") | 
|  | 83 | +    showmenu.click() | 
|  | 84 | + | 
|  | 85 | +    # Expect the Menu to be visible again | 
|  | 86 | +    expect(page.get_by_role("button", name="Menu", exact=True)).to_be_visible() | 
|  | 87 | +    # Click the Menu button to show the static menu | 
|  | 88 | +    page.get_by_role("button", name="Menu", exact=True).click() | 
|  | 89 | +    navpanel3 = controller.NavPanel(page, "tabs", "s1").loc | 
|  | 90 | +    expect(navpanel3).to_be_visible() | 
0 commit comments