test_auto_context.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import asyncio
  2. from typing import Generator
  3. from nicegui import ui
  4. from nicegui.events import PageEvent
  5. from nicegui.task_logger import create_task
  6. from .screen import Screen
  7. def test_adding_element_to_shared_index_page(screen: Screen):
  8. ui.button('add label', on_click=lambda: ui.label('added'))
  9. screen.open('/')
  10. screen.click('add label')
  11. screen.should_contain('added')
  12. def test_adding_element_to_private_page(screen: Screen):
  13. @ui.page('/')
  14. def page():
  15. ui.button('add label', on_click=lambda: ui.label('added'))
  16. screen.open('/')
  17. screen.click('add label')
  18. screen.should_contain('added')
  19. def test_adding_elements_with_async_await(screen: Screen):
  20. async def add_a():
  21. await asyncio.sleep(0.1)
  22. ui.label('A')
  23. async def add_b():
  24. await asyncio.sleep(0.1)
  25. ui.label('B')
  26. with ui.card():
  27. ui.timer(1.0, add_a, once=True)
  28. with ui.card():
  29. ui.timer(1.1, add_b, once=True)
  30. screen.open('/')
  31. for _ in range(100):
  32. if ' card\n A\n card\n B' in screen.render_content():
  33. return
  34. screen.wait(0.1)
  35. raise AssertionError(f'{screen.render_content()} should show cards with "A" and "B"')
  36. def test_adding_elements_during_onconnect(screen: Screen):
  37. ui.label('Label 1')
  38. ui.on_connect(lambda: ui.label('Label 2'))
  39. screen.open('/')
  40. screen.should_contain('Label 2')
  41. def test_autoupdate_on_async_page_after_yield(screen: Screen):
  42. @ui.page('/')
  43. async def page() -> Generator[None, PageEvent, None]:
  44. ui.label('before page is ready')
  45. yield
  46. ui.label('page ready')
  47. await asyncio.sleep(1)
  48. ui.label('one')
  49. await asyncio.sleep(1)
  50. ui.label('two')
  51. await asyncio.sleep(1)
  52. ui.label('three')
  53. screen.open('/')
  54. screen.should_contain('before page is ready')
  55. screen.should_contain('page ready')
  56. screen.should_not_contain('one')
  57. screen.wait_for('one')
  58. screen.should_not_contain('two')
  59. screen.wait_for('two')
  60. screen.should_not_contain('three')
  61. screen.wait_for('three')
  62. def test_autoupdate_on_async_page_ready_callback(screen: Screen):
  63. async def ready():
  64. ui.label('page ready')
  65. await asyncio.sleep(1)
  66. ui.label('after delay')
  67. @ui.page('/', on_page_ready=ready)
  68. def page() -> Generator[None, PageEvent, None]:
  69. ui.label('before page is ready')
  70. screen.open('/')
  71. screen.should_contain('before page is ready')
  72. screen.should_contain('page ready')
  73. screen.should_not_contain('after delay')
  74. screen.wait_for('after delay')
  75. def test_autoupdate_on_async_event_handler(screen: Screen):
  76. async def open():
  77. with ui.dialog() as dialog, ui.card():
  78. l = ui.label('This should be visible')
  79. dialog.open()
  80. await asyncio.sleep(1)
  81. l.text = 'New text after 1 second'
  82. ui.button('Dialog', on_click=open)
  83. screen.open('/')
  84. screen.click('Dialog')
  85. screen.should_contain('This should be visible')
  86. screen.should_not_contain('New text after 1 second')
  87. screen.wait_for('New text after 1 second')
  88. def test_autoupdate_on_async_timer_callback(screen: Screen):
  89. async def update():
  90. ui.label('1')
  91. await asyncio.sleep(1.0)
  92. ui.label('2')
  93. ui.timer(2.0, update, once=True)
  94. screen.open('/')
  95. screen.should_not_contain('1')
  96. screen.wait_for('1')
  97. screen.should_not_contain('2')
  98. screen.wait_for('2')
  99. def test_adding_elements_from_different_tasks(screen: Screen):
  100. card1 = ui.card()
  101. card2 = ui.card()
  102. async def add_label1() -> None:
  103. with card1:
  104. await asyncio.sleep(1.0)
  105. ui.label('1')
  106. async def add_label2() -> None:
  107. with card2:
  108. ui.label('2')
  109. await asyncio.sleep(1.0)
  110. screen.open('/')
  111. create_task(add_label1())
  112. create_task(add_label2())
  113. screen.wait_for('1')
  114. screen.wait_for('2')
  115. assert screen.render_content() == '''Title: NiceGUI
  116. card
  117. 1
  118. card
  119. 2
  120. '''