Skip to content

Commit 71c047b

Browse files
committed
Add unit tests for transports
1 parent f09c866 commit 71c047b

File tree

3 files changed

+185
-0
lines changed

3 files changed

+185
-0
lines changed

tests/test_unit_transport_database.py

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from itoolkit import iToolKit
2+
from itoolkit.transport import DatabaseTransport
3+
4+
5+
def test_database_transport_callproc(database_callproc):
6+
transport = DatabaseTransport(database_callproc)
7+
tk = iToolKit()
8+
transport.call(tk)
9+
10+
cursor = database_callproc.cursor()
11+
12+
cursor.callproc.assert_called_once()
13+
cursor.__iter__.assert_called_once()
14+
15+
16+
def test_database_transport_execute(database_execute):
17+
transport = DatabaseTransport(database_execute)
18+
tk = iToolKit()
19+
transport.call(tk)
20+
21+
cursor = database_execute.cursor()
22+
23+
cursor.execute.assert_called_once()
24+
cursor.__iter__.assert_called_once()
25+
26+
27+
def test_database_transport_execute_schema(database_execute):
28+
schema = 'MYSCHEMA'
29+
transport = DatabaseTransport(database_execute, schema=schema)
30+
tk = iToolKit()
31+
transport.call(tk)
32+
33+
cursor = database_execute.cursor()
34+
35+
cursor.execute.assert_called_once()
36+
cursor.__iter__.assert_called_once()
37+
38+
assert len(cursor.execute.call_args[0]) > 0
39+
assert schema in cursor.execute.call_args[0][1] # argument 0 is self
40+
41+
42+
def test_database_transport_callproc_schema(database_execute):
43+
schema = 'MYSCHEMA'
44+
transport = DatabaseTransport(database_execute, schema=schema)
45+
tk = iToolKit()
46+
transport.call(tk)
47+
48+
cursor = database_execute.cursor()
49+
50+
cursor.execute.assert_called_once()
51+
cursor.__iter__.assert_called_once()
52+
53+
assert len(cursor.execute.call_args[0]) > 0
54+
assert schema in cursor.execute.call_args[0][1] # argument 0 is self

tests/test_unit_transport_http.py

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import sys
2+
3+
from itoolkit import iToolKit
4+
from itoolkit.transport import HttpTransport
5+
6+
if sys.version_info >= (3, 0):
7+
if sys.version_info >= (3, 6):
8+
from urllib.parse import parse_qs
9+
else:
10+
from urllib.parse import urlencode
11+
else:
12+
from urllib import urlencode
13+
14+
XMLIN = "<?xml version='1.0'?>\n<xmlservice></xmlservice>"
15+
16+
17+
def mock_http_urlopen(mocker):
18+
mock_urlopen = mocker.patch('itoolkit.transport.http.urlopen')
19+
mock_response = mocker.Mock()
20+
mock_response.read.side_effect = XMLIN.encode('utf-8')
21+
mock_urlopen.return_value = mock_response
22+
23+
return mock_urlopen
24+
25+
26+
def assert_urlopen_params_correct(mock_urlopen, url, uid, pwd, db2='*LOCAL',
27+
ipc='*na', ctl='*here *cdata',
28+
xmlout=str(HttpTransport.OUT_SIZE)):
29+
# assert_called_once only available in Python 3.6+
30+
if sys.version_info >= (3, 6):
31+
mock_urlopen.assert_called_once()
32+
33+
args, kwargs = mock_urlopen.call_args
34+
35+
assert len(kwargs) == 0
36+
assert len(args) == 2
37+
38+
assert args[0] == url
39+
40+
data = {key.decode('utf-8'): value[0].decode('utf-8') for (key, value)
41+
in parse_qs(args[1]).items()}
42+
43+
exp_data = dict(
44+
uid=uid,
45+
pwd=pwd,
46+
db2=db2,
47+
ipc=ipc,
48+
ctl=ctl,
49+
xmlout=xmlout,
50+
xmlin=XMLIN + "\n",
51+
)
52+
assert data == exp_data
53+
else:
54+
mock_urlopen.assert_called_once_with(url, urlencode({
55+
'db2': db2,
56+
'uid': uid,
57+
'pwd': pwd,
58+
'ipc': ipc,
59+
'ctl': ctl,
60+
'xmlin': XMLIN + "\n",
61+
'xmlout': int(xmlout)
62+
}).encode("utf-8"))
63+
64+
65+
def test_http_transport_minimal(mocker):
66+
mock_urlopen = mock_http_urlopen(mocker)
67+
68+
url = 'http://example.com/cgi-bin/xmlcgi.pgm'
69+
user = 'dummy'
70+
password = 'passw0rd'
71+
72+
transport = HttpTransport(url, user, password)
73+
tk = iToolKit()
74+
transport.call(tk)
75+
76+
assert_urlopen_params_correct(
77+
mock_urlopen,
78+
url,
79+
uid=user,
80+
pwd=password,
81+
)
82+
83+
84+
def test_http_transport_with_database(mocker):
85+
mock_urlopen = mock_http_urlopen(mocker)
86+
87+
url = 'http://example.com/cgi-bin/xmlcgi.pgm'
88+
user = 'dummy'
89+
password = 'passw0rd'
90+
database = 'MYDB'
91+
92+
transport = HttpTransport(url, user, password, database=database)
93+
tk = iToolKit()
94+
transport.call(tk)
95+
96+
assert_urlopen_params_correct(
97+
mock_urlopen,
98+
url,
99+
uid=user,
100+
pwd=password,
101+
db2=database
102+
)

tests/test_unit_transport_ssh.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from itoolkit import iToolKit
2+
from itoolkit.transport import SshTransport
3+
4+
5+
def mock_ssh(mocker):
6+
client = mocker.MagicMock()
7+
8+
channels = (
9+
mocker.MagicMock(),
10+
mocker.MagicMock(closed=True),
11+
mocker.MagicMock(closed=True),
12+
)
13+
14+
client.channels = channels
15+
16+
client.exec_command.return_value = channels
17+
18+
return client
19+
20+
21+
def test_ssh_transport_minimal(mocker):
22+
ssh_client = mock_ssh(mocker)
23+
24+
transport = SshTransport(ssh_client)
25+
tk = iToolKit()
26+
transport.call(tk)
27+
28+
command = "/QOpenSys/pkgs/bin/xmlservice-cli"
29+
ssh_client.exec_command.assert_called_once_with(command)

0 commit comments

Comments
 (0)