| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- # 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()
|