test_override_config.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. # Copyright 2021-2024 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. from unittest import mock
  13. import pytest
  14. from taipy.config.config import Config
  15. from taipy.config.exceptions.exceptions import InconsistentEnvVariableError, MissingEnvVariableError
  16. from tests.config.utils.named_temporary_file import NamedTemporaryFile
  17. def test_override_default_configuration_with_code_configuration():
  18. assert not Config.global_config.root_folder == "foo"
  19. assert len(Config.unique_sections) == 1
  20. assert Config.unique_sections["unique_section_name"] is not None
  21. assert Config.unique_sections["unique_section_name"].attribute == "default_attribute"
  22. assert Config.unique_sections["unique_section_name"].prop is None
  23. assert len(Config.sections) == 1
  24. assert len(Config.sections["section_name"]) == 1
  25. assert Config.sections["section_name"] is not None
  26. assert Config.sections["section_name"]["default"].attribute == "default_attribute"
  27. Config.configure_global_app(root_folder="foo")
  28. assert Config.global_config.root_folder == "foo"
  29. Config.configure_unique_section_for_tests("foo", prop="bar")
  30. assert len(Config.unique_sections) == 1
  31. assert Config.unique_sections["unique_section_name"] is not None
  32. assert Config.unique_sections["unique_section_name"].attribute == "foo"
  33. assert Config.unique_sections["unique_section_name"].prop == "bar"
  34. Config.configure_section_for_tests("my_id", "baz", prop="qux")
  35. assert len(Config.unique_sections) == 1
  36. assert Config.sections["section_name"] is not None
  37. assert Config.sections["section_name"]["my_id"].attribute == "baz"
  38. assert Config.sections["section_name"]["my_id"].prop == "qux"
  39. def test_override_default_config_with_code_config_including_env_variable_values():
  40. Config.configure_global_app()
  41. assert Config.global_config.foo is None
  42. Config.configure_global_app(foo="bar")
  43. assert Config.global_config.foo == "bar"
  44. with mock.patch.dict(os.environ, {"FOO": "foo"}):
  45. Config.configure_global_app(foo="ENV[FOO]")
  46. assert Config.global_config.foo == "foo"
  47. def test_override_default_configuration_with_file_configuration():
  48. tf = NamedTemporaryFile(
  49. """
  50. [TAIPY]
  51. foo = "bar"
  52. """
  53. )
  54. assert Config.global_config.foo is None
  55. Config.load(tf.filename)
  56. assert Config.global_config.foo == "bar"
  57. def test_override_default_config_with_file_config_including_env_variable_values():
  58. tf = NamedTemporaryFile(
  59. """
  60. [TAIPY]
  61. foo_attribute = "ENV[FOO]:int"
  62. bar_attribute = "ENV[BAR]:bool"
  63. """
  64. )
  65. assert Config.global_config.foo_attribute is None
  66. assert Config.global_config.bar_attribute is None
  67. with mock.patch.dict(os.environ, {"FOO": "foo", "BAR": "true"}):
  68. with pytest.raises(InconsistentEnvVariableError):
  69. Config.load(tf.filename)
  70. _ = Config.global_config.foo_attribute
  71. with mock.patch.dict(os.environ, {"FOO": "5"}):
  72. with pytest.raises(MissingEnvVariableError):
  73. Config.load(tf.filename)
  74. _ = Config.global_config.bar_attribute
  75. with mock.patch.dict(os.environ, {"FOO": "6", "BAR": "TRUe"}):
  76. Config.load(tf.filename)
  77. assert Config.global_config.foo_attribute == 6
  78. assert Config.global_config.bar_attribute
  79. def test_code_configuration_does_not_override_file_configuration():
  80. config_from_filename = NamedTemporaryFile(
  81. """
  82. [TAIPY]
  83. foo = 2
  84. """
  85. )
  86. Config.override(config_from_filename.filename)
  87. Config.configure_global_app(foo=21)
  88. assert Config.global_config.foo == 2 # From file config
  89. def test_code_configuration_does_not_override_file_configuration_including_env_variable_values():
  90. config_from_filename = NamedTemporaryFile(
  91. """
  92. [TAIPY]
  93. foo = 2
  94. """
  95. )
  96. Config.override(config_from_filename.filename)
  97. with mock.patch.dict(os.environ, {"FOO": "21"}):
  98. Config.configure_global_app(foo="ENV[FOO]")
  99. assert Config.global_config.foo == 2 # From file config
  100. def test_file_configuration_overrides_code_configuration():
  101. config_from_filename = NamedTemporaryFile(
  102. """
  103. [TAIPY]
  104. foo = 2
  105. """
  106. )
  107. Config.configure_global_app(foo=21)
  108. Config.load(config_from_filename.filename)
  109. assert Config.global_config.foo == 2 # From file config
  110. def test_file_configuration_overrides_code_configuration_including_env_variable_values():
  111. config_from_filename = NamedTemporaryFile(
  112. """
  113. [TAIPY]
  114. foo = "ENV[FOO]:int"
  115. """
  116. )
  117. Config.configure_global_app(foo=21)
  118. with mock.patch.dict(os.environ, {"FOO": "2"}):
  119. Config.load(config_from_filename.filename)
  120. assert Config.global_config.foo == 2 # From file config
  121. def test_override_default_configuration_with_multiple_configurations():
  122. file_config = NamedTemporaryFile(
  123. """
  124. [TAIPY]
  125. foo = 10
  126. bar = "baz"
  127. """
  128. )
  129. # Default config is applied
  130. assert Config.global_config.foo is None
  131. assert Config.global_config.bar is None
  132. # Code config is applied
  133. Config.configure_global_app(foo="bar")
  134. assert Config.global_config.foo == "bar"
  135. assert Config.global_config.bar is None
  136. # File config is applied
  137. Config.load(file_config.filename)
  138. assert Config.global_config.foo == 10
  139. assert Config.global_config.bar == "baz"
  140. def test_override_default_configuration_with_multiple_configurations_including_environment_variable_values():
  141. file_config = NamedTemporaryFile(
  142. """
  143. [TAIPY]
  144. att = "ENV[BAZ]"
  145. """
  146. )
  147. with mock.patch.dict(os.environ, {"FOO": "bar", "BAZ": "qux"}):
  148. # Default config is applied
  149. assert Config.global_config.att is None
  150. # Code config is applied
  151. Config.configure_global_app(att="ENV[FOO]")
  152. assert Config.global_config.att == "bar"
  153. # File config is applied
  154. Config.load(file_config.filename)
  155. assert Config.global_config.att == "qux"