Skip to content

Commit 75648f7

Browse files
committed
Add tests to .update_cell_value() and .update_data()
1 parent 8adf597 commit 75648f7

File tree

4 files changed

+171
-29
lines changed

4 files changed

+171
-29
lines changed

tests/playwright/shiny/components/data_frame/update_cell_value/app.py

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,51 @@
33
from __future__ import annotations
44

55
import palmerpenguins # pyright: ignore[reportMissingTypeStubs]
6+
import polars as pl
67

78
from shiny import reactive
89
from shiny.express import input, render, ui
910

10-
pd_df = palmerpenguins.load_penguins_raw().iloc[0:2, 0:2]
11+
pd_data = palmerpenguins.load_penguins_raw().iloc[0:2, 0:2]
12+
pl_data = pl.DataFrame(pd_data)
1113

12-
with ui.card():
14+
with ui.layout_column_wrap(width=1 / 2):
1315

14-
ui.input_action_button("update_btn", "Update cell")
16+
with ui.card():
1517

16-
@render.data_frame
17-
def dt():
18-
return pd_df
18+
ui.h3("Pandas")
1919

20+
ui.input_action_button("update_pd_btn", "Update cell")
2021

21-
@reactive.effect
22-
@reactive.event(input.update_btn)
23-
async def update_cell():
22+
@render.data_frame
23+
def pd_df():
24+
return pd_data
2425

25-
await dt.update_cell_value(
26-
"new_value - " + str(input.update_btn()),
27-
row=0,
28-
col=0,
29-
)
26+
@reactive.effect
27+
@reactive.event(input.update_pd_btn)
28+
async def _():
29+
30+
await pd_df.update_cell_value(
31+
"pandas - " + str(input.update_pd_btn()),
32+
row=0,
33+
col=0,
34+
)
35+
36+
with ui.card():
37+
38+
ui.h3("Polars")
39+
ui.input_action_button("update_pl_btn", "Update cell")
40+
41+
@render.data_frame
42+
def pl_df():
43+
return pl_data
44+
45+
@reactive.effect
46+
@reactive.event(input.update_pl_btn)
47+
async def _():
48+
49+
await pl_df.update_cell_value(
50+
"polars - " + str(input.update_pl_btn()),
51+
row=0,
52+
col=0,
53+
)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from __future__ import annotations
2+
3+
from playwright.sync_api import Page
4+
5+
from shiny.playwright import controller
6+
from shiny.run import ShinyAppProc
7+
8+
9+
def test_update_cell_value(page: Page, local_app: ShinyAppProc) -> None:
10+
page.goto(local_app.url)
11+
12+
pd_df = controller.OutputDataFrame(page, "pd_df")
13+
pd_df.expect_cell("PAL0708", row=0, col=0)
14+
15+
pl_df = controller.OutputDataFrame(page, "pl_df")
16+
pl_df.expect_cell("PAL0708", row=0, col=0)
17+
18+
pd_btn = controller.InputActionButton(page, "update_pd_btn")
19+
pl_btn = controller.InputActionButton(page, "update_pl_btn")
20+
21+
# Update pandas
22+
pd_btn.click()
23+
pd_df.expect_cell("pandas - 1", row=0, col=0)
24+
pl_df.expect_cell("PAL0708", row=0, col=0)
25+
26+
# Update polars
27+
pl_btn.click()
28+
pl_btn.click()
29+
pl_btn.click()
30+
31+
pd_df.expect_cell("pandas - 1", row=0, col=0)
32+
pl_df.expect_cell("polars - 3", row=0, col=0)
33+
34+
# Verify other cells do not change
35+
pd_df.expect_cell("PAL0708", row=1, col=0)
36+
pd_df.expect_cell("1", row=0, col=1)
37+
pd_df.expect_cell("2", row=1, col=1)
38+
39+
pl_df.expect_cell("PAL0708", row=1, col=0)
40+
pl_df.expect_cell("1", row=0, col=1)
41+
pl_df.expect_cell("2", row=1, col=1)

tests/playwright/shiny/components/data_frame/update_data/app.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from shiny import reactive
99
from shiny.express import input, render, ui
1010

11-
pd_df = palmerpenguins.load_penguins_raw()
11+
pd_data = palmerpenguins.load_penguins_raw()
1212

1313

1414
with ui.card():
@@ -19,9 +19,9 @@
1919
ui.h4("Data")
2020

2121
@render.data_frame
22-
def dt():
22+
def df():
2323
return render.DataGrid(
24-
pd_df.iloc[:, 0:2],
24+
pd_data.iloc[:, 0:2],
2525
selection_mode="rows",
2626
filters=True,
2727
editable=True,
@@ -30,18 +30,18 @@ def dt():
3030
ui.h4("Selected data")
3131

3232
@render.data_frame
33-
def dt_selected():
34-
return dt.data_view(selected=True)
33+
def df_selected():
34+
return df.data_view(selected=True)
3535

3636
@reactive.effect
37-
@reactive.event(dt.cell_selection)
37+
@reactive.event(df.cell_selection)
3838
def _on_cell_selection():
39-
print("Cell selected", dt.cell_selection())
39+
print("Cell selected", df.cell_selection())
4040
return
4141

4242

4343
# Reactive value to store the un-subsetted data
44-
full_data = reactive.value(pd_df)
44+
full_data = reactive.value(pd_data)
4545

4646

4747
@reactive.effect
@@ -54,7 +54,7 @@ async def shift_data():
5454
k = 2
5555
shift = (k * input.shift_btn()) % full_data().shape[0]
5656
subsetted_data = full_data().iloc[(0 + shift) : (k + shift), 0:2]
57-
await dt.update_data(subsetted_data)
57+
await df.update_data(subsetted_data)
5858
return
5959

6060

@@ -69,14 +69,13 @@ async def different_data():
6969
"input.different_btn()", input.different_btn(), input.different_btn() % 2 == 0
7070
)
7171
if input.different_btn() % 2 == 0:
72-
# await dt.update_data(pd_df.iloc[:, 0:2])
73-
await dt.update_data(pd_df)
74-
full_data.set(pd_df)
72+
await df.update_data(pd_data)
73+
full_data.set(pd_data)
7574
return
7675

7776
new_df = pd.DataFrame(
7877
{
79-
"studyName": [
78+
"Letter": [
8079
"a",
8180
"b",
8281
"c",
@@ -104,9 +103,9 @@ async def different_data():
104103
"y",
105104
"z",
106105
],
107-
"Sample Number": [-1 * i for i in range(1, 27)],
106+
"Negative index": [-1 * i for i in range(1, 27)],
108107
},
109108
)
110-
await dt.update_data(new_df)
109+
await df.update_data(new_df)
111110
full_data.set(new_df)
112111
return
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from __future__ import annotations
2+
3+
from playwright.sync_api import Page
4+
5+
from shiny.playwright import controller
6+
from shiny.run import ShinyAppProc
7+
8+
9+
def test_update_data(page: Page, local_app: ShinyAppProc) -> None:
10+
page.goto(local_app.url)
11+
12+
df = controller.OutputDataFrame(page, "df")
13+
df_selected = controller.OutputDataFrame(page, "df_selected")
14+
shift_btn = controller.InputActionButton(page, "shift_btn")
15+
different_btn = controller.InputActionButton(page, "different_btn")
16+
17+
# df.expect_nrow(344) # TODO-barret; broken
18+
df.expect_ncol(2)
19+
df_selected.expect_column_labels(["studyName", "Sample Number"])
20+
21+
df_selected.expect_nrow(0)
22+
df_selected.expect_ncol(2)
23+
df_selected.expect_column_labels(["studyName", "Sample Number"])
24+
25+
df.select_rows([1])
26+
df_selected.expect_nrow(1)
27+
df_selected.expect_cell("2", row=0, col=1)
28+
29+
# Shift data
30+
shift_btn.click()
31+
df.expect_nrow(2)
32+
df.expect_ncol(2)
33+
df.expect_column_labels(["studyName", "Sample Number"])
34+
df.expect_selected_rows([1])
35+
df.expect_cell("3", row=0, col=1)
36+
df.expect_cell("4", row=1, col=1)
37+
df_selected.expect_nrow(1)
38+
df_selected.expect_ncol(2)
39+
df_selected.expect_cell("4", row=0, col=1)
40+
41+
# Change data set
42+
different_btn.click()
43+
df.expect_nrow(26)
44+
df.expect_ncol(2)
45+
df.expect_column_labels(["Letter", "Negative index"])
46+
df.expect_selected_rows([1])
47+
48+
df_selected.expect_nrow(1)
49+
df_selected.expect_ncol(2)
50+
df_selected.expect_cell("b", row=0, col=0)
51+
df_selected.expect_cell("-2", row=0, col=1)
52+
53+
# Change data set again
54+
different_btn.click()
55+
# df.expect_nrow(344) # TODO-barret; broken
56+
df.expect_ncol(17)
57+
df.expect_column_labels(
58+
[
59+
"studyName",
60+
"Sample Number",
61+
"Species",
62+
"Region",
63+
"Island",
64+
"Stage",
65+
"Individual ID",
66+
"Clutch Completion",
67+
"Date Egg",
68+
"Culmen Length (mm)",
69+
"Culmen Depth (mm)",
70+
"Flipper Length (mm)",
71+
"Body Mass (g)",
72+
"Sex",
73+
"Delta 15 N (o/oo)",
74+
"Delta 13 C (o/oo)",
75+
"Comments",
76+
]
77+
)
78+
df.expect_selected_rows([1])

0 commit comments

Comments
 (0)