test_element_filter.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. from typing import List
  2. import pytest
  3. from nicegui import ElementFilter, ui
  4. from nicegui.elements.mixins.text_element import TextElement
  5. from nicegui.testing import User
  6. pytestmark = pytest.mark.usefixtures('user')
  7. # pylint: disable=missing-function-docstring
  8. def texts(element_filter: ElementFilter) -> List[str]:
  9. return [element.text for element in element_filter]
  10. def test_find_all() -> None:
  11. ui.button('button A')
  12. ui.label('label A')
  13. with ui.row():
  14. ui.button('button B')
  15. ui.label('label B')
  16. elements: List[ui.element] = list(ElementFilter())
  17. assert len(elements) == 8
  18. assert elements[0].tag == 'q-page-container'
  19. assert elements[1].tag == 'q-page'
  20. assert elements[2]._classes == ['nicegui-content'] # pylint: disable=protected-access
  21. assert elements[3].text == 'button A' # type: ignore
  22. assert elements[4].text == 'label A' # type: ignore
  23. assert elements[5].__class__ == ui.row
  24. assert elements[6].text == 'button B' # type: ignore
  25. assert elements[7].text == 'label B' # type: ignore
  26. def test_find_kind():
  27. ui.icon('home')
  28. ui.button('button A')
  29. ui.label('label A')
  30. ui.button('button B')
  31. ui.label('label B')
  32. assert texts(ElementFilter(kind=ui.button)) == ['button A', 'button B']
  33. assert texts(ElementFilter(kind=TextElement)) == ['button A', 'label A', 'button B', 'label B']
  34. def test_find_content():
  35. ui.button('button A')
  36. ui.label('label A')
  37. ui.button('button B')
  38. ui.label('label B')
  39. assert texts(ElementFilter(content='A')) == ['button A', 'label A']
  40. assert texts(ElementFilter(content=['A', 'butt'])) == ['button A']
  41. def test_find_marker():
  42. ui.button('button A')
  43. ui.button('button B').mark('important')
  44. ui.button('button C').mark('important ', 'foo')
  45. ui.button('button D').mark(' important bar')
  46. assert texts(ElementFilter(marker='important')) == ['button B', 'button C', 'button D']
  47. assert texts(ElementFilter(marker='foo')) == ['button C']
  48. assert texts(ElementFilter(marker='bar important')) == ['button D']
  49. assert texts(ElementFilter(marker='important bar')) == ['button D']
  50. def test_find_within_marker():
  51. ui.button('button A')
  52. ui.label('label A')
  53. with ui.row().mark('horizontal'):
  54. ui.button('button B')
  55. ui.label('label B')
  56. with ui.column().mark('vertical'):
  57. ui.button('button C')
  58. ui.label('label C')
  59. assert texts(ElementFilter(kind=ui.button).within(marker='horizontal')) == ['button B', 'button C']
  60. assert texts(ElementFilter(kind=ui.button).within(marker='horizontal vertical')) == ['button C']
  61. assert texts(ElementFilter(kind=ui.button).not_within(marker='horizontal')) == ['button A']
  62. assert texts(ElementFilter(kind=ui.button).not_within(marker='horizontal vertical')) == ['button A']
  63. def test_find_within_marker2():
  64. with ui.row().mark('a b'):
  65. ui.label('Label 1')
  66. with ui.row().mark('a'):
  67. ui.label('Label 2')
  68. ui.label('Label 3')
  69. assert texts(ElementFilter(kind=ui.label).within(marker='a b')) == ['Label 1']
  70. assert texts(ElementFilter(kind=ui.label).within(marker='b a')) == ['Label 1']
  71. assert texts(ElementFilter(kind=ui.label).within(marker='b')) == ['Label 1']
  72. assert texts(ElementFilter(kind=ui.label).within(marker='a')) == ['Label 1', 'Label 2']
  73. assert texts(ElementFilter(kind=ui.label).not_within(marker='a b')) == ['Label 3']
  74. assert texts(ElementFilter(kind=ui.label).not_within(marker='b a')) == ['Label 3']
  75. assert texts(ElementFilter(kind=ui.label).not_within(marker='b')) == ['Label 2', 'Label 3']
  76. assert texts(ElementFilter(kind=ui.label).not_within(marker='a')) == ['Label 3']
  77. def test_find_within_instance():
  78. ui.button('button A')
  79. ui.label('label A')
  80. with ui.row() as row:
  81. ui.button('button B')
  82. ui.label('label B')
  83. with ui.column() as column1:
  84. ui.button('button C')
  85. ui.label('label C')
  86. with ui.column() as column2:
  87. ui.button('button D')
  88. ui.label('label D')
  89. assert texts(ElementFilter(kind=ui.button).within(instance=row)) == ['button B', 'button C', 'button D']
  90. assert texts(ElementFilter(kind=ui.button).within(instance=[row, column1])) == ['button C']
  91. assert texts(ElementFilter(kind=ui.button).within(instance=[column1, column2])) == []
  92. assert texts(ElementFilter(kind=ui.button).not_within(instance=row)) == ['button A']
  93. def test_find_within_kind():
  94. ui.button('button A')
  95. with ui.row():
  96. ui.label('label A')
  97. ui.button('button B')
  98. ui.label('label B')
  99. with ui.column():
  100. ui.label('label C')
  101. with ui.card():
  102. ui.button('button C')
  103. assert texts(ElementFilter(content='B').within(kind=ui.row)) == ['button B', 'label B']
  104. assert texts(ElementFilter(content='C').within(kind=ui.column)) == ['label C', 'button C']
  105. assert texts(ElementFilter(content='C').within(kind=ui.column).within(kind=ui.card)) == ['button C']
  106. assert texts(ElementFilter(kind=ui.button).not_within(kind=ui.row)) == ['button A', 'button C']
  107. def test_find_exclude_kind():
  108. ui.button('button A')
  109. ui.label('label A')
  110. ui.button('button B')
  111. ui.label('label B')
  112. assert texts(ElementFilter(content='A').exclude(kind=ui.label)) == ['button A']
  113. def test_find_exclude_marker():
  114. ui.button('button A').mark('normal')
  115. ui.label('label A').mark('important')
  116. ui.button('button B')
  117. ui.label('label B').mark('normal')
  118. assert texts(ElementFilter(kind=TextElement).exclude(marker='normal')) == ['label A', 'button B']
  119. def test_find_exclude_content():
  120. ui.button('button A')
  121. ui.label('label A')
  122. ui.button('button B')
  123. ui.label('label B')
  124. assert texts(ElementFilter(kind=ui.button).exclude(content='A')) == ['button B']
  125. def test_find_in_local_scope():
  126. ui.button('button A')
  127. ui.label('label A')
  128. with ui.row():
  129. ui.button('button B')
  130. ui.label('label B')
  131. assert texts(ElementFilter(local_scope=True)) == ['button B', 'label B']
  132. async def test_setting_classes(user: User):
  133. ui.label('label A')
  134. ui.label('label B')
  135. ElementFilter(kind=ui.label).classes('text-2xl')
  136. await user.open('/')
  137. for label in user.find('label').elements:
  138. assert label._classes == ['text-2xl'] # pylint: disable=protected-access
  139. async def test_setting_style(user: User):
  140. ui.label('label A')
  141. ui.label('label B')
  142. ElementFilter(kind=ui.label).style('color: red')
  143. await user.open('/')
  144. for label in user.find('label').elements:
  145. assert label._style['color'] == 'red' # pylint: disable=protected-access
  146. async def test_setting_props(user: User):
  147. ui.button('button A')
  148. ui.button('button B')
  149. ElementFilter(kind=ui.button).props('flat')
  150. await user.open('/')
  151. for button in user.find('button').elements:
  152. assert button._props['flat'] # pylint: disable=protected-access
  153. async def test_typing(user: User):
  154. ui.button('button A')
  155. ui.label('label A')
  156. await user.open('/')
  157. # NOTE we have not yet found a way to test the typing suggestions automatically
  158. # to test, hover over the variable and verify that your IDE infers the correct type
  159. _ = ElementFilter(kind=ui.button) # ElementFilter[ui.button]
  160. _ = ElementFilter(kind=ui.label) # ElementFilter[ui.label]
  161. _ = ElementFilter() # ElementFilter[Element]