test_refreshable.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import asyncio
  2. from nicegui import ui
  3. from .screen import Screen
  4. def test_refreshable(screen: Screen) -> None:
  5. numbers = []
  6. @ui.refreshable
  7. def number_ui() -> None:
  8. ui.label('[' + ', '.join(str(n) for n in sorted(numbers)) + ']')
  9. number_ui()
  10. ui.button('Refresh', on_click=number_ui.refresh)
  11. screen.open('/')
  12. screen.should_contain('[]')
  13. numbers.append(1)
  14. screen.click('Refresh')
  15. screen.should_contain('[1]')
  16. numbers.append(2)
  17. screen.click('Refresh')
  18. screen.should_contain('[1, 2]')
  19. numbers.clear()
  20. screen.click('Refresh')
  21. screen.should_contain('[]')
  22. async def test_async_refreshable(screen: Screen) -> None:
  23. numbers = []
  24. @ui.refreshable
  25. async def number_ui() -> None:
  26. await asyncio.sleep(0.1)
  27. ui.label('[' + ', '.join(str(n) for n in sorted(numbers)) + ']')
  28. @ui.page('/')
  29. async def index():
  30. with ui.column(): # this is necessary to reproduce bug #863
  31. await number_ui()
  32. ui.button('Refresh', on_click=number_ui.refresh)
  33. screen.open('/')
  34. screen.should_contain('[]')
  35. numbers.append(1)
  36. screen.click('Refresh')
  37. screen.should_not_contain('[]') # ensure bug #863 is fixed
  38. screen.should_contain('[1]')
  39. numbers.append(2)
  40. screen.click('Refresh')
  41. screen.should_not_contain('[]')
  42. screen.should_contain('[1, 2]')
  43. numbers.clear()
  44. screen.click('Refresh')
  45. screen.should_contain('[]')
  46. def test_multiple_targets(screen: Screen) -> None:
  47. count = 0
  48. class MyClass:
  49. def __init__(self, name: str) -> None:
  50. self.name = name
  51. self.state = 1
  52. @ui.refreshable
  53. def create_ui(self) -> None:
  54. nonlocal count
  55. count += 1
  56. ui.label(f'{self.name} = {self.state} ({count})')
  57. ui.button(f'increment {self.name}', on_click=self.increment)
  58. def increment(self) -> None:
  59. self.state += 1
  60. self.create_ui.refresh()
  61. a = MyClass('A')
  62. a.create_ui()
  63. b = MyClass('B')
  64. b.create_ui()
  65. screen.open('/')
  66. screen.should_contain('A = 1 (1)')
  67. screen.should_contain('B = 1 (2)')
  68. screen.click('increment A')
  69. screen.should_contain('A = 2 (3)')
  70. screen.should_contain('B = 1 (2)')
  71. screen.click('increment B')
  72. screen.should_contain('A = 2 (3)')
  73. screen.should_contain('B = 2 (4)')
  74. def test_refresh_with_arguments(screen: Screen):
  75. a = 0
  76. @ui.refreshable
  77. def some_ui(*, b: int):
  78. ui.label(f'a={a}, b={b}')
  79. some_ui(b=0)
  80. ui.button('Refresh 1', on_click=lambda: some_ui.refresh(b=1))
  81. ui.button('Refresh 2', on_click=lambda: some_ui.refresh())
  82. ui.button('Refresh 3', on_click=some_ui.refresh)
  83. screen.open('/')
  84. screen.should_contain('a=0, b=0')
  85. a = 1
  86. screen.click('Refresh 1')
  87. screen.should_contain('a=1, b=1')
  88. a = 2
  89. screen.click('Refresh 2')
  90. screen.should_contain('a=2, b=1')
  91. a = 3
  92. screen.click('Refresh 3')
  93. screen.should_contain('a=3, b=1')