test_cli.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # Copyright 2023 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 os
  12. import tempfile
  13. from unittest.mock import patch
  14. import pytest
  15. from taipy.config import Config
  16. from taipy.config._config import _Config
  17. from taipy.config._serializer._toml_serializer import _TomlSerializer
  18. from taipy.config.checker._checker import _Checker
  19. from taipy.config.checker.issue_collector import IssueCollector
  20. from taipy.gui import Gui
  21. class NamedTemporaryFile:
  22. def __init__(self, content=None):
  23. with tempfile.NamedTemporaryFile("w", delete=False) as fd:
  24. if content:
  25. fd.write(content)
  26. self.filename = fd.name
  27. def read(self):
  28. with open(self.filename, "r") as fp:
  29. return fp.read()
  30. def __del__(self):
  31. os.unlink(self.filename)
  32. def init_config():
  33. Config.unblock_update()
  34. Config._default_config = _Config()._default_config()
  35. Config._python_config = _Config()
  36. Config._file_config = None
  37. Config._env_file_config = None
  38. Config._applied_config = _Config._default_config()
  39. Config._collector = IssueCollector()
  40. Config._serializer = _TomlSerializer()
  41. _Checker._checkers = []
  42. from taipy.config import _inject_section
  43. from taipy.gui._default_config import default_config
  44. from taipy.gui._gui_section import _GuiSection
  45. _inject_section(
  46. _GuiSection,
  47. "gui_config",
  48. _GuiSection(property_list=list(default_config)),
  49. [("configure_gui", _GuiSection._configure)],
  50. add_to_unconflicted_sections=True,
  51. )
  52. @pytest.fixture(scope="function", autouse=True)
  53. def cleanup_test(helpers):
  54. init_config()
  55. helpers.test_cleanup()
  56. yield
  57. init_config()
  58. helpers.test_cleanup()
  59. def test_gui_service_arguments_hierarchy():
  60. # Test default configuration
  61. gui = Gui()
  62. gui.run(run_server=False)
  63. service_config = gui._config.config
  64. assert not service_config["allow_unsafe_werkzeug"]
  65. assert service_config["async_mode"] == "gevent"
  66. assert service_config["change_delay"] is None
  67. assert service_config["chart_dark_template"] is None
  68. assert service_config["dark_mode"]
  69. assert service_config["dark_theme"] is None
  70. assert not service_config["debug"]
  71. assert not service_config["extended_status"]
  72. assert service_config["favicon"] is None
  73. assert not service_config["flask_log"]
  74. assert service_config["host"] == "127.0.0.1"
  75. assert service_config["light_theme"] is None
  76. assert service_config["margin"] is None
  77. assert service_config["ngrok_token"] == ""
  78. assert service_config["notification_duration"] == 3000
  79. assert service_config["propagate"]
  80. assert service_config["run_browser"]
  81. assert not service_config["run_in_thread"]
  82. assert not service_config["run_server"]
  83. assert not service_config["single_client"]
  84. assert not service_config["system_notification"]
  85. assert service_config["theme"] is None
  86. assert service_config["time_zone"] is None
  87. assert service_config["title"] is None
  88. assert service_config["upload_folder"] is None
  89. assert not service_config["use_arrow"]
  90. assert not service_config["use_reloader"]
  91. assert service_config["watermark"] == "Taipy inside"
  92. assert service_config["webapp_path"] is None
  93. assert service_config["port"] == 5000
  94. gui.stop()
  95. # Override default configuration by explicit defined arguments in Gui.run()
  96. gui = Gui()
  97. gui.run(run_server=False, watermark="", host="my_host", port=5001)
  98. service_config = gui._config.config
  99. assert service_config["watermark"] == ""
  100. assert service_config["host"] == "my_host"
  101. assert service_config["port"] == 5001
  102. gui.stop()
  103. # Override Gui.run() arguments by explicit defined arguments in Config.configure_gui()
  104. Config.configure_gui(dark_mode=False, host="my_2nd_host", port=5002)
  105. gui = Gui()
  106. gui.run(run_server=False, watermark="", host="my_host", port=5001)
  107. service_config = gui._config.config
  108. assert not service_config["dark_mode"]
  109. assert service_config["host"] == "my_2nd_host"
  110. assert service_config["watermark"] == ""
  111. assert service_config["port"] == 5002
  112. gui.stop()
  113. # Override Config.configure_gui() arguments by loading a TOML file with [gui] section
  114. toml_config = NamedTemporaryFile(
  115. content="""
  116. [TAIPY]
  117. [gui]
  118. host = "my_3rd_host"
  119. port = 5003
  120. use_reloader = "true:bool"
  121. """
  122. )
  123. Config.load(toml_config.filename)
  124. gui = Gui()
  125. gui.run(run_server=False, host="my_host", port=5001)
  126. service_config = gui._config.config
  127. assert service_config["host"] == "my_3rd_host"
  128. assert service_config["port"] == 5003
  129. assert service_config["use_reloader"]
  130. gui.stop()
  131. # Override TOML configuration file with CLI arguments
  132. with patch("sys.argv", ["prog", "--host", "my_4th_host", "--port", "5004", "--no-reloader", "--debug"]):
  133. gui = Gui()
  134. gui.run(run_server=False, host="my_host", port=5001)
  135. service_config = gui._config.config
  136. assert service_config["host"] == "my_4th_host"
  137. assert service_config["port"] == 5004
  138. assert not service_config["use_reloader"]
  139. assert service_config["debug"]
  140. gui.stop()
  141. def test_clean_config():
  142. gui_config = Config.configure_gui(dark_mode=False)
  143. assert Config.gui_config is gui_config
  144. gui_config._clean()
  145. # Check if the instance before and after _clean() is the same
  146. assert Config.gui_config is gui_config
  147. assert gui_config.dark_mode is None
  148. assert gui_config.properties == {}