|
3 | 3 |
|
4 | 4 | import dash_html_components as html
|
5 | 5 | import dash
|
| 6 | +from dash.dependencies import Input, Output |
| 7 | +from dash.exceptions import PreventUpdate |
6 | 8 |
|
7 | 9 |
|
8 | 10 | RED_BG = """
|
|
14 | 16 |
|
15 | 17 | def test_dvhr001_hot_reload(dash_duo):
|
16 | 18 | app = dash.Dash(__name__, assets_folder="hr_assets")
|
17 |
| - app.layout = html.Div([html.H3("Hot reload")], id="hot-reload-content") |
| 19 | + app.layout = html.Div([ |
| 20 | + html.H3("Hot reload", id="text"), |
| 21 | + html.Button("Click", id="btn") |
| 22 | + ], id="hot-reload-content") |
18 | 23 |
|
19 |
| - dash_duo.start_server( |
20 |
| - app, |
| 24 | + @app.callback(Output("text", "children"), [Input("btn", "n_clicks")]) |
| 25 | + def new_text(n): |
| 26 | + if not n: |
| 27 | + raise PreventUpdate |
| 28 | + return n |
| 29 | + |
| 30 | + hot_reload_settings = dict( |
21 | 31 | dev_tools_hot_reload=True,
|
| 32 | + dev_tools_ui=True, |
| 33 | + dev_tools_serve_dev_bundles=True, |
22 | 34 | dev_tools_hot_reload_interval=0.1,
|
23 | 35 | dev_tools_hot_reload_max_retry=100,
|
24 | 36 | )
|
25 | 37 |
|
| 38 | + dash_duo.start_server(app, **hot_reload_settings) |
| 39 | + |
26 | 40 | # default overload color is blue
|
27 | 41 | dash_duo.wait_for_style_to_equal(
|
28 | 42 | "#hot-reload-content", "background-color", "rgba(0, 0, 255, 1)"
|
@@ -51,3 +65,34 @@ def test_dvhr001_hot_reload(dash_duo):
|
51 | 65 | dash_duo.wait_for_style_to_equal(
|
52 | 66 | "#hot-reload-content", "background-color", "rgba(0, 0, 255, 1)"
|
53 | 67 | )
|
| 68 | + |
| 69 | + # Now check the server status indicator functionality |
| 70 | + |
| 71 | + dash_duo.find_element(".dash-debug-menu").click() |
| 72 | + dash_duo.find_element(".dash-debug-menu__button--available") |
| 73 | + sleep(1) # wait for opening animation |
| 74 | + dash_duo.percy_snapshot(name="hot-reload-available") |
| 75 | + |
| 76 | + dash_duo.server.stop() |
| 77 | + sleep(1) # make sure we would have requested the reload hash multiple times |
| 78 | + dash_duo.find_element(".dash-debug-menu__button--unavailable") |
| 79 | + dash_duo.wait_for_no_elements(".dash-fe-error__title") |
| 80 | + dash_duo.percy_snapshot(name="hot-reload-unavailable") |
| 81 | + |
| 82 | + dash_duo.find_element(".dash-debug-menu").click() |
| 83 | + sleep(1) # wait for opening animation |
| 84 | + dash_duo.find_element(".dash-debug-disconnected") |
| 85 | + dash_duo.percy_snapshot(name="hot-reload-unavailable-small") |
| 86 | + |
| 87 | + dash_duo.find_element("#btn").click() |
| 88 | + dash_duo.wait_for_text_to_equal( |
| 89 | + ".dash-fe-error__title", "Callback failed: the server did not respond." |
| 90 | + ) |
| 91 | + |
| 92 | + # start up the server again |
| 93 | + dash_duo.start_server(app, **hot_reload_settings) |
| 94 | + |
| 95 | + # rerenders with debug menu closed after reload |
| 96 | + # reopen and check that server is now available |
| 97 | + dash_duo.find_element(".dash-debug-menu--closed").click() |
| 98 | + dash_duo.find_element(".dash-debug-menu__button--available") |
0 commit comments