test_storage.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import asyncio
  2. from pathlib import Path
  3. from nicegui import Client, app, background_tasks, ui
  4. from .screen import Screen
  5. def test_browser_data_is_stored_in_the_browser(screen: Screen):
  6. @ui.page('/')
  7. def page():
  8. app.storage.browser['count'] = app.storage.browser.get('count', 0) + 1
  9. ui.label().bind_text_from(app.storage.browser, 'count')
  10. @app.get('/count')
  11. def count():
  12. return 'count = ' + str(app.storage.browser['count'])
  13. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  14. screen.open('/')
  15. screen.should_contain('1')
  16. screen.open('/')
  17. screen.should_contain('2')
  18. screen.open('/')
  19. screen.should_contain('3')
  20. screen.open('/count')
  21. screen.should_contain('count = 3') # also works with FastAPI endpoints
  22. def test_browser_storage_supports_asyncio(screen: Screen):
  23. @ui.page('/')
  24. async def page():
  25. app.storage.browser['count'] = app.storage.browser.get('count', 0) + 1
  26. await asyncio.sleep(0.5)
  27. ui.label(app.storage.browser['count'])
  28. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  29. screen.open('/')
  30. screen.switch_to(1)
  31. screen.open('/')
  32. screen.should_contain('2')
  33. screen.switch_to(0)
  34. screen.open('/')
  35. screen.should_contain('3')
  36. def test_browser_storage_modifications_after_page_load_are_forbidden(screen: Screen):
  37. @ui.page('/')
  38. async def page(client: Client):
  39. await client.connected()
  40. try:
  41. app.storage.browser['test'] = 'data'
  42. except TypeError as e:
  43. ui.label(str(e))
  44. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  45. screen.open('/')
  46. screen.should_contain('response to the browser has already been built')
  47. def test_user_storage_modifications(screen: Screen):
  48. @ui.page('/')
  49. async def page(client: Client, delayed: bool = False):
  50. if delayed:
  51. await client.connected()
  52. app.storage.user['count'] = app.storage.user.get('count', 0) + 1
  53. ui.label().bind_text_from(app.storage.user, 'count')
  54. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  55. screen.open('/')
  56. screen.should_contain('1')
  57. screen.open('/?delayed=True')
  58. screen.should_contain('2')
  59. screen.open('/')
  60. screen.should_contain('3')
  61. async def test_access_user_storage_on_interaction(screen: Screen):
  62. @ui.page('/')
  63. async def page():
  64. if 'test_switch' not in app.storage.user:
  65. app.storage.user['test_switch'] = False
  66. ui.switch('switch').bind_value(app.storage.user, 'test_switch')
  67. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  68. screen.open('/')
  69. screen.click('switch')
  70. screen.wait(0.5)
  71. assert '{"test_switch": true}' in next(Path('.nicegui').glob('storage_user_*.json')).read_text()
  72. def test_access_user_storage_from_button_click_handler(screen: Screen):
  73. @ui.page('/')
  74. async def page():
  75. ui.button('test', on_click=app.storage.user.update(inner_function='works'))
  76. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  77. screen.open('/')
  78. screen.click('test')
  79. screen.wait(1)
  80. assert '{"inner_function": "works"}' in next(Path('.nicegui').glob('storage_user_*.json')).read_text()
  81. async def test_access_user_storage_from_background_task(screen: Screen):
  82. @ui.page('/')
  83. def page():
  84. async def subtask():
  85. await asyncio.sleep(0.1)
  86. app.storage.user['subtask'] = 'works'
  87. background_tasks.create(subtask())
  88. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  89. screen.open('/')
  90. assert '{"subtask": "works"}' in next(Path('.nicegui').glob('storage_user_*.json')).read_text()
  91. def test_user_and_general_storage_is_persisted(screen: Screen):
  92. @ui.page('/')
  93. def page():
  94. app.storage.user['count'] = app.storage.user.get('count', 0) + 1
  95. app.storage.general['count'] = app.storage.general.get('count', 0) + 1
  96. ui.label(f'user: {app.storage.user["count"]}')
  97. ui.label(f'general: {app.storage.general["count"]}')
  98. screen.ui_run_kwargs['storage_secret'] = 'just a test'
  99. screen.open('/')
  100. screen.open('/')
  101. screen.open('/')
  102. screen.should_contain('user: 3')
  103. screen.should_contain('general: 3')
  104. screen.selenium.delete_all_cookies()
  105. screen.open('/')
  106. screen.should_contain('user: 1')
  107. screen.should_contain('general: 4')