55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
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
|