test_config.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import os
  2. from typing import Dict
  3. import pytest
  4. import reflex as rx
  5. from reflex import constants
  6. from reflex.config import DBConfig, get_config
  7. from reflex.constants import get_value
  8. @pytest.fixture
  9. def config_no_db_url_values(base_config_values) -> Dict:
  10. """Create config values with no db_url.
  11. Args:
  12. base_config_values: Base config fixture.
  13. Returns:
  14. Config values.
  15. """
  16. base_config_values.pop("db_url")
  17. return base_config_values
  18. @pytest.fixture(autouse=True)
  19. def config_empty_db_url_values(base_config_values):
  20. """Create config values with empty db_url.
  21. Args:
  22. base_config_values: Base config values fixture.
  23. Yields:
  24. Config values
  25. """
  26. base_config_values["db_url"] = None
  27. yield base_config_values
  28. os.environ.pop("DB_URL", None)
  29. @pytest.fixture
  30. def config_none_db_url_values(base_config_values):
  31. """Create config values with None (string) db_url.
  32. Args:
  33. base_config_values: Base config values fixture.
  34. Yields:
  35. Config values
  36. """
  37. base_config_values["db_url"] = "None"
  38. yield base_config_values
  39. os.environ.pop("DB_URL")
  40. def test_config_db_url(base_config_values):
  41. """Test defined db_url is not changed.
  42. Args:
  43. base_config_values: base_config_values fixture.
  44. """
  45. os.environ.pop("DB_URL")
  46. config = rx.Config(**base_config_values)
  47. assert config.db_url == base_config_values["db_url"]
  48. def test_default_db_url(config_no_db_url_values):
  49. """Test that db_url is assigned the default value if not passed.
  50. Args:
  51. config_no_db_url_values: Config values with no db_url defined.
  52. """
  53. config = rx.Config(**config_no_db_url_values)
  54. assert config.db_url == constants.DB_URL
  55. def test_empty_db_url(config_empty_db_url_values):
  56. """Test that db_url is not automatically assigned if an empty value is defined.
  57. Args:
  58. config_empty_db_url_values: Config values with empty db_url.
  59. """
  60. config = rx.Config(**config_empty_db_url_values)
  61. assert config.db_url is None
  62. def test_none_db_url(config_none_db_url_values):
  63. """Test that db_url is set 'None' (string) assigned if an 'None' (string) value is defined.
  64. Args:
  65. config_none_db_url_values: Config values with None (string) db_url.
  66. """
  67. config = rx.Config(**config_none_db_url_values)
  68. assert config.db_url == "None"
  69. def test_db_url_precedence(base_config_values, sqlite_db_config_values):
  70. """Test that db_url is not overwritten when db_url is defined.
  71. Args:
  72. base_config_values: config values that include db_ur.
  73. sqlite_db_config_values: DB config values.
  74. """
  75. db_config = DBConfig(**sqlite_db_config_values)
  76. base_config_values["db_config"] = db_config
  77. config = rx.Config(**base_config_values)
  78. assert config.db_url == base_config_values["db_url"]
  79. def test_db_url_from_db_config(config_no_db_url_values, sqlite_db_config_values):
  80. """Test db_url generation from db_config.
  81. Args:
  82. config_no_db_url_values: Config values with no db_url.
  83. sqlite_db_config_values: DB config values.
  84. """
  85. db_config = DBConfig(**sqlite_db_config_values)
  86. config_no_db_url_values["db_config"] = db_config
  87. config = rx.Config(**config_no_db_url_values)
  88. assert config.db_url == db_config.get_url()
  89. @pytest.mark.parametrize(
  90. "key, value, expected_value_type_in_config",
  91. (
  92. ("TIMEOUT", "1", int),
  93. ("CORS_ALLOWED_ORIGINS", "[1, 2, 3]", list),
  94. ("DB_NAME", "dbname", str),
  95. ),
  96. )
  97. def test_get_value(monkeypatch, key, value, expected_value_type_in_config):
  98. monkeypatch.setenv(key, value)
  99. casted_value = get_value(key, type_=expected_value_type_in_config)
  100. assert isinstance(casted_value, expected_value_type_in_config)
  101. @pytest.mark.parametrize(
  102. "kwargs, expected",
  103. [
  104. ({"app_name": "test_app", "api_url": "http://example.com"}, "/event"),
  105. ({"app_name": "test_app", "api_url": "http://example.com/api"}, "/api/event"),
  106. ({"app_name": "test_app", "event_namespace": "/event"}, "/event"),
  107. ({"app_name": "test_app", "event_namespace": "event"}, "/event"),
  108. ({"app_name": "test_app", "event_namespace": "event/"}, "/event"),
  109. ],
  110. )
  111. def test_event_namespace(mocker, kwargs, expected):
  112. """Test the event namespace.
  113. Args:
  114. mocker: The pytest mock object.
  115. kwargs: The Config kwargs.
  116. expected: Expected namespace
  117. """
  118. conf = rx.Config(**kwargs)
  119. mocker.patch("reflex.config.get_config", return_value=conf)
  120. config = get_config()
  121. assert config.get_event_namespace() == expected