Skip to content

Commit 04dee98

Browse files
committed
test: use BoundModelTestCase
1 parent c37c236 commit 04dee98

File tree

11 files changed

+849
-1797
lines changed

11 files changed

+849
-1797
lines changed

tests/unit/certificates/test_client.py

Lines changed: 30 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -12,88 +12,42 @@
1212
ManagedCertificateStatus,
1313
)
1414

15+
from ..conftest import BoundModelTestCase
1516

16-
class TestBoundCertificate:
17-
@pytest.fixture()
18-
def bound_certificate(self, client: Client):
19-
return BoundCertificate(client.certificates, data=dict(id=14))
20-
21-
def test_bound_certificate_init(self, certificate_response):
22-
bound_certificate = BoundCertificate(
23-
client=mock.MagicMock(), data=certificate_response["certificate"]
24-
)
25-
26-
assert bound_certificate.id == 2323
27-
assert bound_certificate.name == "My Certificate"
28-
assert bound_certificate.type == "managed"
29-
assert (
30-
bound_certificate.fingerprint
31-
== "03:c7:55:9b:2a:d1:04:17:09:f6:d0:7f:18:34:63:d4:3e:5f"
32-
)
33-
assert bound_certificate.certificate == "-----BEGIN CERTIFICATE-----\n..."
34-
assert len(bound_certificate.domain_names) == 3
35-
assert bound_certificate.domain_names[0] == "example.com"
36-
assert bound_certificate.domain_names[1] == "webmail.example.com"
37-
assert bound_certificate.domain_names[2] == "www.example.com"
38-
assert isinstance(bound_certificate.status, ManagedCertificateStatus)
39-
assert bound_certificate.status.issuance == "failed"
40-
assert bound_certificate.status.renewal == "scheduled"
41-
assert bound_certificate.status.error.code == "error_code"
42-
assert bound_certificate.status.error.message == "error message"
43-
44-
def test_update(
45-
self,
46-
request_mock: mock.MagicMock,
47-
bound_certificate,
48-
response_update_certificate,
49-
):
50-
request_mock.return_value = response_update_certificate
5117

52-
certificate = bound_certificate.update(name="New name")
18+
class TestBoundCertificate(BoundModelTestCase):
19+
methods = [
20+
BoundCertificate.update,
21+
BoundCertificate.delete,
22+
BoundCertificate.retry_issuance,
23+
]
5324

54-
request_mock.assert_called_with(
55-
method="PUT",
56-
url="/certificates/14",
57-
json={"name": "New name"},
58-
)
59-
60-
assert certificate.id == 2323
61-
assert certificate.name == "New name"
62-
63-
def test_delete(
64-
self,
65-
request_mock: mock.MagicMock,
66-
bound_certificate,
67-
action_response,
68-
):
69-
request_mock.return_value = action_response
70-
71-
delete_success = bound_certificate.delete()
72-
73-
request_mock.assert_called_with(
74-
method="DELETE",
75-
url="/certificates/14",
76-
)
77-
78-
assert delete_success is True
79-
80-
def test_retry_issuance(
81-
self,
82-
request_mock: mock.MagicMock,
83-
bound_certificate,
84-
response_retry_issuance_action,
85-
):
86-
request_mock.return_value = response_retry_issuance_action
87-
88-
action = bound_certificate.retry_issuance()
25+
@pytest.fixture()
26+
def resource_client(self, client: Client):
27+
return client.certificates
8928

90-
request_mock.assert_called_with(
91-
method="POST",
92-
url="/certificates/14/actions/retry",
29+
@pytest.fixture()
30+
def bound_model(self, resource_client, certificate_response):
31+
return BoundCertificate(
32+
resource_client, data=certificate_response["certificate"]
9333
)
9434

95-
assert action.id == 14
96-
assert action.command == "issue_certificate"
35+
def test_init(self, bound_model: BoundCertificate):
36+
o = bound_model
37+
assert o.id == 2323
38+
assert o.name == "My Certificate"
39+
assert o.type == "managed"
40+
assert o.fingerprint == "03:c7:55:9b:2a:d1:04:17:09:f6:d0:7f:18:34:63:d4:3e:5f"
41+
assert o.certificate == "-----BEGIN CERTIFICATE-----\n..."
42+
assert len(o.domain_names) == 3
43+
assert o.domain_names[0] == "example.com"
44+
assert o.domain_names[1] == "webmail.example.com"
45+
assert o.domain_names[2] == "www.example.com"
46+
assert isinstance(o.status, ManagedCertificateStatus)
47+
assert o.status.issuance == "failed"
48+
assert o.status.renewal == "scheduled"
49+
assert o.status.error.code == "error_code"
50+
assert o.status.error.message == "error message"
9751

9852

9953
class TestCertificatesClient:

tests/unit/firewalls/test_client.py

Lines changed: 51 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,42 @@
1515
)
1616
from hcloud.servers import Server
1717

18+
from ..conftest import BoundModelTestCase
1819

19-
class TestBoundFirewall:
20-
@pytest.fixture()
21-
def bound_firewall(self, client: Client):
22-
return BoundFirewall(client.firewalls, data=dict(id=1))
23-
24-
def test_bound_firewall_init(self, firewall_response):
25-
bound_firewall = BoundFirewall(
26-
client=mock.MagicMock(), data=firewall_response["firewall"]
27-
)
2820

29-
assert bound_firewall.id == 38
30-
assert bound_firewall.name == "Corporate Intranet Protection"
31-
assert bound_firewall.labels == {}
32-
assert isinstance(bound_firewall.rules, list)
33-
assert len(bound_firewall.rules) == 2
21+
class TestBoundFirewall(BoundModelTestCase):
22+
methods = [
23+
BoundFirewall.update,
24+
BoundFirewall.delete,
25+
BoundFirewall.apply_to_resources,
26+
BoundFirewall.remove_from_resources,
27+
BoundFirewall.set_rules,
28+
]
3429

35-
assert isinstance(bound_firewall.applied_to, list)
36-
assert len(bound_firewall.applied_to) == 2
37-
assert bound_firewall.applied_to[0].server.id == 42
38-
assert bound_firewall.applied_to[0].type == "server"
39-
assert bound_firewall.applied_to[1].label_selector.selector == "key==value"
40-
assert bound_firewall.applied_to[1].type == "label_selector"
30+
@pytest.fixture()
31+
def resource_client(self, client: Client):
32+
return client.firewalls
4133

42-
firewall_in_rule = bound_firewall.rules[0]
34+
@pytest.fixture()
35+
def bound_model(self, resource_client, firewall_response):
36+
return BoundFirewall(resource_client, data=firewall_response["firewall"])
37+
38+
def test_init(self, bound_model: BoundFirewall):
39+
o = bound_model
40+
assert o.id == 38
41+
assert o.name == "Corporate Intranet Protection"
42+
assert o.labels == {}
43+
assert isinstance(o.rules, list)
44+
assert len(o.rules) == 2
45+
46+
assert isinstance(o.applied_to, list)
47+
assert len(o.applied_to) == 2
48+
assert o.applied_to[0].server.id == 42
49+
assert o.applied_to[0].type == "server"
50+
assert o.applied_to[1].label_selector.selector == "key==value"
51+
assert o.applied_to[1].type == "label_selector"
52+
53+
firewall_in_rule = o.rules[0]
4354
assert isinstance(firewall_in_rule, FirewallRule)
4455
assert firewall_in_rule.direction == FirewallRule.DIRECTION_IN
4556
assert firewall_in_rule.protocol == FirewallRule.PROTOCOL_TCP
@@ -55,7 +66,7 @@ def test_bound_firewall_init(self, firewall_response):
5566
assert len(firewall_in_rule.destination_ips) == 0
5667
assert firewall_in_rule.description == "allow http in"
5768

58-
firewall_out_rule = bound_firewall.rules[1]
69+
firewall_out_rule = o.rules[1]
5970
assert isinstance(firewall_out_rule, FirewallRule)
6071
assert firewall_out_rule.direction == FirewallRule.DIRECTION_OUT
6172
assert firewall_out_rule.protocol == FirewallRule.PROTOCOL_TCP
@@ -71,120 +82,6 @@ def test_bound_firewall_init(self, firewall_response):
7182
]
7283
assert firewall_out_rule.description == "allow http out"
7384

74-
def test_update(
75-
self,
76-
request_mock: mock.MagicMock,
77-
bound_firewall,
78-
response_update_firewall,
79-
):
80-
request_mock.return_value = response_update_firewall
81-
82-
firewall = bound_firewall.update(
83-
name="New Corporate Intranet Protection", labels={}
84-
)
85-
86-
request_mock.assert_called_with(
87-
method="PUT",
88-
url="/firewalls/1",
89-
json={"name": "New Corporate Intranet Protection", "labels": {}},
90-
)
91-
92-
assert firewall.id == 38
93-
assert firewall.name == "New Corporate Intranet Protection"
94-
95-
def test_delete(
96-
self,
97-
request_mock: mock.MagicMock,
98-
bound_firewall,
99-
):
100-
delete_success = bound_firewall.delete()
101-
102-
request_mock.assert_called_with(
103-
method="DELETE",
104-
url="/firewalls/1",
105-
)
106-
107-
assert delete_success is True
108-
109-
def test_set_rules(
110-
self,
111-
request_mock: mock.MagicMock,
112-
bound_firewall,
113-
response_set_rules,
114-
):
115-
request_mock.return_value = response_set_rules
116-
117-
actions = bound_firewall.set_rules(
118-
[
119-
FirewallRule(
120-
direction=FirewallRule.DIRECTION_IN,
121-
protocol=FirewallRule.PROTOCOL_ICMP,
122-
source_ips=["0.0.0.0/0", "::/0"],
123-
description="New firewall description",
124-
)
125-
]
126-
)
127-
128-
request_mock.assert_called_with(
129-
method="POST",
130-
url="/firewalls/1/actions/set_rules",
131-
json={
132-
"rules": [
133-
{
134-
"direction": "in",
135-
"protocol": "icmp",
136-
"source_ips": ["0.0.0.0/0", "::/0"],
137-
"description": "New firewall description",
138-
}
139-
]
140-
},
141-
)
142-
143-
assert actions[0].id == 13
144-
assert actions[0].progress == 100
145-
146-
def test_apply_to_resources(
147-
self,
148-
request_mock: mock.MagicMock,
149-
bound_firewall,
150-
response_set_rules,
151-
):
152-
request_mock.return_value = response_set_rules
153-
154-
actions = bound_firewall.apply_to_resources(
155-
[FirewallResource(type=FirewallResource.TYPE_SERVER, server=Server(id=5))]
156-
)
157-
158-
request_mock.assert_called_with(
159-
method="POST",
160-
url="/firewalls/1/actions/apply_to_resources",
161-
json={"apply_to": [{"type": "server", "server": {"id": 5}}]},
162-
)
163-
164-
assert actions[0].id == 13
165-
assert actions[0].progress == 100
166-
167-
def test_remove_from_resources(
168-
self,
169-
request_mock: mock.MagicMock,
170-
bound_firewall,
171-
response_set_rules,
172-
):
173-
request_mock.return_value = response_set_rules
174-
175-
actions = bound_firewall.remove_from_resources(
176-
[FirewallResource(type=FirewallResource.TYPE_SERVER, server=Server(id=5))]
177-
)
178-
179-
request_mock.assert_called_with(
180-
method="POST",
181-
url="/firewalls/1/actions/remove_from_resources",
182-
json={"remove_from": [{"type": "server", "server": {"id": 5}}]},
183-
)
184-
185-
assert actions[0].id == 13
186-
assert actions[0].progress == 100
187-
18885

18986
class TestFirewallsClient:
19087
@pytest.fixture()
@@ -421,7 +318,15 @@ def test_set_rules(
421318
direction=FirewallRule.DIRECTION_IN,
422319
protocol=FirewallRule.PROTOCOL_ICMP,
423320
source_ips=["0.0.0.0/0", "::/0"],
424-
)
321+
description="Allow ICMP from everywhere",
322+
),
323+
FirewallRule(
324+
direction=FirewallRule.DIRECTION_IN,
325+
protocol=FirewallRule.PROTOCOL_TCP,
326+
port="80",
327+
source_ips=["0.0.0.0/0", "::/0"],
328+
description="Allow HTTP from everywhere",
329+
),
425330
],
426331
)
427332

@@ -434,7 +339,15 @@ def test_set_rules(
434339
"direction": "in",
435340
"protocol": "icmp",
436341
"source_ips": ["0.0.0.0/0", "::/0"],
437-
}
342+
"description": "Allow ICMP from everywhere",
343+
},
344+
{
345+
"direction": "in",
346+
"protocol": "tcp",
347+
"port": "80",
348+
"source_ips": ["0.0.0.0/0", "::/0"],
349+
"description": "Allow HTTP from everywhere",
350+
},
438351
]
439352
},
440353
)

0 commit comments

Comments
 (0)