-
Notifications
You must be signed in to change notification settings - Fork 60
/
test_modules.py
141 lines (109 loc) · 4.3 KB
/
test_modules.py
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
"""Tests for `Module`."""
from typing import Dict, Union, cast
import pytest
from shiny import *
from shiny.session import get_current_session
from shiny._connection import MockConnection
from shiny._modules import ModuleInputs, ModuleSession
from shiny._utils import run_coro_sync
from htmltools import TagChildArg
@module_ui
def mod_ui() -> TagChildArg:
return ui.TagList(
ui.input_action_button(id="button", label="module1"),
ui.output_text_verbatim(id="out"),
)
# Note: We currently can't test Session; this is just here for future use.
@module_server
def mod_server(input: Inputs, output: Outputs, session: Session):
count: reactive.Value[int] = reactive.Value(0)
@reactive.Effect()
@event(session.input.button)
def _():
count.set(count() + 1)
@output()
@render_text()
def out() -> str:
return f"Click count is {count()}"
def test_module_ui():
x = cast(ui.TagList, mod_ui("mod1"))
assert cast(ui.Tag, x[0]).attrs["id"] == "mod1_button"
assert cast(ui.Tag, x[1]).attrs["id"] == "mod1_out"
@pytest.mark.asyncio
async def test_inputs_proxy():
input = Inputs(a=1)
input_proxy = ModuleInputs("mod1", input)
with reactive.isolate():
assert input.a() == 1
# Different ways of accessing "a" from the input proxy.
assert input_proxy.a.is_set() is False
assert input_proxy["a"].is_set() is False
assert input["mod1_a"].is_set() is False
input_proxy.a._set(2)
with reactive.isolate():
assert input.a() == 1
assert input_proxy.a() == 2
assert input_proxy["a"]() == 2
assert input["mod1_a"]() == 2
# Nested input proxies
input_proxy_proxy = ModuleInputs("mod2", input_proxy)
with reactive.isolate():
assert input.a() == 1
assert input_proxy.a() == 2
# Different ways of accessing "a" from the input proxy.
assert input_proxy_proxy.a.is_set() is False
assert input_proxy_proxy["a"].is_set() is False
assert input_proxy["mod1_a"].is_set() is False
input_proxy_proxy.a._set(3)
with reactive.isolate():
assert input.a() == 1
assert input_proxy.a() == 2
assert input_proxy_proxy.a() == 3
assert input_proxy_proxy["a"]() == 3
def test_current_session():
sessions: Dict[str, Union[Session, None]] = {}
@module_server
def inner(input: Inputs, output: Outputs, session: Session):
@reactive.Calc()
def out():
return get_current_session()
@reactive.Effect()
def _():
sessions["inner"] = session
sessions["inner_current"] = get_current_session()
sessions["inner_calc_current"] = out()
@module_server
def outer(input: Inputs, output: Outputs, session: Session):
@reactive.Calc()
def out():
return get_current_session()
@reactive.Effect()
def _():
inner("mod_inner")
sessions["outer"] = session
sessions["outer_current"] = get_current_session()
sessions["outer_calc_current"] = out()
def server(input: Inputs, output: Outputs, session: Session):
outer("mod_outer")
@reactive.Calc()
def out():
return get_current_session()
@reactive.Effect()
def _():
sessions["top"] = session
sessions["top_current"] = get_current_session()
sessions["top_calc_current"] = out()
App(ui.TagList(), server)._create_session(MockConnection())
run_coro_sync(reactive.flush())
assert sessions["inner"] is sessions["inner_current"]
assert sessions["inner_current"] is sessions["inner_calc_current"]
assert isinstance(sessions["inner_current"], ModuleSession)
assert sessions["inner_current"]._namespaces == ["mod_outer", "mod_inner"]
assert sessions["outer"] is sessions["outer_current"]
assert sessions["outer_current"] is sessions["outer_calc_current"]
assert isinstance(sessions["outer_current"], ModuleSession)
assert sessions["outer_current"]._namespaces == ["mod_outer"]
assert sessions["top"] is sessions["top_current"]
assert sessions["top_current"] is sessions["top_calc_current"]
assert isinstance(sessions["top_current"], Session)
assert not isinstance(sessions["top_current"], ModuleSession)