test_highchart.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from selenium.webdriver.common.by import By
  2. from nicegui import ui
  3. from nicegui.testing import Screen
  4. def test_change_chart_series(screen: Screen):
  5. chart = ui.highchart({
  6. 'chart': {'type': 'bar'},
  7. 'xAxis': {'categories': ['A', 'B']},
  8. 'series': [
  9. {'name': 'Alpha', 'data': [0.1, 0.2]},
  10. {'name': 'Beta', 'data': [0.3, 0.4]},
  11. ],
  12. }).classes('w-full h-64')
  13. def update():
  14. chart.options['series'][0]['data'][:] = [1, 1]
  15. chart.update()
  16. ui.button('Update', on_click=update)
  17. def get_series_0():
  18. return screen.selenium.find_elements(By.CSS_SELECTOR, '.highcharts-series-0 .highcharts-point')
  19. screen.open('/')
  20. screen.wait(0.5)
  21. before = [bar.size['width'] for bar in get_series_0()] # pylint: disable=disallowed-name
  22. screen.click('Update')
  23. screen.wait(0.5)
  24. after = [bar.size['width'] for bar in get_series_0()] # pylint: disable=disallowed-name
  25. assert before[0] < after[0]
  26. assert before[1] < after[1]
  27. def test_adding_chart_series(screen: Screen):
  28. chart = ui.highchart({
  29. 'chart': {'type': 'bar'},
  30. 'xAxis': {'categories': ['A', 'B']},
  31. 'series': [],
  32. }).classes('w-full h-64')
  33. def add():
  34. chart.options['series'].append({'name': 'X', 'data': [0.1, 0.2]})
  35. chart.update()
  36. ui.button('Add', on_click=add)
  37. screen.open('/')
  38. screen.click('Add')
  39. screen.wait(0.5)
  40. assert len(screen.selenium.find_elements(By.CSS_SELECTOR, '.highcharts-point')) == 3
  41. def test_removing_chart_series(screen: Screen):
  42. chart = ui.highchart({
  43. 'chart': {'type': 'bar'},
  44. 'xAxis': {'categories': ['A', 'B']},
  45. 'series': [
  46. {'name': 'Alpha', 'data': [0.1, 0.2]},
  47. {'name': 'Beta', 'data': [0.3, 0.4]},
  48. ],
  49. }).classes('w-full h-64')
  50. def remove():
  51. chart.options['series'].pop(0)
  52. chart.update()
  53. ui.button('Remove', on_click=remove)
  54. screen.open('/')
  55. screen.click('Remove')
  56. screen.wait(0.5)
  57. assert len(screen.selenium.find_elements(By.CSS_SELECTOR, '.highcharts-point')) == 3
  58. def test_missing_extra(screen: Screen):
  59. # NOTE: This test does not work after test_extra() has been run, because conftest won't reset libraries correctly.
  60. ui.highchart({'chart': {'type': 'solidgauge'}})
  61. screen.open('/')
  62. assert not screen.selenium.find_elements(By.CSS_SELECTOR, '.highcharts-pane')
  63. def test_extra(screen: Screen):
  64. ui.highchart({'chart': {'type': 'solidgauge'}}, extras=['solid-gauge'])
  65. screen.open('/')
  66. assert screen.selenium.find_elements(By.CSS_SELECTOR, '.highcharts-pane')
  67. def test_stock_chart(screen: Screen):
  68. ui.highchart({}, type='stockChart', extras=['stock'])
  69. screen.open('/')
  70. assert screen.selenium.find_elements(By.CSS_SELECTOR, '.highcharts-range-selector-buttons')
  71. def test_replace_chart(screen: Screen):
  72. with ui.row() as container:
  73. ui.highchart({'series': [{'name': 'A'}]})
  74. def replace():
  75. container.clear()
  76. with container:
  77. ui.highchart({'series': [{'name': 'B'}]})
  78. ui.button('Replace', on_click=replace)
  79. screen.open('/')
  80. screen.should_contain('A')
  81. screen.click('Replace')
  82. screen.should_contain('B')
  83. screen.should_not_contain('A')
  84. def test_updating_stock_chart(screen: Screen):
  85. """https://github.com/zauberzeug/nicegui/discussions/948"""
  86. chart = ui.highchart({'legend': {'enabled': True}, 'series': []}, type='stockChart', extras=['stock'])
  87. ui.button('update', on_click=lambda: (
  88. chart.options['series'].extend([{'name': 'alice'}, {'name': 'bob'}]),
  89. chart.update(),
  90. ))
  91. ui.button('clear', on_click=lambda: (
  92. chart.options['series'].clear(),
  93. chart.update(),
  94. ))
  95. screen.open('/')
  96. screen.click('update')
  97. screen.should_contain('alice')
  98. screen.should_contain('bob')
  99. screen.click('clear')
  100. screen.wait(0.5)
  101. screen.should_not_contain('alice')
  102. screen.should_not_contain('bob')
  103. def test_create_dynamically(screen: Screen):
  104. ui.button('Create', on_click=lambda: ui.highchart({}))
  105. screen.open('/')
  106. screen.click('Create')
  107. screen.should_contain('Chart title')