Skip to content

Commit 2f6bc3a

Browse files
committed
Fix test issues
1 parent 89bc6fa commit 2f6bc3a

File tree

7 files changed

+118
-46
lines changed

7 files changed

+118
-46
lines changed

cloudproxy/providers/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def set_auth(username, password):
1919

2020
if settings.config["only_host_ip"]:
2121
ip_address = requests.get('https://ipecho.net/plain').text.strip()
22-
filedata = filedata.replace("ufw allow 22/tcp", f"sudo ufw allow from {ip_address} to any port 22 proto tcp")
23-
filedata = filedata.replace("ufw allow 8899/tcp", f"sudo ufw allow from {ip_address} to any port 8899 proto tcp")
22+
filedata = filedata.replace("sudo ufw allow 22/tcp", f"sudo ufw allow from {ip_address} to any port 22 proto tcp")
23+
filedata = filedata.replace("sudo ufw allow 8899/tcp", f"sudo ufw allow from {ip_address} to any port 8899 proto tcp")
2424

2525
return filedata

cloudproxy/providers/settings.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@
6262

6363
# Set DigitalOcean config
6464
config["providers"]["digitalocean"]["enabled"] = os.environ.get(
65-
"DIGITALOCEAN_ENABLED", False
66-
)
65+
"DIGITALOCEAN_ENABLED", "False"
66+
).lower() == "true"
6767
config["providers"]["digitalocean"]["secrets"]["access_token"] = os.environ.get(
6868
"DIGITALOCEAN_ACCESS_TOKEN"
6969
)
@@ -81,7 +81,7 @@
8181
)
8282

8383
# Set AWS Config
84-
config["providers"]["aws"]["enabled"] = os.environ.get("AWS_ENABLED", False)
84+
config["providers"]["aws"]["enabled"] = os.environ.get("AWS_ENABLED", "False").lower() == "true"
8585
config["providers"]["aws"]["secrets"]["access_key_id"] = os.environ.get(
8686
"AWS_ACCESS_KEY_ID"
8787
)
@@ -100,7 +100,7 @@
100100
config["providers"]["aws"]["ami"] = os.environ.get("AWS_AMI", "ami-096cb92bb3580c759")
101101

102102
# Set GCP Config
103-
config["providers"]["gcp"]["enabled"] = os.environ.get("GCP_ENABLED", False)
103+
config["providers"]["gcp"]["enabled"] = os.environ.get("GCP_ENABLED", "False").lower() == "true"
104104
config["providers"]["gcp"]["project"] = os.environ.get("GCP_PROJECT")
105105
config["providers"]["gcp"]["secrets"]["service_account_key"] = os.environ.get(
106106
"GCP_SERVICE_ACCOUNT_KEY"
@@ -119,8 +119,8 @@
119119

120120
# Set Hetzner config
121121
config["providers"]["hetzner"]["enabled"] = os.environ.get(
122-
"HETZNER_ENABLED", False
123-
)
122+
"HETZNER_ENABLED", "False"
123+
).lower() == "true"
124124
config["providers"]["hetzner"]["secrets"]["access_token"] = os.environ.get(
125125
"HETZNER_ACCESS_TOKEN"
126126
)

requirements.txt

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
requests==2.31.0
2-
apscheduler==3.9.1
3-
dateparser==1.1.2
4-
fastapi==0.85.1
5-
loguru==0.6.0
6-
python-dotenv==0.21.0
7-
uvicorn==0.19.0
8-
uvicorn_loguru_integration==0.3.0
2+
apscheduler==3.10.4
3+
dateparser==1.2.0
4+
fastapi==0.110.0
5+
loguru==0.7.2
6+
python-dotenv==1.0.1
7+
uvicorn==0.27.1
8+
uvicorn-loguru-integration==0.3.1
99
python-digitalocean==1.17.0
10-
boto3==1.25.4
11-
urllib3==1.26.12
12-
aiofiles==22.1.0
13-
botocore~=1.28.4
10+
boto3==1.34.69
11+
urllib3==2.2.1
12+
aiofiles==23.2.1
13+
botocore==1.34.69
1414
hcloud==2.3.0
15-
google-api-python-client==2.65.0
15+
google-api-python-client==2.122.0
16+
anyio==3.7.1
17+
starlette==0.36.3
18+
pytest==8.0.2
19+
pytest-cov==4.1.0
20+
pytest-mock==3.12.0
21+
httpx==0.27.0

tests/test_main.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
from fastapi.testclient import TestClient
2+
import os
23

34
from cloudproxy.main import app
4-
from cloudproxy.providers.settings import delete_queue
5+
from cloudproxy.providers.settings import delete_queue, config
56

7+
# Configure test environment
8+
os.environ["DIGITALOCEAN_ENABLED"] = "false"
9+
10+
# Create test client
11+
# Note: The HTTPX deprecation warning is internal to the library and doesn't affect functionality
612
client = TestClient(app)
713

14+
# Set up test environment
15+
config["providers"]["digitalocean"]["enabled"] = False
16+
config["providers"]["digitalocean"]["ips"] = []
17+
config["providers"]["digitalocean"]["scaling"]["min_scaling"] = 2
18+
config["providers"]["digitalocean"]["scaling"]["max_scaling"] = 2
19+
config["providers"]["digitalocean"]["size"] = "s-1vcpu-1gb"
20+
config["providers"]["digitalocean"]["region"] = "lon1"
21+
822

923
def test_read_root():
1024
response = client.get("/")

tests/test_providers_digitalocean_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ def test_set_auth():
1010
with open(os.path.join(__location__, 'test_user_data.sh')) as file:
1111
filedata = file.read()
1212
settings.config["no_auth"] = False
13+
settings.config["only_host_ip"] = False # Ensure we use generic UFW rules
1314
assert set_auth("testingusername", "testinguserpassword") == filedata
1415

tests/test_providers_digitalocean_functions.py

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
from cloudproxy.providers.digitalocean.functions import create_proxy, delete_proxy, list_droplets
23
import os
34
import json
@@ -8,33 +9,51 @@ def __init__(self, id):
89
self.id = id
910

1011

11-
def test_create_proxy(mocker):
12-
droplet = Droplet("DROPLET-ID")
12+
def load_from_file(json_file):
13+
cwd = os.path.dirname(__file__)
14+
with open(os.path.join(cwd, json_file), 'r') as f:
15+
return json.loads(f.read())
16+
17+
18+
@pytest.fixture
19+
def droplets(mocker):
20+
"""Fixture for droplets data."""
21+
data = load_from_file('test_providers_digitalocean_functions_droplets_all.json')
22+
mocker.patch('cloudproxy.providers.digitalocean.functions.digitalocean.Manager.get_all_droplets',
23+
return_value=data['droplets'])
24+
return data['droplets']
25+
26+
27+
@pytest.fixture
28+
def droplet_id():
29+
"""Fixture for droplet ID."""
30+
return "DROPLET-ID"
31+
32+
33+
def test_list_droplets(droplets):
34+
"""Test listing droplets."""
35+
result = list_droplets()
36+
assert isinstance(result, list)
37+
assert len(result) > 0
38+
assert result[0]['id'] == 3164444 # Verify specific droplet data
39+
40+
41+
def test_create_proxy(mocker, droplet_id):
42+
"""Test creating a proxy."""
43+
droplet = Droplet(droplet_id)
1344
mocker.patch(
1445
'cloudproxy.providers.digitalocean.functions.digitalocean.Droplet.create',
1546
return_value=droplet
1647
)
1748
assert create_proxy() == True
1849

1950

20-
def test_delete_proxy(mocker):
21-
droplet_id = test_list_droplets(mocker)[0]
51+
def test_delete_proxy(mocker, droplets):
52+
"""Test deleting a proxy."""
53+
assert len(droplets) > 0
54+
droplet_id = droplets[0]['id']
2255
mocker.patch(
2356
'cloudproxy.providers.digitalocean.functions.digitalocean.Droplet.destroy',
2457
return_value=True
2558
)
2659
assert delete_proxy(droplet_id) == True
27-
28-
29-
def test_list_droplets(mocker):
30-
droplets = load_from_file('test_providers_digitalocean_functions_droplets_all.json')
31-
mocker.patch('cloudproxy.providers.digitalocean.functions.digitalocean.Manager.get_all_droplets',
32-
return_value=droplets['droplets'])
33-
assert type(list_droplets()) is list
34-
return list_droplets()
35-
36-
37-
def load_from_file(json_file):
38-
cwd = os.path.dirname(__file__)
39-
with open(os.path.join(cwd, json_file), 'r') as f:
40-
return json.loads(f.read())

tests/test_providers_digitalocean_main.py

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,40 @@
1+
import pytest
12
from cloudproxy.providers.digitalocean.main import do_deployment, do_start
2-
from tests.test_providers_digitalocean_functions import test_list_droplets, test_create_proxy, test_delete_proxy
3+
from cloudproxy.providers.digitalocean.functions import list_droplets
4+
from tests.test_providers_digitalocean_functions import test_create_proxy, test_delete_proxy, load_from_file
35

46

5-
def test_do_deployment(mocker):
7+
@pytest.fixture
8+
def droplets(mocker):
9+
"""Fixture for droplets data."""
10+
data = load_from_file('test_providers_digitalocean_functions_droplets_all.json')
11+
mocker.patch('cloudproxy.providers.digitalocean.functions.digitalocean.Manager.get_all_droplets',
12+
return_value=data['droplets'])
13+
return data['droplets']
14+
15+
16+
@pytest.fixture
17+
def droplet_id():
18+
"""Fixture for droplet ID."""
19+
return "DROPLET-ID"
20+
21+
22+
def test_do_deployment(mocker, droplets, droplet_id):
623
mocker.patch(
724
'cloudproxy.providers.digitalocean.main.list_droplets',
8-
return_value=test_list_droplets(mocker)
25+
return_value=droplets
926
)
1027
mocker.patch(
1128
'cloudproxy.providers.digitalocean.main.create_proxy',
12-
return_value=test_create_proxy(mocker)
29+
return_value=True
1330
)
1431
mocker.patch(
1532
'cloudproxy.providers.digitalocean.main.delete_proxy',
16-
return_value=test_delete_proxy(mocker)
33+
return_value=True
1734
)
18-
assert do_deployment(1) == 1
35+
result = do_deployment(1)
36+
assert isinstance(result, int)
37+
assert result == 1
1938

2039

2140
def test_initiatedo(mocker):
@@ -31,4 +50,17 @@ def test_initiatedo(mocker):
3150
'cloudproxy.providers.digitalocean.main.do_check_delete',
3251
return_value=True
3352
)
34-
assert do_start() == ["192.1.1.1"]
53+
result = do_start()
54+
assert isinstance(result, list)
55+
assert result == ["192.1.1.1"]
56+
57+
58+
def test_list_droplets(droplets):
59+
"""Test listing droplets."""
60+
result = list_droplets()
61+
assert isinstance(result, list)
62+
assert len(result) > 0
63+
assert result[0]['id'] == 3164444 # Verify specific droplet data
64+
# Store the result in a module-level variable if needed by other tests
65+
global test_droplets
66+
test_droplets = result

0 commit comments

Comments
 (0)