test_storage.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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.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. async def test_access_individual_storage_on_interaction(screen: Screen):
  57. @ui.page('/')
  58. async def page():
  59. if 'test_switch' not in app.storage.individual:
  60. app.storage.individual['test_switch'] = False
  61. ui.switch('switch').bind_value(app.storage.individual, 'test_switch')
  62. screen.open('/')
  63. screen.click('switch')
  64. screen.wait(1)
  65. await app.storage.backup()
  66. assert '{"test_switch": true}' in app.storage._individuals.filename.read_text()
  67. def test_access_individual_storage_from_button_click_handler(screen: Screen):
  68. @ui.page('/')
  69. async def page():
  70. async def inner():
  71. app.storage.individual['inner_function'] = 'works'
  72. await app.storage.backup()
  73. ui.button('test', on_click=inner)
  74. screen.open('/')
  75. screen.click('test')
  76. screen.wait(1)
  77. assert '{"inner_function": "works"}' in app.storage._individuals.filename.read_text()
  78. async def test_access_individual_storage_from_background_task(screen: Screen):
  79. @ui.page('/')
  80. def page():
  81. async def subtask():
  82. await asyncio.sleep(0.1)
  83. app.storage.individual['subtask'] = 'works'
  84. await app.storage.backup()
  85. background_tasks.create(subtask())
  86. screen.open('/')
  87. assert '{"subtask": "works"}' in app.storage._individuals.filename.read_text()
  88. def test_individual_and_general_storage_is_persisted(screen: Screen):
  89. @ui.page('/')
  90. def page():
  91. app.storage.individual['count'] = app.storage.individual.get('count', 0) + 1
  92. app.storage.general['count'] = app.storage.general.get('count', 0) + 1
  93. ui.label(f'individual: {app.storage.individual["count"]}')
  94. ui.label(f'general: {app.storage.general["count"]}')
  95. ui.button('backup', on_click=app.storage.backup)
  96. screen.open('/')
  97. screen.open('/')
  98. screen.open('/')
  99. screen.should_contain('individual: 3')
  100. screen.should_contain('general: 3')
  101. screen.click('backup')
  102. screen.selenium.delete_all_cookies()
  103. screen.open('/')
  104. screen.should_contain('individual: 1')
  105. screen.should_contain('general: 4')