test_auto_context.py 4.0 KB

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