test_config_init_multi.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # coding=utf-8
  2. # type: ignore[index,operator,assignment]
  3. """
  4. Unit tests for multi-config functionality
  5. @author: GitHub Copilot
  6. """
  7. from __init__ import unittest, patch
  8. import tempfile
  9. import json
  10. import os
  11. import sys
  12. from ddns.config import load_configs
  13. from ddns.config.file import load_config as load_file_config
  14. class TestMultiConfig(unittest.TestCase):
  15. def setUp(self):
  16. self.temp_dir = tempfile.mkdtemp()
  17. self.original_argv = sys.argv[:]
  18. def tearDown(self):
  19. sys.argv = self.original_argv
  20. # Clean up temp directory
  21. import shutil
  22. shutil.rmtree(self.temp_dir, ignore_errors=True)
  23. def test_file_loader_single_object(self):
  24. """Test that file loader works with single object configs"""
  25. config_data = {"dns": "cloudflare", "id": "[email protected]", "token": "secret123"}
  26. config_path = os.path.join(self.temp_dir, "single_config.json")
  27. with open(config_path, "w") as f:
  28. json.dump(config_data, f)
  29. result = load_file_config(config_path)
  30. self.assertIsInstance(result, dict)
  31. self.assertEqual(result["dns"], "cloudflare")
  32. self.assertEqual(result["id"], "[email protected]")
  33. self.assertEqual(result["token"], "secret123")
  34. def test_cli_multiple_configs(self):
  35. """Test CLI support for multiple config files"""
  36. # Create two config files
  37. config1_data = {"dns": "cloudflare", "id": "[email protected]", "token": "secret1"}
  38. config2_data = {"dns": "dnspod", "id": "[email protected]", "token": "secret2"}
  39. config1_path = os.path.join(self.temp_dir, "config1.json")
  40. config2_path = os.path.join(self.temp_dir, "config2.json")
  41. with open(config1_path, "w") as f:
  42. json.dump(config1_data, f)
  43. with open(config2_path, "w") as f:
  44. json.dump(config2_data, f)
  45. # Mock CLI args
  46. sys.argv = ["ddns", "-c", config1_path, "-c", config2_path]
  47. with patch("ddns.config.cli.load_config") as mock_cli:
  48. mock_cli.return_value = {"config": [config1_path, config2_path]}
  49. with patch("ddns.config.env.load_config") as mock_env:
  50. mock_env.return_value = {}
  51. configs = load_configs("test", "1.0", "2023-01-01")
  52. self.assertEqual(len(configs), 2)
  53. self.assertEqual(configs[0].dns, "cloudflare")
  54. self.assertEqual(configs[1].dns, "dnspod")
  55. def test_env_multiple_configs_integration(self):
  56. """Test environment variable support for multiple config files using real CLI/env loading"""
  57. # Create two config files
  58. config1_data = {"dns": "debug", "id": "[email protected]", "token": "secret1"}
  59. config2_data = {"dns": "debug", "id": "[email protected]", "token": "secret2"}
  60. config1_path = os.path.join(self.temp_dir, "config1.json")
  61. config2_path = os.path.join(self.temp_dir, "config2.json")
  62. with open(config1_path, "w") as f:
  63. json.dump(config1_data, f)
  64. with open(config2_path, "w") as f:
  65. json.dump(config2_data, f)
  66. # Test via environment variable
  67. old_env = os.environ.get("DDNS_CONFIG")
  68. try:
  69. os.environ["DDNS_CONFIG"] = "{},{}".format(config1_path, config2_path)
  70. sys.argv = ["ddns"]
  71. configs = load_configs("test", "1.0", "2023-01-01")
  72. self.assertEqual(len(configs), 2)
  73. self.assertEqual(configs[0].dns, "debug")
  74. self.assertEqual(configs[1].dns, "debug")
  75. self.assertEqual(configs[0].id, "[email protected]")
  76. self.assertEqual(configs[1].id, "[email protected]")
  77. finally:
  78. if old_env is not None:
  79. os.environ["DDNS_CONFIG"] = old_env
  80. elif "DDNS_CONFIG" in os.environ:
  81. del os.environ["DDNS_CONFIG"]
  82. if __name__ == "__main__":
  83. unittest.main()