test_events.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import asyncio
  2. from selenium.webdriver.common.by import By
  3. from nicegui import ui
  4. from nicegui.events import ClickEventArguments
  5. from .screen import Screen
  6. def click_sync_no_args():
  7. ui.label('click_sync_no_args')
  8. def click_sync_with_args(_: ClickEventArguments):
  9. ui.label('click_sync_with_args')
  10. async def click_async_no_args():
  11. await asyncio.sleep(0.1)
  12. ui.label('click_async_no_args')
  13. async def click_async_with_args(_: ClickEventArguments):
  14. await asyncio.sleep(0.1)
  15. ui.label('click_async_with_args')
  16. def test_click_events(screen: Screen):
  17. ui.button('click_sync_no_args', on_click=click_sync_no_args)
  18. ui.button('click_sync_with_args', on_click=click_sync_with_args)
  19. ui.button('click_async_no_args', on_click=click_async_no_args)
  20. ui.button('click_async_with_args', on_click=click_async_with_args)
  21. screen.open('/')
  22. screen.click('click_sync_no_args')
  23. screen.click('click_sync_with_args')
  24. screen.click('click_async_no_args')
  25. screen.click('click_async_with_args')
  26. screen.should_contain('click_sync_no_args')
  27. screen.should_contain('click_sync_with_args')
  28. screen.should_contain('click_async_no_args')
  29. screen.should_contain('click_async_with_args')
  30. def test_generic_events(screen: Screen):
  31. ui.label('click_sync_no_args').on('click', click_sync_no_args)
  32. ui.label('click_sync_with_args').on('click', click_sync_with_args)
  33. ui.label('click_async_no_args').on('click', click_async_no_args)
  34. ui.label('click_async_with_args').on('click', click_async_with_args)
  35. screen.open('/')
  36. screen.click('click_sync_no_args')
  37. screen.click('click_sync_with_args')
  38. screen.click('click_async_no_args')
  39. screen.click('click_async_with_args')
  40. screen.should_contain('click_sync_no_args')
  41. screen.should_contain('click_sync_with_args')
  42. screen.should_contain('click_async_no_args')
  43. screen.should_contain('click_async_with_args')
  44. def test_event_with_update_before_await(screen: Screen):
  45. @ui.page('/')
  46. def page():
  47. async def update():
  48. ui.label('1')
  49. await asyncio.sleep(1.0)
  50. ui.label('2')
  51. ui.button('update', on_click=update)
  52. screen.open('/')
  53. screen.click('update')
  54. screen.should_contain('1')
  55. screen.should_not_contain('2')
  56. screen.should_contain('2')
  57. def test_event_modifiers(screen: Screen):
  58. events = []
  59. ui.input('A').on('keydown', lambda _: events.append('A'))
  60. ui.input('B').on('keydown.x', lambda _: events.append('B'))
  61. ui.input('C').on('keydown.once', lambda _: events.append('C'))
  62. ui.input('D').on('keydown.shift.x', lambda _: events.append('D'))
  63. screen.open('/')
  64. screen.selenium.find_element(By.XPATH, '//*[@aria-label="A"]').send_keys('x')
  65. screen.selenium.find_element(By.XPATH, '//*[@aria-label="B"]').send_keys('xy')
  66. screen.selenium.find_element(By.XPATH, '//*[@aria-label="C"]').send_keys('xx')
  67. screen.selenium.find_element(By.XPATH, '//*[@aria-label="D"]').send_keys('Xx')
  68. assert events == ['A', 'B', 'C', 'D']
  69. def test_throttling(screen: Screen):
  70. events = []
  71. ui.button('Test', on_click=lambda: events.append(1)).on('click', lambda: events.append(2), throttle=1)
  72. screen.open('/')
  73. screen.click('Test')
  74. screen.click('Test')
  75. screen.click('Test')
  76. assert events == [1, 2, 1, 1]
  77. screen.wait(1.1)
  78. assert events == [1, 2, 1, 1, 2]
  79. screen.click('Test')
  80. screen.click('Test')
  81. screen.click('Test')
  82. assert events == [1, 2, 1, 1, 2, 1, 2, 1, 1]
  83. def test_throttling_variants(screen: Screen):
  84. events = []
  85. value = 0
  86. ui.button('Both').on('click', lambda: events.append(value), throttle=1)
  87. ui.button('Leading').on('click', lambda: events.append(value), throttle=1, trailing_events=False)
  88. ui.button('Trailing').on('click', lambda: events.append(value), throttle=1, leading_events=False)
  89. screen.open('/')
  90. value = 1
  91. screen.click('Both')
  92. value = 2
  93. screen.click('Both')
  94. value = 3
  95. screen.click('Both')
  96. assert events == [1]
  97. screen.wait(1.1)
  98. assert events == [1, 3]
  99. events = []
  100. value = 1
  101. screen.click('Leading')
  102. value = 2
  103. screen.click('Leading')
  104. value = 3
  105. screen.click('Leading')
  106. assert events == [1]
  107. screen.wait(1.1)
  108. assert events == [1]
  109. events = []
  110. value = 1
  111. screen.click('Trailing')
  112. value = 2
  113. screen.click('Trailing')
  114. value = 3
  115. screen.click('Trailing')
  116. assert events == []
  117. screen.wait(1.1)
  118. assert events == [3]