test_auto_context.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import asyncio
  2. from typing import Generator
  3. from nicegui import ui
  4. from nicegui.events import PageEvent
  5. from .screen import Screen
  6. def test_adding_element_to_shared_index_page(screen: Screen):
  7. ui.button('add label', on_click=lambda: ui.label('added'))
  8. screen.open('/')
  9. screen.click('add label')
  10. screen.should_contain('added')
  11. def test_adding_element_to_private_page(screen: Screen):
  12. @ui.page('/')
  13. def page():
  14. ui.button('add label', on_click=lambda: ui.label('added'))
  15. screen.open('/')
  16. screen.click('add label')
  17. screen.should_contain('added')
  18. def test_adding_elements_with_async_await(screen: Screen):
  19. async def add_a():
  20. await asyncio.sleep(0.1)
  21. ui.label('A')
  22. async def add_b():
  23. await asyncio.sleep(0.1)
  24. ui.label('B')
  25. with ui.card():
  26. ui.timer(1.0, add_a, once=True)
  27. with ui.card():
  28. ui.timer(1.1, add_b, once=True)
  29. screen.open('/')
  30. for _ in range(100):
  31. if ' card\n A\n card\n B' in screen.render_content():
  32. return
  33. screen.wait(0.1)
  34. raise AssertionError(f'{screen.render_content()} should show cards with "A" and "B"')
  35. def test_adding_elements_during_onconnect(screen: Screen):
  36. ui.label('Label 1')
  37. ui.on_connect(lambda: ui.label('Label 2'))
  38. screen.open('/')
  39. screen.should_contain('Label 2')
  40. def test_autoupdate_on_async_page_after_yield(screen: Screen):
  41. @ui.page('/')
  42. async def page() -> Generator[None, PageEvent, None]:
  43. ui.label('before page is ready')
  44. yield
  45. ui.label('page ready')
  46. await asyncio.sleep(1)
  47. ui.label('one')
  48. await asyncio.sleep(1)
  49. ui.label('two')
  50. await asyncio.sleep(1)
  51. ui.label('three')
  52. screen.open('/')
  53. screen.should_contain('before page is ready')
  54. screen.should_contain('page ready')
  55. screen.should_not_contain('one')
  56. screen.wait_for('one')
  57. screen.should_not_contain('two')
  58. screen.wait_for('two')
  59. screen.should_not_contain('three')
  60. screen.wait_for('three')
  61. def test_autoupdate_on_async_page_ready_callback(screen: Screen):
  62. async def ready():
  63. ui.label('page ready')
  64. await asyncio.sleep(1)
  65. ui.label('after delay')
  66. @ui.page('/', on_page_ready=ready)
  67. def page() -> Generator[None, PageEvent, None]:
  68. ui.label('before page is ready')
  69. screen.open('/')
  70. screen.should_contain('before page is ready')
  71. screen.should_contain('page ready')
  72. screen.should_not_contain('after delay')
  73. screen.wait_for('after delay')
  74. def test_autoupdate_on_async_event_handler(screen: Screen):
  75. async def open():
  76. with ui.dialog() as dialog, ui.card():
  77. l = ui.label('This should be visible')
  78. dialog.open()
  79. await asyncio.sleep(1)
  80. l.text = "New text after 1 second"
  81. ui.button('Dialog', on_click=open)
  82. screen.open('/')
  83. screen.click('Dialog')
  84. screen.should_contain('This should be visible')
  85. screen.should_not_contain('New text after 1 second')
  86. screen.wait_for('New text after 1 second')