test_aggrid.py 5.1 KB

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