1515)
1616from 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
18986class 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