test_metric_indicator.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. # Copyright 2021-2025 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. import inspect
  12. from importlib import util
  13. import pytest
  14. if util.find_spec("playwright"):
  15. from playwright._impl._page import Page
  16. from taipy.gui import Gui
  17. @pytest.mark.extension
  18. def test_has_default_value(page: Page, gui: Gui, helpers):
  19. page_md = """
  20. <|100|metric|>
  21. """
  22. gui._set_frame(inspect.currentframe())
  23. gui.add_page(name="test", page=page_md)
  24. helpers.run_e2e(gui)
  25. page.goto("./test")
  26. page.wait_for_selector(".plot-container")
  27. events_list = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[local-name()='text']")
  28. gauge_value = events_list.nth(0).text_content()
  29. assert gauge_value == "100"
  30. @pytest.mark.extension
  31. def test_show_increase_delta_value(page: Page, gui: Gui, helpers):
  32. page_md = """
  33. <|100|metric|delta=20|type=linear|>
  34. """
  35. gui._set_frame(inspect.currentframe())
  36. gui.add_page(name="test", page=page_md)
  37. helpers.run_e2e(gui)
  38. page.goto("./test")
  39. page.wait_for_selector(".plot-container")
  40. events_list = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[local-name()='text']")
  41. delta_value = events_list.nth(1).text_content()
  42. assert delta_value == "▲20"
  43. @pytest.mark.extension
  44. def test_show_decrease_delta_value(page: Page, gui: Gui, helpers):
  45. page_md = """
  46. <|100|metric|delta=-20|type=linear|>
  47. """
  48. gui._set_frame(inspect.currentframe())
  49. gui.add_page(name="test", page=page_md)
  50. helpers.run_e2e(gui)
  51. page.goto("./test")
  52. page.wait_for_selector(".plot-container")
  53. events_list = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[local-name()='text']")
  54. delta_value = events_list.nth(1).text_content()
  55. assert delta_value == "▼−20"
  56. @pytest.mark.teste2e
  57. def test_show_linear_chart(page: Page, gui: Gui, helpers):
  58. page_md = """
  59. <|100|metric|delta=-20|type=linear|>
  60. """
  61. gui._set_frame(inspect.currentframe())
  62. gui.add_page(name="test", page=page_md)
  63. helpers.run_e2e(gui)
  64. page.goto("./test")
  65. page.wait_for_selector(".plot-container")
  66. chart = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='bullet']")
  67. assert chart.is_visible()
  68. @pytest.mark.teste2e
  69. def test_show_circular_chart_as_default_type(page: Page, gui: Gui, helpers):
  70. page_md = """
  71. <|100|metric|>
  72. """
  73. gui._set_frame(inspect.currentframe())
  74. gui.add_page(name="test", page=page_md)
  75. helpers.run_e2e(gui)
  76. page.goto("./test")
  77. page.wait_for_selector(".plot-container")
  78. chart = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='angular']")
  79. assert chart.is_visible()
  80. @pytest.mark.teste2e
  81. def test_format_converter_integer_to_binary(page: Page, gui: Gui, helpers):
  82. page_md = """
  83. <|50|metric|show_value=True|delta=20|format=%b|>
  84. """
  85. gui._set_frame(inspect.currentframe())
  86. gui.add_page(name="test", page=page_md)
  87. helpers.run_e2e(gui)
  88. page.goto("./test")
  89. page.wait_for_selector(".plot-container")
  90. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  91. assert number.text_content() == "110010"
  92. @pytest.mark.teste2e
  93. def test_format_converter_integer_to_signed_decimal_d_type(page: Page, gui: Gui, helpers):
  94. page_md = """
  95. <|50|metric|show_value=True|delta=20|format=%d|>
  96. """
  97. gui._set_frame(inspect.currentframe())
  98. gui.add_page(name="test", page=page_md)
  99. helpers.run_e2e(gui)
  100. page.goto("./test")
  101. page.wait_for_selector(".plot-container")
  102. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  103. assert number.text_content() == "50"
  104. @pytest.mark.teste2e
  105. def test_format_converter_integer_to_signed_decimal_i_type(page: Page, gui: Gui, helpers):
  106. page_md = """
  107. <|50|metric|show_value=True|delta=20|format=%i|>
  108. """
  109. gui._set_frame(inspect.currentframe())
  110. gui.add_page(name="test", page=page_md)
  111. helpers.run_e2e(gui)
  112. page.goto("./test")
  113. page.wait_for_selector(".plot-container")
  114. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  115. assert number.text_content() == "50"
  116. @pytest.mark.teste2e
  117. def test_format_converter_yields_float_using_science_notation(page: Page, gui: Gui, helpers):
  118. page_md = """
  119. <|50|metric|show_value=True|delta=20|format=%e|>
  120. """
  121. gui._set_frame(inspect.currentframe())
  122. gui.add_page(name="test", page=page_md)
  123. helpers.run_e2e(gui)
  124. page.goto("./test")
  125. page.wait_for_selector(".plot-container")
  126. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  127. assert number.text_content() == "5.000000e+1"
  128. @pytest.mark.teste2e
  129. def test_format_converter_yields_float_using_fixed_point_notation_f_type(page: Page, gui: Gui, helpers):
  130. page_md = """
  131. <|99.99|metric|show_value=True|delta=20|format=%.2f|>
  132. """
  133. gui._set_frame(inspect.currentframe())
  134. gui.add_page(name="test", page=page_md)
  135. helpers.run_e2e(gui)
  136. page.goto("./test")
  137. page.wait_for_selector(".plot-container")
  138. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  139. assert number.text_content() == "99.99"
  140. @pytest.mark.teste2e
  141. def test_format_converter_yields_float_using_fixed_point_notation_g_type(page: Page, gui: Gui, helpers):
  142. page_md = """
  143. <|50.555|metric|show_value=True|delta=20|format=%.2g|>
  144. """
  145. gui._set_frame(inspect.currentframe())
  146. gui.add_page(name="test", page=page_md)
  147. helpers.run_e2e(gui)
  148. page.goto("./test")
  149. page.wait_for_selector(".plot-container")
  150. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  151. assert number.text_content() == "51"
  152. @pytest.mark.teste2e
  153. def test_format_converter_yields_integer_as_octal(page: Page, gui: Gui, helpers):
  154. page_md = """
  155. <|50|metric|show_value=True|delta=20|format=%o|>
  156. """
  157. gui._set_frame(inspect.currentframe())
  158. gui.add_page(name="test", page=page_md)
  159. helpers.run_e2e(gui)
  160. page.goto("./test")
  161. page.wait_for_selector(".plot-container")
  162. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  163. assert number.text_content() == "62"
  164. @pytest.mark.teste2e
  165. def test_format_converter_yields_integer_as_hexadecimal(page: Page, gui: Gui, helpers):
  166. page_md = """
  167. <|50|metric|show_value=True|delta=20|format=%x|>
  168. """
  169. gui._set_frame(inspect.currentframe())
  170. gui.add_page(name="test", page=page_md)
  171. helpers.run_e2e(gui)
  172. page.goto("./test")
  173. page.wait_for_selector(".plot-container")
  174. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  175. assert number.text_content() == "32"
  176. @pytest.mark.teste2e
  177. def test_format_converter_yields_integer_as_uppercase_hexadecimal(page: Page, gui: Gui, helpers):
  178. page_md = """
  179. <|50|metric|show_value=True|delta=20|format=%X|>
  180. """
  181. gui._set_frame(inspect.currentframe())
  182. gui.add_page(name="test", page=page_md)
  183. helpers.run_e2e(gui)
  184. page.goto("./test")
  185. page.wait_for_selector(".plot-container")
  186. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  187. assert number.text_content() == "32"
  188. @pytest.mark.teste2e
  189. def test_format_converter_yields_integer_as_unsigned_decimal(page: Page, gui: Gui, helpers):
  190. page_md = """
  191. <|-50|metric|show_value=True|delta=20|format=%u|>
  192. """
  193. gui._set_frame(inspect.currentframe())
  194. gui.add_page(name="test", page=page_md)
  195. helpers.run_e2e(gui)
  196. page.goto("./test")
  197. page.wait_for_selector(".plot-container")
  198. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  199. assert number.text_content() == "(50)"
  200. @pytest.mark.teste2e
  201. def test_format_converter_yields_edge_cases(page: Page, gui: Gui, helpers):
  202. page_md = """
  203. <|50|metric|show_value=True|format=a%%b%dc%%d|>
  204. """
  205. gui._set_frame(inspect.currentframe())
  206. gui.add_page(name="test", page=page_md)
  207. helpers.run_e2e(gui)
  208. page.goto("./test")
  209. page.wait_for_selector(".plot-container")
  210. number = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[@class='number']")
  211. assert number.text_content() == "a%b50c%d"
  212. @pytest.mark.teste2e
  213. def test_negative_delta_color(page: Page, gui: Gui, helpers):
  214. page_md = """
  215. <|50|metric|negative_delta_color=#3D9970|delta=-20|>
  216. """
  217. gui._set_frame(inspect.currentframe())
  218. gui.add_page(name="test", page=page_md)
  219. helpers.run_e2e(gui)
  220. page.goto("./test")
  221. page.wait_for_selector(".plot-container")
  222. events_list = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[local-name()='text']")
  223. delta = events_list.nth(1)
  224. fill_color = delta.evaluate("el => getComputedStyle(el).fill")
  225. assert fill_color == "rgb(61, 153, 112)"
  226. @pytest.mark.teste2e
  227. def test_delta_color_invert(page: Page, gui: Gui, helpers):
  228. page_md = """
  229. <|50|metric|delta_color=invert|delta=-20|>
  230. """
  231. gui._set_frame(inspect.currentframe())
  232. gui.add_page(name="test", page=page_md)
  233. helpers.run_e2e(gui)
  234. page.goto("./test")
  235. page.wait_for_selector(".plot-container")
  236. events_list = page.locator("//*[@class='js-plotly-plot']//*[name()='svg'][2]//*[local-name()='text']")
  237. delta = events_list.nth(1)
  238. fill_color = delta.evaluate("el => getComputedStyle(el).fill")
  239. assert fill_color == "rgb(61, 153, 112)"