test_config_env_extra.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # coding=utf-8
  2. """
  3. Unit tests for environment variable extra field support
  4. @author: GitHub Copilot
  5. """
  6. import os
  7. from __init__ import unittest
  8. from ddns.config.env import load_config # noqa: E402
  9. class TestEnvExtraFields(unittest.TestCase):
  10. """Test environment variable extra field parsing"""
  11. def setUp(self):
  12. """Clear DDNS environment variables before each test"""
  13. self._clear_env_prefix("DDNS_")
  14. def tearDown(self):
  15. """Clean up after tests"""
  16. self._clear_env_prefix("DDNS_")
  17. def _clear_env_prefix(self, prefix):
  18. # type: (str) -> None
  19. """Clear environment variables with a specific prefix (case-insensitive)"""
  20. keys_to_delete = [key for key in os.environ.keys() if key.upper().startswith(prefix.upper())]
  21. for key in keys_to_delete:
  22. del os.environ[key]
  23. def test_env_extra_single_field(self):
  24. """Test single DDNS_EXTRA_XXX environment variable"""
  25. os.environ["DDNS_DNS"] = "cloudflare"
  26. os.environ["DDNS_EXTRA_PROXIED"] = "true"
  27. config = load_config()
  28. self.assertEqual(config.get("dns"), "cloudflare")
  29. self.assertEqual(config.get("extra_proxied"), "true")
  30. def test_env_extra_multiple_fields(self):
  31. """Test multiple DDNS_EXTRA_XXX environment variables"""
  32. os.environ["DDNS_DNS"] = "alidns"
  33. os.environ["DDNS_EXTRA_PROXIED"] = "true"
  34. os.environ["DDNS_EXTRA_COMMENT"] = "Test comment"
  35. os.environ["DDNS_EXTRA_PRIORITY"] = "10"
  36. config = load_config()
  37. self.assertEqual(config.get("dns"), "alidns")
  38. self.assertEqual(config.get("extra_proxied"), "true")
  39. self.assertEqual(config.get("extra_comment"), "Test comment")
  40. self.assertEqual(config.get("extra_priority"), "10")
  41. def test_env_extra_with_standard_vars(self):
  42. """Test DDNS_EXTRA_XXX mixed with standard environment variables"""
  43. os.environ["DDNS_DNS"] = "cloudflare"
  44. os.environ["DDNS_ID"] = "[email protected]"
  45. os.environ["DDNS_TOKEN"] = "secret123"
  46. os.environ["DDNS_EXTRA_CUSTOM_FIELD"] = "custom_value"
  47. os.environ["DDNS_TTL"] = "300"
  48. config = load_config()
  49. self.assertEqual(config.get("dns"), "cloudflare")
  50. self.assertEqual(config.get("id"), "[email protected]")
  51. self.assertEqual(config.get("token"), "secret123")
  52. self.assertEqual(config.get("ttl"), "300")
  53. self.assertEqual(config.get("extra_custom_field"), "custom_value")
  54. def test_env_extra_case_insensitive(self):
  55. """Test that DDNS_EXTRA_XXX is case-insensitive"""
  56. os.environ["ddns_extra_field1"] = "value1"
  57. os.environ["DDNS_EXTRA_FIELD2"] = "value2"
  58. os.environ["Ddns_Extra_Field3"] = "value3"
  59. config = load_config()
  60. self.assertEqual(config.get("extra_field1"), "value1")
  61. self.assertEqual(config.get("extra_field2"), "value2")
  62. self.assertEqual(config.get("extra_field3"), "value3")
  63. def test_env_extra_with_underscores(self):
  64. """Test DDNS_EXTRA_XXX with underscores in field name"""
  65. os.environ["DDNS_EXTRA_CUSTOM_FIELD_NAME"] = "value1"
  66. os.environ["DDNS_EXTRA_ANOTHER_FIELD"] = "value2"
  67. config = load_config()
  68. self.assertEqual(config.get("extra_custom_field_name"), "value1")
  69. self.assertEqual(config.get("extra_another_field"), "value2")
  70. def test_env_extra_with_dots(self):
  71. """Test DDNS_EXTRA.XXX format (dots converted to underscores)"""
  72. os.environ["DDNS_EXTRA.FIELD1"] = "value1"
  73. os.environ["DDNS_EXTRA.FIELD2"] = "value2"
  74. config = load_config()
  75. # Dots should be converted to underscores
  76. self.assertEqual(config.get("extra_field1"), "value1")
  77. self.assertEqual(config.get("extra_field2"), "value2")
  78. def test_env_extra_numeric_values(self):
  79. """Test DDNS_EXTRA_XXX with numeric values"""
  80. os.environ["DDNS_EXTRA_PRIORITY"] = "100"
  81. os.environ["DDNS_EXTRA_WEIGHT"] = "0.5"
  82. config = load_config()
  83. self.assertEqual(config.get("extra_priority"), "100")
  84. self.assertEqual(config.get("extra_weight"), "0.5")
  85. def test_env_extra_empty_value(self):
  86. """Test DDNS_EXTRA_XXX with empty value"""
  87. os.environ["DDNS_EXTRA_COMMENT"] = ""
  88. config = load_config()
  89. self.assertEqual(config.get("extra_comment"), "")
  90. def test_env_no_extra_vars(self):
  91. """Test that config works without any extra environment variables"""
  92. # Clear all DDNS env vars first
  93. self._clear_env_prefix("DDNS_")
  94. os.environ["DDNS_DNS"] = "cloudflare"
  95. os.environ["DDNS_ID"] = "[email protected]"
  96. config = load_config()
  97. self.assertEqual(config.get("dns"), "cloudflare")
  98. self.assertEqual(config.get("id"), "[email protected]")
  99. # No extra_* keys should exist (only from this test)
  100. extra_keys = [k for k in config.keys() if k.startswith("extra_")]
  101. # Should have no extra keys from this test's environment variables
  102. self.assertEqual(len(extra_keys), 0, "Found unexpected extra keys: {}".format(extra_keys))
  103. def test_env_extra_json_array(self):
  104. """Test DDNS_EXTRA_XXX with JSON array format"""
  105. os.environ["DDNS_EXTRA_TAGS"] = '["tag1", "tag2", "tag3"]'
  106. config = load_config()
  107. self.assertEqual(config.get("extra_tags"), ["tag1", "tag2", "tag3"])
  108. def test_env_extra_special_characters(self):
  109. """Test DDNS_EXTRA_XXX with special characters"""
  110. os.environ["DDNS_EXTRA_URL"] = "https://example.com/path?key=value&foo=bar"
  111. config = load_config()
  112. self.assertEqual(config.get("extra_url"), "https://example.com/path?key=value&foo=bar")
  113. if __name__ == "__main__":
  114. unittest.main()