test_storage.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import asyncio
  2. from nicegui import Client, app, 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.open('/')
  13. screen.should_contain('1')
  14. screen.open('/')
  15. screen.should_contain('2')
  16. screen.open('/')
  17. screen.should_contain('3')
  18. screen.open('/count')
  19. screen.should_contain('count = 3') # also works with FastAPI endpoints
  20. def test_browser_storage_supports_asyncio(screen: Screen):
  21. @ui.page('/')
  22. async def page():
  23. app.storage.browser['count'] = app.storage.browser.get('count', 0) + 1
  24. await asyncio.sleep(0.5)
  25. ui.label(app.storage.browser['count'])
  26. screen.open('/')
  27. screen.switch_to(1)
  28. screen.open('/')
  29. screen.should_contain('2')
  30. screen.switch_to(0)
  31. screen.open('/')
  32. screen.should_contain('3')
  33. def test_browser_storage_modifications_after_page_load_are_forbidden(screen: Screen):
  34. @ui.page('/')
  35. async def page(client: Client):
  36. await client.connected()
  37. try:
  38. app.storage.browser['test'] = 'data'
  39. except TypeError as e:
  40. ui.label(str(e))
  41. screen.open('/')
  42. screen.should_contain('response to the browser has already been build')
  43. def test_individual_storage_modifications(screen: Screen):
  44. @ui.page('/')
  45. async def page(client: Client, delayed: bool = False):
  46. if delayed:
  47. await client.connected()
  48. app.storage.individual['count'] = app.storage.individual.get('count', 0) + 1
  49. ui.label().bind_text_from(app.storage.individual, 'count')
  50. screen.open('/')
  51. screen.should_contain('1')
  52. screen.open('/?delayed=True')
  53. screen.should_contain('2')
  54. screen.open('/')
  55. screen.should_contain('3')
  56. def test_individual_and_general_storage_is_persisted(screen: Screen):
  57. @ui.page('/')
  58. def page():
  59. app.storage.individual['count'] = app.storage.individual.get('count', 0) + 1
  60. app.storage.general['count'] = app.storage.general.get('count', 0) + 1
  61. ui.label(f'individual: {app.storage.individual["count"]}')
  62. ui.label(f'general: {app.storage.general["count"]}')
  63. ui.button('backup', on_click=app.storage.backup)
  64. screen.open('/')
  65. screen.open('/')
  66. screen.open('/')
  67. screen.should_contain('individual: 3')
  68. screen.should_contain('general: 3')
  69. screen.click('backup')
  70. screen.selenium.delete_all_cookies()
  71. screen.open('/')
  72. screen.should_contain('individual: 1')
  73. screen.should_contain('general: 4')