test_storage.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import asyncio
  2. from uuid import uuid4
  3. from nicegui import Client, app, 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(app.storage.browser['count'] or 'no session')
  10. @app.get('/count')
  11. def count():
  12. return 'count = ' + str(app.storage.browser['count'])
  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'] or 'no session')
  27. screen.open('/')
  28. screen.switch_to(1)
  29. screen.open('/')
  30. screen.should_contain('2')
  31. screen.switch_to(0)
  32. screen.open('/')
  33. screen.should_contain('3')
  34. def test_browser_storage_modifications_after_page_load_are_forbidden(screen: Screen):
  35. @ui.page('/')
  36. async def page(client: Client):
  37. await client.connected()
  38. try:
  39. app.storage.browser['test'] = 'data'
  40. except TypeError as e:
  41. ui.label(str(e))
  42. screen.open('/')
  43. screen.should_contain('response to the browser has already been build')
  44. def test_individual_storage_modifications(screen: Screen):
  45. @ui.page('/')
  46. async def page(client: Client, delayed: bool = False):
  47. if delayed:
  48. await client.connected()
  49. app.storage.individual['count'] = app.storage.individual.get('count', 0) + 1
  50. ui.label(app.storage.individual['count'] or 'no session')
  51. screen.open('/')
  52. screen.should_contain('1')
  53. screen.open('/?delayed=True')
  54. screen.should_contain('2')
  55. screen.open('/')
  56. screen.should_contain('3')
  57. def test_individual_and_general_storage_is_persisted(screen: Screen):
  58. @ui.page('/')
  59. def page():
  60. app.storage.individual['count'] = app.storage.individual.get('count', 0) + 1
  61. app.storage.general['count'] = app.storage.general.get('count', 0) + 1
  62. ui.label(f'individual: {app.storage.individual["count"]}')
  63. ui.label(f'general: {app.storage.general["count"]}')
  64. ui.button('backup', on_click=app.storage.backup)
  65. screen.open('/')
  66. screen.open('/')
  67. screen.open('/')
  68. screen.should_contain('individual: 3')
  69. screen.should_contain('general: 3')
  70. screen.click('backup')
  71. screen.selenium.delete_all_cookies()
  72. screen.open('/')
  73. screen.should_contain('individual: 1')
  74. screen.should_contain('general: 4')