test_storage.py 4.5 KB

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