import pytest from unittest.mock import MagicMock, patch from infra_cli.cloudflare import CloudflareManager class MockConfig: def get(self, key, default=None): if key == 'cloudflare.token': return 'test-token' return default @patch('infra_cli.cloudflare.requests') def test_cloudflare_zone_id_retrieval(mock_requests): # Mock API response mock_res = MagicMock() mock_res.json.return_value = { "success": True, "result": [{"id": "zone-123"}] } mock_requests.get.return_value = mock_res mgr = CloudflareManager(MockConfig()) zone_id = mgr.get_zone_id("example.com") assert zone_id == "zone-123" mock_requests.get.assert_called_with( "https://api.cloudflare.com/client/v4/zones?name=example.com", headers={"Authorization": "Bearer test-token", "Content-Type": "application/json"} ) @patch('infra_cli.cloudflare.requests') def test_cloudflare_update_logic(mock_requests): mgr = CloudflareManager(MockConfig()) mgr.add_domain("example.com") # Mock external IP check mock_requests.get.return_value.text = "1.2.3.4" # Mock Zone ID and DNS Records with patch.object(CloudflareManager, 'get_zone_id', return_value="zone-123"): # Mock finding existing A record mock_get_records = MagicMock() mock_get_records.json.return_value = { "result": [{"id": "rec-456", "content": "9.9.9.9", "proxied": True}] } # Setup specific returns for consecutive calls mock_requests.get.side_effect = [ MagicMock(text="1.2.3.4"), # External IP mock_get_records # List records ] # Mock successful update mock_requests.put.return_value.json.return_value = {"success": True} res = mgr.update_ddns() assert "Updated to 1.2.3.4" in res