|
5 | 5 | import os
|
6 | 6 | import sys
|
7 | 7 | import time
|
| 8 | +import json |
8 | 9 | import pandas as pd
|
9 | 10 |
|
10 | 11 | import dash
|
11 | 12 | from dash.dependencies import Input, Output, State
|
12 | 13 | import dash_html_components as html
|
13 | 14 | import dash_core_components as dcc
|
14 | 15 | import dash_table_experiments as dt
|
15 |
| -from selenium import webdriver |
16 | 16 | from selenium.webdriver.common.keys import Keys
|
17 | 17 | from selenium.common.exceptions import InvalidElementStateException
|
18 | 18 |
|
@@ -708,6 +708,7 @@ def update_output(start_date, end_date):
|
708 | 708 | end_date.click()
|
709 | 709 |
|
710 | 710 | self.assertEquals(date_content.text, '1997-05-03 - 1997-05-04')
|
| 711 | + |
711 | 712 | def test_interval(self):
|
712 | 713 | app = dash.Dash(__name__)
|
713 | 714 | app.layout = html.Div([
|
@@ -792,3 +793,60 @@ def test_confirm_dialog_provider(self):
|
792 | 793 | ])
|
793 | 794 |
|
794 | 795 | self._test_confirm(app, 'ConfirmDialogProvider')
|
| 796 | + |
| 797 | + def test_storage_component(self): |
| 798 | + app = dash.Dash(__name__) |
| 799 | + |
| 800 | + getter = 'return window.sessionStorage.getItem("{}");' |
| 801 | + clicked_getter = getter.format('storage') |
| 802 | + dummy_getter = getter.format('dummy') |
| 803 | + dummy_data = 'Hello world' |
| 804 | + |
| 805 | + app.layout = html.Div([ |
| 806 | + dcc.Storage(id='storage', |
| 807 | + storage_type='session'), |
| 808 | + html.Button('click me', id='btn'), |
| 809 | + html.Button('clear', id='clear-btn'), |
| 810 | + dcc.Storage(id='dummy', |
| 811 | + storage_type='session', |
| 812 | + data=dummy_data) |
| 813 | + ]) |
| 814 | + |
| 815 | + @app.callback(Output('storage', 'data'), |
| 816 | + [Input('btn', 'n_clicks')], |
| 817 | + [State('storage', 'data')]) |
| 818 | + def on_click(n_clicks, storage): |
| 819 | + if n_clicks is None: |
| 820 | + return |
| 821 | + storage = storage or {} |
| 822 | + return {'clicked': storage.get('clicked', 0) + 1} |
| 823 | + |
| 824 | + @app.callback(Output('storage', 'clear_data'), |
| 825 | + [Input('clear-btn', 'n_clicks')]) |
| 826 | + def on_clear(n_clicks): |
| 827 | + if n_clicks is None: |
| 828 | + return |
| 829 | + return True |
| 830 | + |
| 831 | + self.startServer(app) |
| 832 | + |
| 833 | + time.sleep(1) |
| 834 | + |
| 835 | + dummy = self.driver.execute_script(dummy_getter) |
| 836 | + self.assertEqual(dummy_data, dummy) |
| 837 | + |
| 838 | + click_btn = self.wait_for_element_by_css_selector('#btn') |
| 839 | + clear_btn = self.wait_for_element_by_css_selector('#clear-btn') |
| 840 | + |
| 841 | + for i in range(10): |
| 842 | + click_btn.click() |
| 843 | + time.sleep(0.5) |
| 844 | + |
| 845 | + click_data = json.loads(self.driver.execute_script(clicked_getter)) |
| 846 | + self.assertEqual(i+1, click_data.get('clicked')) |
| 847 | + |
| 848 | + clear_btn.click() |
| 849 | + time.sleep(0.5) |
| 850 | + |
| 851 | + cleared_data = self.driver.execute_script(clicked_getter) |
| 852 | + self.assertTrue(cleared_data is None) |
0 commit comments