1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- """Integration tests for links and related components."""
- from typing import Generator
- from urllib.parse import urlsplit
- import pytest
- from selenium.webdriver.common.by import By
- from reflex.testing import AppHarness
- from .utils import SessionStorage, poll_for_navigation
- def NavigationApp():
- """Reflex app with links for navigation."""
- import reflex as rx
- class State(rx.State):
- is_external: bool = True
- app = rx.App()
- @app.add_page
- def index():
- return rx.fragment(
- rx.link("Internal", href="/internal", id="internal"),
- rx.link(
- "External",
- href="/internal",
- is_external=State.is_external,
- id="external",
- ),
- rx.link(
- "External Target", href="/internal", target="_blank", id="external2"
- ),
- )
- @rx.page(route="/internal")
- def internal():
- return rx.text("Internal")
- @pytest.fixture()
- def navigation_app(tmp_path) -> Generator[AppHarness, None, None]:
- """Start NavigationApp app at tmp_path via AppHarness.
- Args:
- tmp_path: pytest tmp_path fixture
- Yields:
- running AppHarness instance
- """
- with AppHarness.create(
- root=tmp_path,
- app_source=NavigationApp, # type: ignore
- ) as harness:
- yield harness
- @pytest.mark.asyncio
- async def test_navigation_app(navigation_app: AppHarness):
- """Type text after moving cursor. Update text on backend.
- Args:
- navigation_app: harness for NavigationApp app
- """
- assert navigation_app.app_instance is not None, "app is not running"
- driver = navigation_app.frontend()
- ss = SessionStorage(driver)
- assert AppHarness._poll_for(lambda: ss.get("token") is not None), "token not found"
- internal_link = driver.find_element(By.ID, "internal")
- with poll_for_navigation(driver):
- internal_link.click()
- assert urlsplit(driver.current_url).path == f"/internal/"
- with poll_for_navigation(driver):
- driver.back()
- external_link = driver.find_element(By.ID, "external")
- external2_link = driver.find_element(By.ID, "external2")
- external_link.click()
- # Expect a new tab to open
- assert AppHarness._poll_for(lambda: len(driver.window_handles) == 2)
- # Switch back to the main tab
- driver.switch_to.window(driver.window_handles[0])
- external2_link.click()
- # Expect another new tab to open
- assert AppHarness._poll_for(lambda: len(driver.window_handles) == 3)
|