test_config_cli_extra.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. # coding=utf-8
  2. """
  3. Unit tests for CLI extra field support in ddns.config.cli module
  4. @author: GitHub Copilot
  5. """
  6. import sys
  7. from __init__ import unittest
  8. from ddns.config.cli import load_config # noqa: E402
  9. class TestCliExtraFields(unittest.TestCase):
  10. """Test CLI extra field parsing"""
  11. def setUp(self):
  12. """Save original sys.argv"""
  13. self.original_argv = sys.argv
  14. def tearDown(self):
  15. """Restore original sys.argv"""
  16. sys.argv = self.original_argv
  17. def test_cli_extra_single_field(self):
  18. """Test single --extra.xxx argument"""
  19. sys.argv = ["ddns", "--dns", "cloudflare", "--extra.proxied", "true"]
  20. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  21. self.assertEqual(config.get("dns"), "cloudflare")
  22. self.assertEqual(config.get("extra_proxied"), "true")
  23. def test_cli_extra_multiple_fields(self):
  24. """Test multiple --extra.xxx arguments"""
  25. sys.argv = [
  26. "ddns",
  27. "--dns",
  28. "cloudflare",
  29. "--extra.proxied",
  30. "true",
  31. "--extra.comment",
  32. "Test comment",
  33. "--extra.priority",
  34. "10",
  35. ]
  36. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  37. self.assertEqual(config.get("dns"), "cloudflare")
  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_cli_extra_with_standard_args(self):
  42. """Test --extra.xxx mixed with standard arguments"""
  43. sys.argv = [
  44. "ddns",
  45. "--dns",
  46. "alidns",
  47. "--id",
  48. "[email protected]",
  49. "--token",
  50. "secret123",
  51. "--extra.custom_field",
  52. "custom_value",
  53. "--ttl",
  54. "300",
  55. ]
  56. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  57. self.assertEqual(config.get("dns"), "alidns")
  58. self.assertEqual(config.get("id"), "[email protected]")
  59. self.assertEqual(config.get("token"), "secret123")
  60. self.assertEqual(config.get("ttl"), 300)
  61. self.assertEqual(config.get("extra_custom_field"), "custom_value")
  62. def test_cli_extra_flag_without_value(self):
  63. """Test --extra.xxx without a value (should be treated as True)"""
  64. sys.argv = ["ddns", "--dns", "cloudflare", "--extra.enabled"]
  65. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  66. self.assertEqual(config.get("dns"), "cloudflare")
  67. self.assertTrue(config.get("extra_enabled"))
  68. def test_cli_extra_with_dots_in_name(self):
  69. """Test --extra.xxx.yyy format (nested key)"""
  70. sys.argv = ["ddns", "--dns", "cloudflare", "--extra.settings.key1", "value1"]
  71. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  72. self.assertEqual(config.get("dns"), "cloudflare")
  73. # The key should be settings.key1 (not nested object)
  74. self.assertEqual(config.get("extra_settings.key1"), "value1")
  75. def test_cli_extra_empty_value(self):
  76. """Test --extra.xxx with empty string value"""
  77. sys.argv = ["ddns", "--dns", "cloudflare", "--extra.comment", ""]
  78. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  79. self.assertEqual(config.get("dns"), "cloudflare")
  80. self.assertEqual(config.get("extra_comment"), "")
  81. def test_cli_extra_numeric_values(self):
  82. """Test --extra.xxx with numeric string values"""
  83. sys.argv = ["ddns", "--dns", "cloudflare", "--extra.priority", "100", "--extra.weight", "0.5"]
  84. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  85. self.assertEqual(config.get("extra_priority"), "100")
  86. self.assertEqual(config.get("extra_weight"), "0.5")
  87. def test_cli_extra_special_characters(self):
  88. """Test --extra.xxx with special characters in value"""
  89. sys.argv = ["ddns", "--dns", "cloudflare", "--extra.url", "https://example.com/path?key=value"]
  90. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  91. self.assertEqual(config.get("extra_url"), "https://example.com/path?key=value")
  92. def test_cli_no_extra_args(self):
  93. """Test that config works without any extra arguments"""
  94. sys.argv = ["ddns", "--dns", "cloudflare", "--id", "[email protected]"]
  95. config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
  96. self.assertEqual(config.get("dns"), "cloudflare")
  97. self.assertEqual(config.get("id"), "[email protected]")
  98. # No extra_* keys should exist
  99. extra_keys = [k for k in config.keys() if k.startswith("extra_")]
  100. self.assertEqual(len(extra_keys), 0)
  101. if __name__ == "__main__":
  102. unittest.main()