| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- # coding=utf-8
- """
- Unit tests for CLI extra field support in ddns.config.cli module
- @author: GitHub Copilot
- """
- import sys
- from __init__ import unittest
- from ddns.config.cli import load_config # noqa: E402
- class TestCliExtraFields(unittest.TestCase):
- """Test CLI extra field parsing"""
- def setUp(self):
- """Save original sys.argv"""
- self.original_argv = sys.argv
- def tearDown(self):
- """Restore original sys.argv"""
- sys.argv = self.original_argv
- def test_cli_extra_single_field(self):
- """Test single --extra.xxx argument"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--extra.proxied", "true"]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "cloudflare")
- self.assertEqual(config.get("extra_proxied"), "true")
- def test_cli_extra_multiple_fields(self):
- """Test multiple --extra.xxx arguments"""
- sys.argv = [
- "ddns",
- "--dns",
- "cloudflare",
- "--extra.proxied",
- "true",
- "--extra.comment",
- "Test comment",
- "--extra.priority",
- "10",
- ]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "cloudflare")
- self.assertEqual(config.get("extra_proxied"), "true")
- self.assertEqual(config.get("extra_comment"), "Test comment")
- self.assertEqual(config.get("extra_priority"), "10")
- def test_cli_extra_with_standard_args(self):
- """Test --extra.xxx mixed with standard arguments"""
- sys.argv = [
- "ddns",
- "--dns",
- "alidns",
- "--id",
- "[email protected]",
- "--token",
- "secret123",
- "--extra.custom_field",
- "custom_value",
- "--ttl",
- "300",
- ]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "alidns")
- self.assertEqual(config.get("id"), "[email protected]")
- self.assertEqual(config.get("token"), "secret123")
- self.assertEqual(config.get("ttl"), 300)
- self.assertEqual(config.get("extra_custom_field"), "custom_value")
- def test_cli_extra_flag_without_value(self):
- """Test --extra.xxx without a value (should be treated as True)"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--extra.enabled"]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "cloudflare")
- self.assertTrue(config.get("extra_enabled"))
- def test_cli_extra_with_dots_in_name(self):
- """Test --extra.xxx.yyy format (nested key)"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--extra.settings.key1", "value1"]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "cloudflare")
- # The key should be settings.key1 (not nested object)
- self.assertEqual(config.get("extra_settings.key1"), "value1")
- def test_cli_extra_empty_value(self):
- """Test --extra.xxx with empty string value"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--extra.comment", ""]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "cloudflare")
- self.assertEqual(config.get("extra_comment"), "")
- def test_cli_extra_numeric_values(self):
- """Test --extra.xxx with numeric string values"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--extra.priority", "100", "--extra.weight", "0.5"]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("extra_priority"), "100")
- self.assertEqual(config.get("extra_weight"), "0.5")
- def test_cli_extra_special_characters(self):
- """Test --extra.xxx with special characters in value"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--extra.url", "https://example.com/path?key=value"]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("extra_url"), "https://example.com/path?key=value")
- def test_cli_no_extra_args(self):
- """Test that config works without any extra arguments"""
- sys.argv = ["ddns", "--dns", "cloudflare", "--id", "[email protected]"]
- config = load_config("Test DDNS", "Test doc", "1.0.0", "2025-07-04")
- self.assertEqual(config.get("dns"), "cloudflare")
- self.assertEqual(config.get("id"), "[email protected]")
- # No extra_* keys should exist
- extra_keys = [k for k in config.keys() if k.startswith("extra_")]
- self.assertEqual(len(extra_keys), 0)
- if __name__ == "__main__":
- unittest.main()
|