test_tree.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from nicegui import ui
  2. from nicegui.testing import Screen
  3. def test_tree(screen: Screen):
  4. ui.tree([
  5. {'id': 'numbers', 'children': [{'id': '1'}, {'id': '2'}]},
  6. {'id': 'letters', 'children': [{'id': 'A'}, {'id': 'B'}]},
  7. ], label_key='id')
  8. screen.open('/')
  9. screen.should_contain('numbers')
  10. screen.should_contain('letters')
  11. screen.should_not_contain('1')
  12. screen.should_not_contain('2')
  13. screen.should_not_contain('A')
  14. screen.should_not_contain('B')
  15. screen.find_by_class('q-icon').click()
  16. screen.wait(0.5)
  17. screen.should_contain('1')
  18. screen.should_contain('2')
  19. def test_expand_and_collapse_nodes(screen: Screen):
  20. tree = ui.tree([
  21. {'id': 'numbers', 'children': [{'id': '1'}, {'id': '2'}]},
  22. {'id': 'letters', 'children': [{'id': 'A'}, {'id': 'B'}]},
  23. ], label_key='id')
  24. ui.button('Expand all', on_click=tree.expand)
  25. ui.button('Collapse all', on_click=tree.collapse)
  26. ui.button('Expand numbers', on_click=lambda: tree.expand(['numbers']))
  27. ui.button('Collapse numbers', on_click=lambda: tree.collapse(['numbers']))
  28. screen.open('/')
  29. screen.click('Expand all')
  30. screen.wait(0.5)
  31. screen.should_contain('1')
  32. screen.should_contain('2')
  33. screen.should_contain('A')
  34. screen.should_contain('B')
  35. screen.click('Collapse all')
  36. screen.wait(0.5)
  37. screen.should_not_contain('1')
  38. screen.should_not_contain('2')
  39. screen.should_not_contain('A')
  40. screen.should_not_contain('B')
  41. screen.click('Expand numbers')
  42. screen.wait(0.5)
  43. screen.should_contain('1')
  44. screen.should_contain('2')
  45. screen.should_not_contain('A')
  46. screen.should_not_contain('B')
  47. screen.click('Expand all')
  48. screen.click('Collapse numbers')
  49. screen.wait(0.5)
  50. screen.should_not_contain('1')
  51. screen.should_not_contain('2')
  52. screen.should_contain('A')
  53. screen.should_contain('B')
  54. def test_select_deselect_node(screen: Screen):
  55. tree = ui.tree([
  56. {'id': 'numbers', 'children': [{'id': '1'}, {'id': '2'}]},
  57. {'id': 'letters', 'children': [{'id': 'A'}, {'id': 'B'}]},
  58. ], label_key='id')
  59. ui.button('Select', on_click=lambda: tree.select('2'))
  60. ui.button('Deselect', on_click=tree.deselect)
  61. ui.label().bind_text_from(tree._props, 'selected', lambda x: f'Selected: {x}')
  62. screen.open('/')
  63. screen.click('Select')
  64. screen.should_contain('Selected: 2')
  65. screen.click('Deselect')
  66. screen.should_contain('Selected: None')
  67. def test_tick_untick_node_or_nodes(screen: Screen):
  68. tree = ui.tree([
  69. {'id': 'numbers', 'children': [{'id': '1'}, {'id': '2'}]},
  70. {'id': 'letters', 'children': [{'id': 'A'}, {'id': 'B'}]},
  71. ], label_key='id', tick_strategy='leaf')
  72. ui.button('Tick some', on_click=lambda: tree.tick(['1', '2', 'B']))
  73. ui.button('Untick some', on_click=lambda: tree.untick(['1', 'B']))
  74. ui.button('Tick all', on_click=tree.tick)
  75. ui.button('Untick all', on_click=tree.untick)
  76. ui.label().bind_text_from(tree._props, 'ticked', lambda x: f'Ticked: {sorted(x)}')
  77. screen.open('/')
  78. screen.should_contain('Ticked: []')
  79. screen.click('Tick some')
  80. screen.should_contain("Ticked: ['1', '2', 'B']")
  81. screen.click('Untick some')
  82. screen.should_contain("Ticked: ['2']")
  83. screen.click('Tick all')
  84. screen.should_contain("Ticked: ['1', '2', 'A', 'B', 'letters', 'numbers']")
  85. screen.click('Untick all')
  86. screen.should_contain('Ticked: []')
  87. def test_filter(screen: Screen):
  88. t = ui.tree([
  89. {'id': 'fruits', 'children': [{'id': 'Apple'}, {'id': 'Banana'}, {'id': 'Cherry'}]},
  90. ], label_key='id', tick_strategy='leaf-filtered').expand()
  91. ui.button('Filter', on_click=lambda: t.set_filter('a'))
  92. screen.open('/')
  93. screen.should_contain('Apple')
  94. screen.should_contain('Banana')
  95. screen.should_contain('Cherry')
  96. screen.click('Filter')
  97. screen.should_contain('Apple')
  98. screen.should_contain('Banana')
  99. screen.should_not_contain('Cherry')