Skip to content

Commit 181c2a1

Browse files
committed
Add object of component as props test cases.
1 parent b1b2c67 commit 181c2a1

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

@plotly/dash-test-components/src/components/ComponentAsProp.js

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,32 @@ import PropTypes from 'prop-types';
33

44

55
const ComponentAsProp = (props) => {
6-
const { element, id, shapeEl, list_of_shapes, multi_components } = props;
6+
const {
7+
element,
8+
id,
9+
shapeEl,
10+
list_of_shapes,
11+
multi_components,
12+
dynamic,
13+
dynamic_list,
14+
dynamic_dict,
15+
} = props;
716
return (
817
<div id={id}>
918
{shapeEl && shapeEl.header}
1019
{element}
1120
{shapeEl && shapeEl.footer}
1221
{list_of_shapes && <ul>{list_of_shapes.map(e => <li key={e.value}>{e.label}</li>)}</ul> }
1322
{multi_components && <div>{multi_components.map(m => <div id={m.id} key={m.id}>{m.first} - {m.second}</div>)}</div>}
23+
{
24+
dynamic && <div>{Object.keys(dynamic).map(key => <div id={key} key={key}>{dynamic[key]}</div>)}</div>
25+
}
26+
{
27+
dynamic_dict && dynamic_dict.node && <div>{Object.keys(dynamic_dict.node).map(key => <div id={key} key={key}>{dynamic_dict.node[key]}</div>)}</div>
28+
}
29+
{
30+
dynamic_list && <div>{dynamic_list.map((obj, i) => Object.keys(obj).map(key => <div id={key} key={key}>{obj[key]}</div>))}</div>
31+
}
1432
</div>
1533
)
1634
}
@@ -37,7 +55,15 @@ ComponentAsProp.propTypes = {
3755
first: PropTypes.node,
3856
second: PropTypes.node,
3957
})
40-
)
58+
),
59+
60+
dynamic: PropTypes.objectOf(PropTypes.node),
61+
62+
dynamic_list: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.node)),
63+
64+
dynamic_dict: PropTypes.shape({
65+
node: PropTypes.objectOf(PropTypes.node),
66+
})
4167
}
4268

4369
export default ComponentAsProp;

tests/integration/renderer/test_component_as_prop.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,22 @@ def test_rdcap001_component_as_prop(dash_duo):
102102
"id": "multi2",
103103
"first": Span("foo"),
104104
"second": Span("bar"),
105-
}
105+
},
106+
],
107+
),
108+
ComponentAsProp(id="dynamic", dynamic={"inside-dynamic": Div("dynamic")}),
109+
ComponentAsProp(
110+
id="dynamic-dict", dynamic_dict={"node": {"dict-dyn": Div("dict-dyn")}}
111+
),
112+
ComponentAsProp(
113+
dynamic={
114+
"output-dynamic": Div(id="output-dynamic"),
115+
"dyn-clicker": Button("click", id="click-dynamic"),
116+
},
117+
),
118+
ComponentAsProp(
119+
dynamic_list=[
120+
{"dyn-list": Div("dynamic-list")},
106121
],
107122
),
108123
]
@@ -155,6 +170,14 @@ def send_to_list_of_dict(n_clicks):
155170
def updated_from_list(*_):
156171
return callback_context.triggered[0]["prop_id"]
157172

173+
@app.callback(
174+
Output("output-dynamic", "children"),
175+
Input("click-dynamic", "n_clicks"),
176+
prevent_initial_call=True,
177+
)
178+
def on_click(n_clicks):
179+
return f"Clicked {n_clicks}"
180+
158181
dash_duo.start_server(app)
159182

160183
assert dash_duo.get_logs() == []
@@ -205,4 +228,13 @@ def updated_from_list(*_):
205228
dash_duo.wait_for_text_to_equal("#multi", "first - second")
206229
dash_duo.wait_for_text_to_equal("#multi2", "foo - bar")
207230

231+
dash_duo.wait_for_text_to_equal("#inside-dynamic", "dynamic")
232+
dash_duo.wait_for_text_to_equal("#dict-dyn", "dict-dyn")
233+
234+
dash_duo.wait_for_text_to_equal("#dyn-list", "dynamic-list")
235+
236+
dash_duo.find_element("#click-dynamic").click()
237+
238+
dash_duo.wait_for_text_to_equal("#dynamic-output", "Clicked 1")
239+
208240
assert dash_duo.get_logs() == []

0 commit comments

Comments
 (0)