Skip to content

Commit 87f84d0

Browse files
improved soap unit tests
1 parent 8616d3e commit 87f84d0

10 files changed

Lines changed: 98 additions & 40 deletions
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.service.softlayer.com/soap/v3.1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3+
<SOAP-ENV:Body>
4+
<ns1:getObjectResponse>
5+
<getObjectReturn xsi:type="ns1:SoftLayer_Account">
6+
<companyName xsi:type="xsd:string">SoftLayer Internal - Development Community</companyName>
7+
<id xsi:type="xsd:int">307608</id>
8+
</getObjectReturn>
9+
</ns1:getObjectResponse>
10+
</SOAP-ENV:Body>
11+
</SOAP-ENV:Envelope>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.service.softlayer.com/soap/v3.1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3+
<SOAP-ENV:Header>
4+
<ns1:totalItems>
5+
<amount>1</amount>
6+
</ns1:totalItems>
7+
</SOAP-ENV:Header>
8+
<SOAP-ENV:Body>
9+
<ns1:getVirtualGuestsResponse>
10+
<getVirtualGuestsReturn SOAP-ENC:arrayType="ns1:SoftLayer_Virtual_Guest[1]" xsi:type="ns1:SoftLayer_Virtual_GuestArray">
11+
<item xsi:type="ns1:SoftLayer_Virtual_Guest">
12+
<domain xsi:type="xsd:string">cgallo.com</domain>
13+
<hostname xsi:type="xsd:string">KVM-Test</hostname>
14+
<id xsi:type="xsd:int">121401696</id>
15+
</item>
16+
</getVirtualGuestsReturn>
17+
</ns1:getVirtualGuestsResponse>
18+
</SOAP-ENV:Body>
19+
</SOAP-ENV:Envelope>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.service.softlayer.com/soap/v3.1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3+
<SOAP-ENV:Body>
4+
<ns1:getObjectResponse>
5+
<getObjectReturn xsi:type="ns1:SoftLayer_Virtual_Guest">
6+
<domain xsi:type="xsd:string">ibm.com</domain>
7+
<hostname xsi:type="xsd:string">KVM-Test</hostname>
8+
<id xsi:type="xsd:int">121401696</id>
9+
</getObjectReturn>
10+
</ns1:getObjectResponse>
11+
</SOAP-ENV:Body>
12+
</SOAP-ENV:Envelope>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.service.softlayer.com/soap/v3.1/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header><ns1:totalItems><amount>109</amount></ns1:totalItems></SOAP-ENV:Header><SOAP-ENV:Body><ns1:getAllObjectsResponse><getAllObjectsReturn SOAP-ENC:arrayType="ns1:SoftLayer_Product_Package[5]" xsi:type="ns1:SoftLayer_Product_PackageArray"><item xsi:type="ns1:SoftLayer_Product_Package"><id xsi:type="xsd:int">56</id><keyName xsi:type="xsd:string">2U_QUAD_PROCESSOR_MULTI_CORE_NEHALEM_EX</keyName><name xsi:type="xsd:string">Quad Processor Multi Core Nehalem EX</name><type xsi:type="ns1:SoftLayer_Product_Package_Type" id="ref1"><id xsi:type="xsd:int">2</id><keyName xsi:type="xsd:string">BARE_METAL_CPU</keyName></type></item><item xsi:type="ns1:SoftLayer_Product_Package"><id xsi:type="xsd:int">126</id><keyName xsi:type="xsd:string">SINGLE_XEON_1200_SANDY_BRIDGE_HASWELL</keyName><name xsi:type="xsd:string">Single Xeon 1200 Series (Sandy Bridge / Haswell)</name><type href="#ref1"/></item><item xsi:type="ns1:SoftLayer_Product_Package"><id xsi:type="xsd:int">142</id><keyName xsi:type="xsd:string">SINGLE_XEON_2000_SANDY_BRIDGE</keyName><name xsi:type="xsd:string">Single Xeon 2000 Series (Sandy Bridge)</name><type href="#ref1"/></item><item xsi:type="ns1:SoftLayer_Product_Package"><id xsi:type="xsd:int">143</id><keyName xsi:type="xsd:string">DUAL_XEON_2000_SANDY_BRIDGE</keyName><name xsi:type="xsd:string">Dual Xeon 2000 Series (Sandy Bridge)</name><type href="#ref1"/></item><item xsi:type="ns1:SoftLayer_Product_Package"><id xsi:type="xsd:int">144</id><keyName xsi:type="xsd:string">3U_GPU</keyName><name xsi:type="xsd:string">Specialty Server: GPU</name><type href="#ref1"/></item></getAllObjectsReturn></ns1:getAllObjectsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.service.softlayer.com/soap/v3.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:getObjectResponse><getObjectReturn xsi:type="ns1:SoftLayer_Account"><companyName xsi:type="xsd:string">SoftLayer Internal - Development Community</companyName><id xsi:type="xsd:int">307608</id></getObjectReturn></ns1:getObjectResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

SoftLayer/transports/soap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def __call__(self, request):
9595
headers.append(xsd_filter(**request.filter))
9696

9797
if request.identifier:
98-
init_param = f"{request.service}init_parameters"
98+
init_param = f"{request.service}InitParameters"
9999
init_paramtype = client.get_type(f"{{{self.soapns}}}{init_param}")
100100
xsdinit_param = xsd.Element(
101101
f"{{{self.soapns}}}{init_param}", init_paramtype

tests/transports/soap_tests.py

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,53 @@
11
"""
2-
SoftLayer.tests.transports.xmlrc
2+
SoftLayer.tests.transports.soap
33
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44
55
:license: MIT, see LICENSE for more details.
66
"""
77
import io
88
import os
99
import requests
10+
from unittest import mock as mock
1011

1112
from SoftLayer import testing
1213
from SoftLayer.transports import Request
1314
from SoftLayer.transports.soap import SoapTransport
1415

1516

16-
def get_soap_response():
17+
def setup_response(filename, status_code=200, total_items=1):
18+
basepath = os.path.dirname(__file__)
19+
body = b''
20+
print(f"Base Path: {basepath}")
21+
with open(f"{basepath}/../../SoftLayer/fixtures/soap/{filename}.soap", 'rb') as fixture:
22+
body = fixture.read()
1723
response = requests.Response()
18-
list_body = b'''<?xml version="1.0" encoding="utf-8"?>
19-
<params>
20-
<param>
21-
<value>
22-
<array>
23-
<data/>
24-
</array>
25-
</value>
26-
</param>
27-
</params>'''
24+
list_body = body
2825
response.raw = io.BytesIO(list_body)
29-
response.headers['SoftLayer-Total-Items'] = 10
30-
response.status_code = 200
26+
response.headers['SoftLayer-Total-Items'] = total_items
27+
response.status_code = status_code
3128
return response
3229

3330

3431
class TestSoapAPICall(testing.TestCase):
3532

3633
def set_up(self):
3734
self.transport = SoapTransport(endpoint_url='https://api.softlayer.com/soap/v3.1/')
38-
self.response = get_soap_response()
39-
self.user = os.getenv('SL_USER')
40-
self.password = os.environ.get('SL_APIKEY')
35+
36+
self.user = "testUser"
37+
self.password = "testPassword"
38+
# self.user = os.getenv('SL_USER')
39+
# self.password = os.environ.get('SL_APIKEY')
4140
request = Request()
4241
request.service = 'SoftLayer_Account'
4342
request.method = 'getObject'
4443
request.transport_user = self.user
4544
request.transport_password = self.password
4645
self.request = request
4746

48-
def test_call(self):
49-
47+
@mock.patch('requests.Session.post')
48+
def test_call(self, zeep_post):
49+
zeep_post.return_value = setup_response('SoftLayer_Account_getObject')
50+
self.request.mask = "mask[id,companyName]"
5051
data = self.transport(self.request)
5152
self.assertEqual(data.get('id'), 307608)
5253
self.assertEqual(data.get('companyName'), "SoftLayer Internal - Development Community")
@@ -61,14 +62,18 @@ def test_call(self):
6162
# print(debug_data['envelope'])
6263
# self.assertEqual(":sdfsdf", debug_data)
6364

64-
def test_objectMask(self):
65+
@mock.patch('requests.Session.post')
66+
def test_objectMask(self, zeep_post):
67+
zeep_post.return_value = setup_response('test_objectMask')
6568
self.request.mask = "mask[id,companyName]"
6669
data = self.transport(self.request)
6770
self.assertEqual(data.get('companyName'), "SoftLayer Internal - Development Community")
6871
self.assertIsNone(data.get('address1'))
6972
self.assertEqual(data.get('id'), 307608)
7073

71-
def test_objectFilter(self):
74+
@mock.patch('requests.Session.post')
75+
def test_objectFilter(self, zeep_post):
76+
zeep_post.return_value = setup_response('test_objectFilter')
7277
self.request.service = "SoftLayer_Product_Package"
7378
self.request.method = "getAllObjects"
7479
self.request.mask = "mask[id,description,keyName,type[id,keyName],name]"
@@ -79,7 +84,12 @@ def test_objectFilter(self):
7984
for package in data:
8085
self.assertEqual(package.get('type').get('keyName'), "BARE_METAL_CPU")
8186

82-
def test_virtualGuest(self):
87+
@mock.patch('requests.Session.post')
88+
def test_virtualGuest(self, zeep_post):
89+
zeep_post.side_effect = [
90+
setup_response('SoftLayer_Account_getVirtualGuests'),
91+
setup_response('SoftLayer_Virtual_Guest_getObject')
92+
]
8393
accountRequest = Request()
8494
accountRequest.service = "SoftLayer_Account"
8595
accountRequest.method = "getVirtualGuests"
@@ -90,6 +100,7 @@ def test_virtualGuest(self):
90100
accountRequest.transport_password = self.password
91101

92102
vsis = self.transport(accountRequest)
103+
self.assertEqual(1, len(vsis))
93104
for vsi in vsis:
94105
self.assertGreater(vsi.get('id'), 1)
95106
vsiRequest = Request()

tests/transports/xmlrpc_tests.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def set_up(self):
4343
)
4444
self.response = get_xmlrpc_response()
4545

46-
@mock.patch('SoftLayer.transports.requests.Session.request')
46+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
4747
def test_call(self, request):
4848
request.return_value = self.response
4949

@@ -95,7 +95,7 @@ def test_proxy_without_protocol(self):
9595
warnings.warn("Incorrect Exception raised. Expected a "
9696
"SoftLayer.TransportError error")
9797

98-
@mock.patch('SoftLayer.transports.requests.Session.request')
98+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
9999
def test_valid_proxy(self, request):
100100
request.return_value = self.response
101101
self.transport.proxy = 'http://localhost:3128'
@@ -117,7 +117,7 @@ def test_valid_proxy(self, request):
117117
verify=True,
118118
auth=None)
119119

120-
@mock.patch('SoftLayer.transports.requests.Session.request')
120+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
121121
def test_identifier(self, request):
122122
request.return_value = self.response
123123

@@ -135,7 +135,7 @@ def test_identifier(self, request):
135135
<value><int>1234</int></value>
136136
</member>""".encode(), kwargs['data'])
137137

138-
@mock.patch('SoftLayer.transports.requests.Session.request')
138+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
139139
def test_filter(self, request):
140140
request.return_value = self.response
141141

@@ -153,7 +153,7 @@ def test_filter(self, request):
153153
<value><string>^= prefix</string></value>
154154
</member>""".encode(), kwargs['data'])
155155

156-
@mock.patch('SoftLayer.transports.requests.Session.request')
156+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
157157
def test_limit_offset(self, request):
158158
request.return_value = self.response
159159

@@ -173,7 +173,7 @@ def test_limit_offset(self, request):
173173
<value><int>10</int></value>
174174
</member>""".encode(), kwargs['data'])
175175

176-
@mock.patch('SoftLayer.transports.requests.Session.request')
176+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
177177
def test_old_mask(self, request):
178178
request.return_value = self.response
179179

@@ -195,7 +195,7 @@ def test_old_mask(self, request):
195195
</struct></value>
196196
</member>""".encode(), kwargs['data'])
197197

198-
@mock.patch('SoftLayer.transports.requests.Session.request')
198+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
199199
def test_mask_call_no_mask_prefix(self, request):
200200
request.return_value = self.response
201201

@@ -211,7 +211,7 @@ def test_mask_call_no_mask_prefix(self, request):
211211
"<value><string>mask[something.nested]</string></value>".encode(),
212212
kwargs['data'])
213213

214-
@mock.patch('SoftLayer.transports.requests.Session.request')
214+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
215215
def test_mask_call_v2(self, request):
216216
request.return_value = self.response
217217

@@ -227,7 +227,7 @@ def test_mask_call_v2(self, request):
227227
"<value><string>mask[something[nested]]</string></value>".encode(),
228228
kwargs['data'])
229229

230-
@mock.patch('SoftLayer.transports.requests.Session.request')
230+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
231231
def test_mask_call_filteredMask(self, request):
232232
request.return_value = self.response
233233

@@ -243,7 +243,7 @@ def test_mask_call_filteredMask(self, request):
243243
"<value><string>filteredMask[something[nested]]</string></value>".encode(),
244244
kwargs['data'])
245245

246-
@mock.patch('SoftLayer.transports.requests.Session.request')
246+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
247247
def test_mask_call_v2_dot(self, request):
248248
request.return_value = self.response
249249

@@ -258,7 +258,7 @@ def test_mask_call_v2_dot(self, request):
258258
self.assertIn("<value><string>mask.something.nested</string></value>".encode(),
259259
kwargs['data'])
260260

261-
@mock.patch('SoftLayer.transports.requests.Session.request')
261+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
262262
def test_request_exception(self, request):
263263
# Test Text Error
264264
e = requests.HTTPError('error')
@@ -281,7 +281,7 @@ def test_print_reproduceable(self):
281281
output_text = self.transport.print_reproduceable(req)
282282
self.assertIn("https://test.com", output_text)
283283

284-
@mock.patch('SoftLayer.transports.requests.Session.request')
284+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
285285
@mock.patch('requests.auth.HTTPBasicAuth')
286286
def test_ibm_id_call(self, auth, request):
287287
request.return_value = self.response
@@ -325,7 +325,7 @@ def test_ibm_id_call(self, auth, request):
325325
self.assertIsInstance(resp, transports.SoftLayerListResult)
326326
self.assertEqual(resp.total_count, 10)
327327

328-
@mock.patch('SoftLayer.transports.requests.Session.request')
328+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
329329
def test_call_large_number_response(self, request):
330330
response = requests.Response()
331331
body = b'''<?xml version="1.0" encoding="utf-8"?>
@@ -359,7 +359,7 @@ def test_call_large_number_response(self, request):
359359
resp = self.transport(req)
360360
self.assertEqual(resp[0]['bytesUsed'], 2666148982056)
361361

362-
@mock.patch('SoftLayer.transports.requests.Session.request')
362+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
363363
def test_nonascii_characters(self, request):
364364
request.return_value = self.response
365365
hostname = 'testé'
@@ -411,7 +411,7 @@ def test_nonascii_characters(self, request):
411411
self.assertEqual(resp.total_count, 10)
412412

413413

414-
@mock.patch('SoftLayer.transports.requests.Session.request')
414+
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
415415
@pytest.mark.parametrize(
416416
"transport_verify,request_verify,expected",
417417
[

tools/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ requests >= 2.20.0
44
prompt_toolkit >= 2
55
pygments >= 2.0.0
66
urllib3 >= 1.24
7-
zeep
7+
# only used for soap transport
8+
# softlayer-zeep >= 5.0.0

tools/test-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ requests >= 2.20.0
1010
prompt_toolkit >= 2
1111
pygments >= 2.0.0
1212
urllib3 >= 1.24
13-
zeep == 4.1.0
13+
softlayer-zeep >= 5.0.0

0 commit comments

Comments
 (0)