|
|
@@ -0,0 +1,191 @@
|
|
|
+# coding=utf-8
|
|
|
+"""
|
|
|
+Unit tests for SSL configuration integration
|
|
|
+
|
|
|
+@author: GitHub Copilot
|
|
|
+"""
|
|
|
+
|
|
|
+import unittest
|
|
|
+import sys
|
|
|
+import os
|
|
|
+
|
|
|
+# Add parent directory to path for imports
|
|
|
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
+
|
|
|
+try:
|
|
|
+ from unittest.mock import patch
|
|
|
+except ImportError:
|
|
|
+ # Python 2.7 compatibility
|
|
|
+ from mock import patch # type: ignore
|
|
|
+
|
|
|
+from ddns.util.config import init_config, get_config # noqa: E402
|
|
|
+from ddns.__init__ import __version__, __description__, __doc__, build_date # noqa
|
|
|
+from ddns.provider._base import SimpleProvider # noqa: E402
|
|
|
+
|
|
|
+
|
|
|
+class _TestSSLProvider(SimpleProvider):
|
|
|
+ """Test provider to verify SSL configuration"""
|
|
|
+
|
|
|
+ API = "https://api.example.com"
|
|
|
+
|
|
|
+ def set_record(self, domain, value, record_type="A", ttl=None,
|
|
|
+ line=None, **extra):
|
|
|
+ return True
|
|
|
+
|
|
|
+
|
|
|
+class TestSSLConfiguration(unittest.TestCase):
|
|
|
+ """Test SSL configuration integration"""
|
|
|
+
|
|
|
+ def setUp(self):
|
|
|
+ """Set up test fixtures"""
|
|
|
+ # Clear global state before each test
|
|
|
+ import ddns.util.config
|
|
|
+ from argparse import Namespace
|
|
|
+ ddns.util.config.__cli_args = Namespace()
|
|
|
+ ddns.util.config.__config = {}
|
|
|
+ # Clear environment variables that might affect tests
|
|
|
+ # Check both uppercase and lowercase variants
|
|
|
+ for key in list(os.environ.keys()):
|
|
|
+ if (key.upper().startswith('DDNS_') or
|
|
|
+ key.lower().startswith('ddns_')):
|
|
|
+ del os.environ[key]
|
|
|
+
|
|
|
+ def tearDown(self):
|
|
|
+ """Clean up after each test"""
|
|
|
+ # Clear global state after each test
|
|
|
+ import ddns.util.config
|
|
|
+ from argparse import Namespace
|
|
|
+ ddns.util.config.__cli_args = Namespace()
|
|
|
+ ddns.util.config.__config = {}
|
|
|
+ # Clear environment variables that might affect future tests
|
|
|
+ for key in list(os.environ.keys()):
|
|
|
+ if (key.upper().startswith('DDNS_') or
|
|
|
+ key.lower().startswith('ddns_')):
|
|
|
+ del os.environ[key]
|
|
|
+
|
|
|
+ def test_cli_ssl_false(self):
|
|
|
+ """Test SSL configuration via CLI argument --ssl false"""
|
|
|
+ args = ['test', '--token', 'test', '--ssl', 'false']
|
|
|
+ with patch.object(sys, 'argv', args):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'false')
|
|
|
+
|
|
|
+ def test_cli_ssl_true(self):
|
|
|
+ """Test SSL configuration via CLI argument --ssl true"""
|
|
|
+ args = ['test', '--token', 'test', '--ssl', 'true']
|
|
|
+ with patch.object(sys, 'argv', args):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'true')
|
|
|
+
|
|
|
+ def test_cli_ssl_auto(self):
|
|
|
+ """Test SSL configuration via CLI argument --ssl auto"""
|
|
|
+ args = ['test', '--token', 'test', '--ssl', 'auto']
|
|
|
+ with patch.object(sys, 'argv', args):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'auto')
|
|
|
+
|
|
|
+ def test_cli_ssl_custom_path(self):
|
|
|
+ """Test SSL configuration via CLI argument --ssl /path/to/cert.pem"""
|
|
|
+ args = ['test', '--token', 'test', '--ssl', '/path/to/cert.pem']
|
|
|
+ with patch.object(sys, 'argv', args):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, '/path/to/cert.pem')
|
|
|
+
|
|
|
+ def test_env_ssl_false(self):
|
|
|
+ """Test SSL configuration via environment variable DDNS_SSL=false"""
|
|
|
+ # Ensure completely clean environment
|
|
|
+ clean_env = {k: v for k, v in os.environ.items()
|
|
|
+ if not (k.upper().startswith('DDNS_') or
|
|
|
+ k.lower().startswith('ddns_'))}
|
|
|
+ clean_env.update({'DDNS_SSL': 'false', 'DDNS_TOKEN': 'test'})
|
|
|
+
|
|
|
+ with patch.dict(os.environ, clean_env, clear=True):
|
|
|
+ with patch.object(sys, 'argv', ['test']):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'false')
|
|
|
+
|
|
|
+ def test_env_ssl_true(self):
|
|
|
+ """Test SSL configuration via environment variable DDNS_SSL=true"""
|
|
|
+ # Ensure completely clean environment
|
|
|
+ clean_env = {k: v for k, v in os.environ.items()
|
|
|
+ if not (k.upper().startswith('DDNS_') or
|
|
|
+ k.lower().startswith('ddns_'))}
|
|
|
+ clean_env.update({'DDNS_SSL': 'true', 'DDNS_TOKEN': 'test'})
|
|
|
+
|
|
|
+ with patch.dict(os.environ, clean_env, clear=True):
|
|
|
+ with patch.object(sys, 'argv', ['test']):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'true')
|
|
|
+
|
|
|
+ def test_env_ssl_auto(self):
|
|
|
+ """Test SSL configuration via environment variable DDNS_SSL=auto"""
|
|
|
+ # Ensure completely clean environment
|
|
|
+ clean_env = {k: v for k, v in os.environ.items()
|
|
|
+ if not (k.upper().startswith('DDNS_') or
|
|
|
+ k.lower().startswith('ddns_'))}
|
|
|
+ clean_env.update({'DDNS_SSL': 'auto', 'DDNS_TOKEN': 'test'})
|
|
|
+
|
|
|
+ with patch.dict(os.environ, clean_env, clear=True):
|
|
|
+ with patch.object(sys, 'argv', ['test']):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'auto')
|
|
|
+
|
|
|
+ def test_cli_overrides_env(self):
|
|
|
+ """Test that CLI argument overrides environment variable"""
|
|
|
+ # Ensure completely clean environment
|
|
|
+ clean_env = {k: v for k, v in os.environ.items()
|
|
|
+ if not (k.upper().startswith('DDNS_') or
|
|
|
+ k.lower().startswith('ddns_'))}
|
|
|
+ clean_env.update({'DDNS_SSL': 'false', 'DDNS_TOKEN': 'test'})
|
|
|
+
|
|
|
+ with patch.dict(os.environ, clean_env, clear=True):
|
|
|
+ with patch.object(sys, 'argv', ['test', '--ssl', 'true']):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'true')
|
|
|
+
|
|
|
+ def test_default_ssl_config(self):
|
|
|
+ """Test default SSL configuration when none provided"""
|
|
|
+ with patch.object(sys, 'argv', ['test', '--token', 'test']):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl', 'auto')
|
|
|
+ self.assertEqual(ssl_config, 'auto')
|
|
|
+
|
|
|
+ def test_provider_ssl_integration(self):
|
|
|
+ """Test that SSL configuration is passed to provider correctly"""
|
|
|
+ provider = _TestSSLProvider('test_id', 'test_token',
|
|
|
+ verify_ssl='false')
|
|
|
+ self.assertEqual(provider.verify_ssl, 'false')
|
|
|
+
|
|
|
+ provider = _TestSSLProvider('test_id', 'test_token', verify_ssl=True)
|
|
|
+ self.assertTrue(provider.verify_ssl)
|
|
|
+
|
|
|
+ cert_path = '/path/to/cert.pem'
|
|
|
+ provider = _TestSSLProvider('test_id', 'test_token',
|
|
|
+ verify_ssl=cert_path)
|
|
|
+ self.assertEqual(provider.verify_ssl, '/path/to/cert.pem')
|
|
|
+
|
|
|
+ def test_case_insensitive_env_vars(self):
|
|
|
+ """Test that environment variables are case insensitive"""
|
|
|
+ # Ensure completely clean environment
|
|
|
+ clean_env = {k: v for k, v in os.environ.items()
|
|
|
+ if not (k.upper().startswith('DDNS_') or
|
|
|
+ k.lower().startswith('ddns_'))}
|
|
|
+ clean_env.update({'ddns_ssl': 'false', 'ddns_token': 'test'})
|
|
|
+
|
|
|
+ with patch.dict(os.environ, clean_env, clear=True):
|
|
|
+ with patch.object(sys, 'argv', ['test']):
|
|
|
+ init_config(__description__, __doc__, __version__, build_date)
|
|
|
+ ssl_config = get_config('ssl')
|
|
|
+ self.assertEqual(ssl_config, 'false')
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ unittest.main()
|