forked from reactive-python/reactpy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_pyscript.py
More file actions
114 lines (81 loc) · 3.75 KB
/
test_pyscript.py
File metadata and controls
114 lines (81 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# ruff: noqa: S701
from pathlib import Path
import pytest
from jinja2 import Environment as JinjaEnvironment
from jinja2 import FileSystemLoader as JinjaFileSystemLoader
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.templating import Jinja2Templates
from reactpy import html
from reactpy.executors.asgi.pyscript import ReactPyCsr
from reactpy.testing import BackendFixture, DisplayFixture
@pytest.fixture(scope="module")
async def display(browser):
"""Override for the display fixture that uses ReactPyMiddleware."""
app = ReactPyCsr(
Path(__file__).parent / "pyscript_components" / "root.py",
initial=html.div({"id": "loading"}, "Loading..."),
)
async with BackendFixture(app) as server:
async with DisplayFixture(
backend=server, browser=browser, timeout=20
) as new_display:
yield new_display
@pytest.fixture(scope="module")
async def multi_file_display(browser):
"""Override for the display fixture that uses ReactPyMiddleware."""
app = ReactPyCsr(
Path(__file__).parent / "pyscript_components" / "load_first.py",
Path(__file__).parent / "pyscript_components" / "load_second.py",
initial=html.div({"id": "loading"}, "Loading..."),
)
async with BackendFixture(app) as server:
async with DisplayFixture(backend=server, browser=browser) as new_display:
yield new_display
@pytest.fixture(scope="module")
async def jinja_display(browser):
"""Override for the display fixture that uses ReactPyMiddleware."""
templates = Jinja2Templates(
env=JinjaEnvironment(
loader=JinjaFileSystemLoader("tests/templates"),
extensions=["reactpy.templatetags.ReactPyJinja"],
)
)
async def homepage(request):
return templates.TemplateResponse(request, "pyscript.html")
app = Starlette(routes=[Route("/", homepage)])
async with BackendFixture(app) as server:
async with DisplayFixture(backend=server, browser=browser) as new_display:
yield new_display
async def test_root_component(display: DisplayFixture):
await display.goto("/")
await display.page.wait_for_selector("#loading")
await display.page.wait_for_selector("#incr")
await display.page.click("#incr")
await display.page.wait_for_selector("#incr[data-count='1']")
await display.page.click("#incr")
await display.page.wait_for_selector("#incr[data-count='2']")
await display.page.click("#incr")
await display.page.wait_for_selector("#incr[data-count='3']")
async def test_multi_file_components(multi_file_display: DisplayFixture):
await multi_file_display.goto("/")
await multi_file_display.page.wait_for_selector("#incr")
await multi_file_display.page.click("#incr")
await multi_file_display.page.wait_for_selector("#incr[data-count='1']")
await multi_file_display.page.click("#incr")
await multi_file_display.page.wait_for_selector("#incr[data-count='2']")
await multi_file_display.page.click("#incr")
await multi_file_display.page.wait_for_selector("#incr[data-count='3']")
def test_bad_file_path():
with pytest.raises(ValueError):
ReactPyCsr()
async def test_jinja_template_tag(jinja_display: DisplayFixture):
await jinja_display.goto("/")
await jinja_display.page.wait_for_selector("#loading")
await jinja_display.page.wait_for_selector("#incr")
await jinja_display.page.click("#incr")
await jinja_display.page.wait_for_selector("#incr[data-count='1']")
await jinja_display.page.click("#incr")
await jinja_display.page.wait_for_selector("#incr[data-count='2']")
await jinja_display.page.click("#incr")
await jinja_display.page.wait_for_selector("#incr[data-count='3']")