| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- # coding=utf-8
- """
- Unit tests for DebugProvider
- @author: GitHub Copilot
- """
- import sys
- from base_test import BaseProviderTestCase, unittest, patch, MagicMock
- from ddns.provider.debug import DebugProvider
- if sys.version_info[0] < 3:
- from StringIO import StringIO # 对应 bytes
- else:
- from io import StringIO # 对应 unicode, py2.7中也存在
- class TestDebugProvider(BaseProviderTestCase):
- """Test cases for DebugProvider"""
- def setUp(self):
- """Set up test fixtures"""
- super(TestDebugProvider, self).setUp()
- def test_init_with_basic_config(self):
- """Test DebugProvider initialization with basic configuration"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- self.assertEqual(provider.auth_id, self.auth_id)
- self.assertEqual(provider.auth_token, self.auth_token)
- def test_validate_always_passes(self):
- """Test _validate method always passes (no validation required)"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- # Should not raise any exception
- provider._validate()
- def test_validate_with_none_values(self):
- """Test _validate method with None values still passes"""
- provider = DebugProvider(None, None) # type: ignore
- # Should not raise any exception even with None values
- provider._validate()
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_ipv4(self, mock_stdout):
- """Test set_record method with IPv4 address"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record("example.com", "192.168.1.1", "A")
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed
- output = mock_stdout.getvalue()
- self.assertIn("[IPv4] 192.168.1.1", output)
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_ipv6(self, mock_stdout):
- """Test set_record method with IPv6 address"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record("example.com", "2001:db8::1", "AAAA")
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed
- output = mock_stdout.getvalue()
- self.assertIn("[IPv6] 2001:db8::1", output)
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_other_type(self, mock_stdout):
- """Test set_record method with other record types (CNAME, etc.)"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record("example.com", "target.example.com", "CNAME")
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed (empty IP type for non-IP records)
- output = mock_stdout.getvalue()
- self.assertIn("[CNAME] target.example.com", output)
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_mx_type(self, mock_stdout):
- """Test set_record method with MX record type"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record("example.com", "mail.example.com", "MX")
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed
- output = mock_stdout.getvalue()
- self.assertIn("[MX] mail.example.com", output)
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_with_all_parameters(self, mock_stdout):
- """Test set_record method with all optional parameters"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record(
- domain="test.example.com", value="10.0.0.1", record_type="A", ttl=300, line="default", extra_param="test"
- )
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed
- output = mock_stdout.getvalue()
- self.assertIn("[IPv4] 10.0.0.1", output)
- def test_set_record_logger_debug_called(self):
- """Test that logger.debug is called with correct parameters"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- # Mock the logger
- provider.logger = MagicMock()
- with patch("sys.stdout", new_callable=StringIO):
- result = provider.set_record("example.com", "192.168.1.1", "A", 600, "telecom")
- # Verify the result is True
- self.assertTrue(result)
- # Verify logger.debug was called with correct parameters
- provider.logger.debug.assert_called_once_with(
- "DebugProvider: %s(%s) => %s", "example.com", "A", "192.168.1.1"
- )
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_multiple_calls(self, mock_stdout):
- """Test multiple calls to set_record method"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- # Make multiple calls
- result1 = provider.set_record("example1.com", "192.168.1.1", "A")
- result2 = provider.set_record("example2.com", "2001:db8::1", "AAAA")
- result3 = provider.set_record("example3.com", "target.example.com", "CNAME")
- # Verify all results are True
- self.assertTrue(result1)
- self.assertTrue(result2)
- self.assertTrue(result3)
- # Check that all outputs were printed
- output = mock_stdout.getvalue()
- self.assertIn("[IPv4] 192.168.1.1", output)
- self.assertIn("[IPv6] 2001:db8::1", output)
- self.assertIn("[CNAME] target.example.com", output)
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_empty_values(self, mock_stdout):
- """Test set_record method with empty values"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record("", "", "")
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed
- output = mock_stdout.getvalue()
- self.assertIn("[] ", output)
- @patch("sys.stdout", new_callable=StringIO)
- def test_set_record_none_values(self, mock_stdout):
- """Test set_record method with None values"""
- provider = DebugProvider(self.auth_id, self.auth_token)
- result = provider.set_record("example.com", "192.168.1.1", None) # type: ignore
- # Verify the result is True
- self.assertTrue(result)
- # Check that the correct output was printed (None record_type results in empty IP type)
- output = mock_stdout.getvalue()
- self.assertIn("[None] 192.168.1.1", output)
- class TestDebugProviderIntegration(unittest.TestCase):
- """Integration tests for DebugProvider"""
- def test_full_workflow_ipv4(self):
- """Test complete workflow for IPv4 record"""
- provider = DebugProvider("test_auth_id", "test_auth_token")
- with patch("sys.stdout", new_callable=StringIO) as mock_stdout:
- result = provider.set_record("test.com", "1.2.3.4", "A", 300, "default")
- self.assertTrue(result)
- output = mock_stdout.getvalue()
- self.assertIn("[IPv4] 1.2.3.4", output)
- def test_full_workflow_ipv6(self):
- """Test complete workflow for IPv6 record"""
- provider = DebugProvider("test_auth_id", "test_auth_token")
- with patch("sys.stdout", new_callable=StringIO) as mock_stdout:
- result = provider.set_record("test.com", "::1", "AAAA", 600, "telecom")
- self.assertTrue(result)
- output = mock_stdout.getvalue()
- self.assertIn("[IPv6] ::1", output)
- def test_full_workflow_cname(self):
- """Test complete workflow for CNAME record"""
- provider = DebugProvider("test_auth_id", "test_auth_token")
- with patch("sys.stdout", new_callable=StringIO) as mock_stdout:
- result = provider.set_record("www.test.com", "test.com", "CNAME", 3600)
- self.assertTrue(result)
- output = mock_stdout.getvalue()
- self.assertIn("[CNAME] test.com", output)
- if __name__ == "__main__":
- unittest.main()
|