mirror of
https://github.com/NewFuture/DDNS.git
synced 2026-10-19 16:15:45 +00:00
* Initial plan * feat(config): add extra field support to Config class Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * feat(config): complete extra field implementation with documentation Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * docs(config): add practical examples for extra fields usage Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * fix(config): remove func from known_keys, delete docs, update schema Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * fix(config): revert v4.0.json changes and fix lint/format issues Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * Remove statistics option from ruff-action args * Update ddns/config/cli.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(config): fix lint error and Python 2.7 compatibility Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * fix(config): remove redundant extra unpacking in provider init Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> * fix(config): make set_record call Python 2.7 compatible Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com> Co-authored-by: New Future <NewFuture@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
146 lines
5.7 KiB
Python
146 lines
5.7 KiB
Python
# coding=utf-8
|
|
"""
|
|
Unit tests for environment variable extra field support
|
|
@author: GitHub Copilot
|
|
"""
|
|
|
|
import os
|
|
from __init__ import unittest
|
|
from ddns.config.env import load_config # noqa: E402
|
|
|
|
|
|
class TestEnvExtraFields(unittest.TestCase):
|
|
"""Test environment variable extra field parsing"""
|
|
|
|
def setUp(self):
|
|
"""Clear DDNS environment variables before each test"""
|
|
self._clear_env_prefix("DDNS_")
|
|
|
|
def tearDown(self):
|
|
"""Clean up after tests"""
|
|
self._clear_env_prefix("DDNS_")
|
|
|
|
def _clear_env_prefix(self, prefix):
|
|
# type: (str) -> None
|
|
"""Clear environment variables with a specific prefix (case-insensitive)"""
|
|
keys_to_delete = [key for key in os.environ.keys() if key.upper().startswith(prefix.upper())]
|
|
for key in keys_to_delete:
|
|
del os.environ[key]
|
|
|
|
def test_env_extra_single_field(self):
|
|
"""Test single DDNS_EXTRA_XXX environment variable"""
|
|
os.environ["DDNS_DNS"] = "cloudflare"
|
|
os.environ["DDNS_EXTRA_PROXIED"] = "true"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("dns"), "cloudflare")
|
|
self.assertEqual(config.get("extra_proxied"), "true")
|
|
|
|
def test_env_extra_multiple_fields(self):
|
|
"""Test multiple DDNS_EXTRA_XXX environment variables"""
|
|
os.environ["DDNS_DNS"] = "alidns"
|
|
os.environ["DDNS_EXTRA_PROXIED"] = "true"
|
|
os.environ["DDNS_EXTRA_COMMENT"] = "Test comment"
|
|
os.environ["DDNS_EXTRA_PRIORITY"] = "10"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("dns"), "alidns")
|
|
self.assertEqual(config.get("extra_proxied"), "true")
|
|
self.assertEqual(config.get("extra_comment"), "Test comment")
|
|
self.assertEqual(config.get("extra_priority"), "10")
|
|
|
|
def test_env_extra_with_standard_vars(self):
|
|
"""Test DDNS_EXTRA_XXX mixed with standard environment variables"""
|
|
os.environ["DDNS_DNS"] = "cloudflare"
|
|
os.environ["DDNS_ID"] = "test@example.com"
|
|
os.environ["DDNS_TOKEN"] = "secret123"
|
|
os.environ["DDNS_EXTRA_CUSTOM_FIELD"] = "custom_value"
|
|
os.environ["DDNS_TTL"] = "300"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("dns"), "cloudflare")
|
|
self.assertEqual(config.get("id"), "test@example.com")
|
|
self.assertEqual(config.get("token"), "secret123")
|
|
self.assertEqual(config.get("ttl"), "300")
|
|
self.assertEqual(config.get("extra_custom_field"), "custom_value")
|
|
|
|
def test_env_extra_case_insensitive(self):
|
|
"""Test that DDNS_EXTRA_XXX is case-insensitive"""
|
|
os.environ["ddns_extra_field1"] = "value1"
|
|
os.environ["DDNS_EXTRA_FIELD2"] = "value2"
|
|
os.environ["Ddns_Extra_Field3"] = "value3"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("extra_field1"), "value1")
|
|
self.assertEqual(config.get("extra_field2"), "value2")
|
|
self.assertEqual(config.get("extra_field3"), "value3")
|
|
|
|
def test_env_extra_with_underscores(self):
|
|
"""Test DDNS_EXTRA_XXX with underscores in field name"""
|
|
os.environ["DDNS_EXTRA_CUSTOM_FIELD_NAME"] = "value1"
|
|
os.environ["DDNS_EXTRA_ANOTHER_FIELD"] = "value2"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("extra_custom_field_name"), "value1")
|
|
self.assertEqual(config.get("extra_another_field"), "value2")
|
|
|
|
def test_env_extra_with_dots(self):
|
|
"""Test DDNS_EXTRA.XXX format (dots converted to underscores)"""
|
|
os.environ["DDNS_EXTRA.FIELD1"] = "value1"
|
|
os.environ["DDNS_EXTRA.FIELD2"] = "value2"
|
|
|
|
config = load_config()
|
|
# Dots should be converted to underscores
|
|
self.assertEqual(config.get("extra_field1"), "value1")
|
|
self.assertEqual(config.get("extra_field2"), "value2")
|
|
|
|
def test_env_extra_numeric_values(self):
|
|
"""Test DDNS_EXTRA_XXX with numeric values"""
|
|
os.environ["DDNS_EXTRA_PRIORITY"] = "100"
|
|
os.environ["DDNS_EXTRA_WEIGHT"] = "0.5"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("extra_priority"), "100")
|
|
self.assertEqual(config.get("extra_weight"), "0.5")
|
|
|
|
def test_env_extra_empty_value(self):
|
|
"""Test DDNS_EXTRA_XXX with empty value"""
|
|
os.environ["DDNS_EXTRA_COMMENT"] = ""
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("extra_comment"), "")
|
|
|
|
def test_env_no_extra_vars(self):
|
|
"""Test that config works without any extra environment variables"""
|
|
# Clear all DDNS env vars first
|
|
self._clear_env_prefix("DDNS_")
|
|
|
|
os.environ["DDNS_DNS"] = "cloudflare"
|
|
os.environ["DDNS_ID"] = "test@example.com"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("dns"), "cloudflare")
|
|
self.assertEqual(config.get("id"), "test@example.com")
|
|
# No extra_* keys should exist (only from this test)
|
|
extra_keys = [k for k in config.keys() if k.startswith("extra_")]
|
|
# Should have no extra keys from this test's environment variables
|
|
self.assertEqual(len(extra_keys), 0, "Found unexpected extra keys: {}".format(extra_keys))
|
|
|
|
def test_env_extra_json_array(self):
|
|
"""Test DDNS_EXTRA_XXX with JSON array format"""
|
|
os.environ["DDNS_EXTRA_TAGS"] = '["tag1", "tag2", "tag3"]'
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("extra_tags"), ["tag1", "tag2", "tag3"])
|
|
|
|
def test_env_extra_special_characters(self):
|
|
"""Test DDNS_EXTRA_XXX with special characters"""
|
|
os.environ["DDNS_EXTRA_URL"] = "https://example.com/path?key=value&foo=bar"
|
|
|
|
config = load_config()
|
|
self.assertEqual(config.get("extra_url"), "https://example.com/path?key=value&foo=bar")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|