123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- # Copyright 2021-2025 Avaiga Private Limited
- #
- # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- # the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations under the License.
- import os
- from unittest.mock import patch
- import pytest
- from taipy.common.config.config import Config
- from taipy.common.config.exceptions import MissingEnvVariableError
- from taipy.rest.config.rest_config import RestConfig
- from tests.core.utils.named_temporary_file import NamedTemporaryFile
- def test_rest_config_no_values():
- assert Config.rest.port == 5000
- assert Config.rest.host == "127.0.0.1"
- assert Config.rest.use_https is False
- assert Config.rest.ssl_cert is None
- assert Config.rest.ssl_key is None
- def test_rest_config_default_values():
- Config.configure_rest()
- assert Config.rest.port == RestConfig._DEFAULT_PORT
- assert Config.rest.host == RestConfig._DEFAULT_HOST
- assert Config.rest.use_https is RestConfig._DEFAULT_USE_HTTPS
- assert Config.rest.ssl_cert is RestConfig._DEFAULT_SSL_CERT
- assert Config.rest.ssl_key is RestConfig._DEFAULT_SSL_KEY
- def test_rest_config_only_part_of_custom_values():
- Config.configure_rest(
- use_https=True,
- ssl_cert="cert.pem",
- ssl_key="key.pem"
- )
- assert Config.rest.port == RestConfig._DEFAULT_PORT
- assert Config.rest.host == RestConfig._DEFAULT_HOST
- assert Config.rest.use_https is True
- assert Config.rest.ssl_cert == "cert.pem"
- assert Config.rest.ssl_key == "key.pem"
- def test_rest_config_custom_values_and_toml_override():
- # We override some default values with the Python API
- Config.configure_rest(
- port=8080,
- host="0.0.0.0",
- )
- assert Config.rest.port == 8080
- assert Config.rest.host == "0.0.0.0"
- assert Config.rest.use_https is RestConfig._DEFAULT_USE_HTTPS
- assert Config.rest.ssl_cert is RestConfig._DEFAULT_SSL_CERT
- assert Config.rest.ssl_key is RestConfig._DEFAULT_SSL_KEY
- # now we load a toml file
- toml_cfg = NamedTemporaryFile(
- content="""
- [TAIPY]
- [REST]
- port = 2
- host = "192.168.0.87"
- use_https = "true:bool"
- ssl_cert = "cert.pem"
- ssl_key = "key.pem"
- """
- )
- Config.load(toml_cfg.filename)
- assert Config.rest.port == 2
- assert Config.rest.host == "192.168.0.87"
- assert Config.rest.use_https is True
- assert Config.rest.ssl_cert == "cert.pem"
- assert Config.rest.ssl_key == "key.pem"
- def test_rest_config_custom_values_and_missing_env_var_override():
- #we use env variables
- Config.configure_rest(
- port="ENV[PORT]:int",
- host="ENV[HOST]",
- ssl_cert="ENV[SSL_CERT]",
- ssl_key="ENV[SSL_KEY]"
- )
- Config.rest.use_https = "ENV[USE_HTTPS]"
- with pytest.raises(MissingEnvVariableError):
- _ = Config.rest.port
- with pytest.raises(MissingEnvVariableError):
- _ = Config.rest.host
- with pytest.raises(MissingEnvVariableError):
- _ = Config.rest.use_https
- with pytest.raises(MissingEnvVariableError):
- _ = Config.rest.ssl_cert
- with pytest.raises(MissingEnvVariableError):
- _ = Config.rest.ssl_key
- def test_rest_config_custom_values_and_env_var_override():
- with patch.dict(os.environ, {
- "PORT": "3",
- "HOST": "1.2.3.4",
- "USE_HTTPS": "true",
- "SSL_CERT": "cert.pem",
- "SSL_KEY": "key.pem"
- }):
- # we use env variables
- Config.configure_rest(
- port="ENV[PORT]:int",
- host="ENV[HOST]",
- use_https="ENV[USE_HTTPS]:bool",
- ssl_cert="ENV[SSL_CERT]",
- ssl_key="ENV[SSL_KEY]"
- )
- assert Config.rest.port == 3
- assert Config.rest.host == "1.2.3.4"
- assert Config.rest.use_https is True
- assert Config.rest.ssl_cert == "cert.pem"
- assert Config.rest.ssl_key == "key.pem"
- def test_rest_config_copy():
- rest_config = Config.configure_rest(
- port=8080, host="0.0.0.0", use_https=True, ssl_cert="cert.pem", ssl_key="key.pem"
- )
- rest_config_copy = rest_config.__copy__()
- assert rest_config_copy.port == 8080
- assert rest_config_copy.host == "0.0.0.0"
- assert rest_config_copy.use_https is True
- assert rest_config_copy.ssl_cert == "cert.pem"
- assert rest_config_copy.ssl_key == "key.pem"
- # Ensure it's a deep copy
- rest_config_copy.port = 9090
- assert rest_config.port == 8080
- def test_rest_default_config_is_valid():
- issues = Config.check()
- assert len(issues.errors) == 0
- assert len(issues.warnings) == 0
- assert len(issues.infos) == 0
- def test_rest_config_checker_valid_config():
- Config.configure_rest(port=8080, host="0.0.0.0", use_https=True, ssl_cert="cert.pem", ssl_key="key.pem")
- issues = Config.check()
- assert len(issues.errors) == 0
- assert len(issues.warnings) == 0
- assert len(issues.infos) == 0
- def test_rest_config_checker_invalid_port_and_host():
- Config.configure_rest(port=70000, host="") # Invalid port and host
- with pytest.raises(SystemExit):
- Config.check()
- issues = Config._collector
- assert len(issues.errors) == 2
- assert len(issues.warnings) == 0
- assert len(issues.infos) == 0
- assert "port" in issues.errors[0].field
- assert "host" in issues.errors[1].field
- def test_rest_config_checker_https_missing_cert_and_key():
- Config.configure_rest(use_https=True) # Missing ssl_cert and ssl_key
- with pytest.raises(SystemExit):
- Config.check()
- issues = Config._collector
- assert len(issues.errors) == 2
- assert len(issues.warnings) == 0
- assert len(issues.infos) == 0
- assert "ssl_cert" in issues.errors[0].field
- assert "ssl_key" in issues.errors[1].field
- def test_rest_config_checker_https_invalid_cert_and_key():
- Config.configure_rest(use_https=True, ssl_cert=123, ssl_key=456) # Invalid types for ssl_cert and ssl_key
- with pytest.raises(SystemExit):
- Config.check()
- issues = Config._collector
- assert len(issues.errors) == 2
- assert len(issues.warnings) == 0
- assert len(issues.infos) == 0
- assert "ssl_cert" in issues.errors[0].field
- assert "ssl_key" in issues.errors[1].field
|