test_aggrid.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. from selenium.webdriver.common.action_chains import ActionChains
  2. from selenium.webdriver.common.keys import Keys
  3. from nicegui import ui
  4. from .screen import Screen
  5. def test_update_table(screen: Screen):
  6. grid = ui.aggrid({
  7. 'columnDefs': [{'field': 'name'}, {'field': 'age'}],
  8. 'rowData': [{'name': 'Alice', 'age': 18}],
  9. })
  10. screen.open('/')
  11. screen.should_contain('Name')
  12. screen.should_contain('Age')
  13. screen.should_contain('Alice')
  14. screen.should_contain('18')
  15. grid.options['rowData'][0]['age'] = 42
  16. screen.wait(0.5) # HACK: try to fix flaky test
  17. grid.update()
  18. screen.wait(0.5) # HACK: try to fix flaky test
  19. screen.should_contain('42')
  20. def test_add_row(screen: Screen):
  21. grid = ui.aggrid({
  22. 'columnDefs': [{'field': 'name'}, {'field': 'age'}],
  23. 'rowData': [],
  24. })
  25. ui.button('Update', on_click=grid.update)
  26. screen.open('/')
  27. grid.options['rowData'].append({'name': 'Alice', 'age': 18})
  28. screen.click('Update')
  29. screen.wait(0.5)
  30. screen.should_contain('Alice')
  31. screen.should_contain('18')
  32. grid.options['rowData'].append({'name': 'Bob', 'age': 21})
  33. screen.click('Update')
  34. screen.wait(0.5)
  35. screen.should_contain('Alice')
  36. screen.should_contain('18')
  37. screen.should_contain('Bob')
  38. screen.should_contain('21')
  39. def test_click_cell(screen: Screen):
  40. grid = ui.aggrid({
  41. 'columnDefs': [{'field': 'name'}, {'field': 'age'}],
  42. 'rowData': [{'name': 'Alice', 'age': 18}],
  43. })
  44. grid.on('cellClicked', lambda e: ui.label(f'{e.args["data"]["name"]} has been clicked!'))
  45. screen.open('/')
  46. screen.click('Alice')
  47. screen.should_contain('Alice has been clicked!')
  48. def test_html_columns(screen: Screen):
  49. ui.aggrid({
  50. 'columnDefs': [{'field': 'name'}, {'field': 'age'}],
  51. 'rowData': [{'name': '<span class="text-bold">Alice</span>', 'age': 18}],
  52. }, html_columns=[0])
  53. screen.open('/')
  54. screen.should_contain('Alice')
  55. screen.should_not_contain('<span')
  56. assert 'text-bold' in screen.find('Alice').get_attribute('class')
  57. def test_dynamic_method(screen: Screen):
  58. grid = ui.aggrid({
  59. 'columnDefs': [{'field': 'name'}, {'field': 'age'}],
  60. 'rowData': [{'name': 'Alice', 'age': '18'}, {'name': 'Bob', 'age': '21'}, {'name': 'Carol', 'age': '42'}],
  61. ':getRowHeight': 'params=>params.data.age>35 ? 40:25'
  62. })
  63. screen.open('/')
  64. trs = screen.find_all_by_class("ag-row")
  65. assert len(trs) == 3
  66. heights = [int(tr.get_attribute("clientHeight")) for tr in trs]
  67. # we allow for some margin since there are borders etc
  68. assert heights[0] <= 25 and heights[0] >= 23
  69. assert heights[1] <= 25 and heights[1] >= 23
  70. assert heights[2] <= 40 and heights[2] >= 38
  71. def test_call_api_method_with_argument(screen: Screen):
  72. grid = ui.aggrid({
  73. 'columnDefs': [{'field': 'name', 'filter': True}],
  74. 'rowData': [{'name': 'Alice'}, {'name': 'Bob'}, {'name': 'Carol'}],
  75. })
  76. filter = {'name': {'filterType': 'text', 'type': 'equals', 'filter': 'Alice'}}
  77. ui.button('Filter', on_click=lambda: grid.call_api_method('setFilterModel', filter))
  78. screen.open('/')
  79. screen.should_contain('Alice')
  80. screen.should_contain('Bob')
  81. screen.should_contain('Carol')
  82. screen.click('Filter')
  83. screen.should_contain('Alice')
  84. screen.should_not_contain('Bob')
  85. screen.should_not_contain('Carol')
  86. def test_call_column_api_method_with_argument(screen: Screen):
  87. grid = ui.aggrid({
  88. 'columnDefs': [{'field': 'name'}, {'field': 'age', 'hide': True}],
  89. 'rowData': [{'name': 'Alice', 'age': '18'}, {'name': 'Bob', 'age': '21'}, {'name': 'Carol', 'age': '42'}],
  90. })
  91. ui.button('Show Age', on_click=lambda: grid.call_column_api_method('setColumnVisible', 'age', True))
  92. screen.open('/')
  93. screen.should_contain('Alice')
  94. screen.should_not_contain('18')
  95. screen.click('Show Age')
  96. screen.should_contain('18')
  97. def test_get_selected_rows(screen: Screen):
  98. grid = ui.aggrid({
  99. 'columnDefs': [{'field': 'name'}],
  100. 'rowData': [{'name': 'Alice'}, {'name': 'Bob'}, {'name': 'Carol'}],
  101. 'rowSelection': 'multiple',
  102. })
  103. async def get_selected_rows():
  104. ui.label(str(await grid.get_selected_rows()))
  105. ui.button('Get selected rows', on_click=get_selected_rows)
  106. async def get_selected_row():
  107. ui.label(str(await grid.get_selected_row()))
  108. ui.button('Get selected row', on_click=get_selected_row)
  109. screen.open('/')
  110. screen.click('Alice')
  111. screen.find('Bob')
  112. ActionChains(screen.selenium).key_down(Keys.SHIFT).click(screen.find('Bob')).key_up(Keys.SHIFT).perform()
  113. screen.click('Get selected rows')
  114. screen.should_contain("[{'name': 'Alice'}, {'name': 'Bob'}]")
  115. screen.click('Get selected row')
  116. screen.should_contain("{'name': 'Alice'}")
  117. def test_replace_aggrid(screen: Screen):
  118. with ui.row().classes('w-full') as container:
  119. ui.aggrid({'columnDefs': [{'field': 'name'}], 'rowData': [{'name': 'Alice'}]})
  120. def replace():
  121. container.clear()
  122. with container:
  123. ui.aggrid({'columnDefs': [{'field': 'name'}], 'rowData': [{'name': 'Bob'}]})
  124. ui.button('Replace', on_click=replace)
  125. screen.open('/')
  126. screen.should_contain('Alice')
  127. screen.click('Replace')
  128. screen.should_contain('Bob')
  129. screen.should_not_contain('Alice')
  130. def test_create_from_pandas(screen: Screen):
  131. import pandas as pd
  132. df = pd.DataFrame({'name': ['Alice', 'Bob'], 'age': [18, 21]})
  133. ui.aggrid.from_pandas(df)
  134. screen.open('/')
  135. screen.should_contain('Alice')
  136. screen.should_contain('Bob')
  137. screen.should_contain('18')
  138. screen.should_contain('21')
  139. def test_create_dynamically(screen: Screen):
  140. ui.button('Create', on_click=lambda: ui.aggrid({'columnDefs': [{'field': 'name'}], 'rowData': [{'name': 'Alice'}]}))
  141. screen.open('/')
  142. screen.click('Create')
  143. screen.should_contain('Alice')
  144. def test_api_method_after_creation(screen: Screen):
  145. options = {'columnDefs': [{'field': 'name'}], 'rowData': [{'name': 'Alice'}]}
  146. ui.button('Create', on_click=lambda: ui.aggrid(options).call_api_method('selectAll'))
  147. screen.open('/')
  148. screen.click('Create')
  149. assert screen.find_by_class('ag-row-selected')