Skip to content

Commit 6397a94

Browse files
authored
Merge pull request #2876 from jeff1evesque/feature-2751
#2751: Ensure 'programmatic_interface' tests more specific
2 parents ff80c6b + 167c370 commit 6397a94

File tree

16 files changed

+444
-135
lines changed

16 files changed

+444
-135
lines changed

.travis.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ install:
7676
##
7777
## Note: unit testing is performed within the docker container, which is
7878
## defined from the Dockerfile.
79+
##
7980
script:
8081
# lint codebase
8182
- flake8 .
@@ -114,12 +115,12 @@ script:
114115
- cat pytest.log
115116
- (! grep -qE '= FAILURES =|= ERRORS =|= no tests ran in 0.00 seconds =' pytest.log)
116117

117-
## acquire coverage results
118-
##
119-
## Note: more information regarding the '.coverage.docker' naming convention:
120-
##
121-
## https://github.com/pytest-dev/pytest-cov/issues/146#issuecomment-272971136
122-
##
118+
# acquire coverage results
119+
#
120+
# Note: more information regarding the '.coverage.docker' naming convention:
121+
#
122+
# https://github.com/pytest-dev/pytest-cov/issues/146#issuecomment-272971136
123+
#
123124
- docker cp webserver-pytest:/var/machine-learning/.coverage .coverage.docker
124125

125126
# check exit code: 'docker exec' will fail if the container has an exit code

brain/load_data.py

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
55
This file allocates input to respective 'data_xxx.py', 'model_xx.py', and
66
generates a return object, when required.
7-
7+
json.dumps(
88
'''
99

10+
import json
1011
from brain.session.data_append import Data_Append
1112
from brain.session.data_new import Data_New
1213
from brain.session.model_generate import Model_Generate
@@ -78,10 +79,19 @@ def load_data_new(self):
7879
session.save_premodel_dataset()
7980
session.check()
8081

81-
return 'Dataset(s) properly uploaded into database'
82+
response = {
83+
'status': 0,
84+
'msg': 'Dataset(s) properly uploaded into database'
85+
}
86+
8287
else:
8388
print session.get_errors()
84-
return None
89+
response = {
90+
'status': 1,
91+
'msg': 'Dataset(s) not uploaded into database'
92+
}
93+
94+
return json.dumps(response)
8595

8696
def load_data_append(self):
8797
'''@load_data_append
@@ -117,10 +127,19 @@ def load_data_append(self):
117127
session.save_premodel_dataset()
118128
session.check()
119129

120-
return 'Dataset(s) properly appended into database'
130+
response = {
131+
'status': 0,
132+
'msg': 'Dataset(s) properly appended into database'
133+
}
134+
121135
else:
122136
print session.get_errors()
123-
return None
137+
response = {
138+
'status': 1,
139+
'msg': 'Dataset(s) not uploaded into database'
140+
}
141+
142+
return json.dumps(response)
124143

125144
def load_model_generate(self):
126145
'''@load_model_generate
@@ -142,9 +161,17 @@ def load_model_generate(self):
142161

143162
# return
144163
if session.return_error():
145-
return False
164+
response = {
165+
'status': 1,
166+
'msg': 'Model not generated'
167+
}
146168
else:
147-
return 'Model properly generated'
169+
response = {
170+
'status': 0,
171+
'msg': 'Model properly generated'
172+
}
173+
174+
return json.dumps(response)
148175

149176
def load_model_predict(self):
150177
'''@load_model_predict
@@ -164,9 +191,17 @@ def load_model_predict(self):
164191

165192
my_prediction = session.predict()
166193
if my_prediction['error']:
167-
return {'result': None, 'error': my_prediction['error']}
194+
response = {
195+
'status': 1,
196+
'result': my_prediction['error'],
197+
}
168198
else:
169-
return {'result': my_prediction, 'error': None}
199+
response = {
200+
'status': 0,
201+
'result': my_prediction,
202+
}
203+
204+
return json.dumps(response)
170205

171206
def get_session_type(self):
172207
'''@load_model_predict

interface/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def load_data():
110110
response = loader.get_errors()
111111

112112
# return response
113-
return json.dumps(response)
113+
return response
114114

115115
# load web-interface
116116
else:
@@ -147,7 +147,7 @@ def load_data():
147147
response = loader.get_errors()
148148

149149
# return response
150-
return json.dumps(response)
150+
return response
151151

152152

153153
@blueprint.route('/login', methods=['POST'])

test/live_server/authentication/pytest_account_registration.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,9 @@ def test_registration(client, live_server):
4444
result = Save_Account().save_account(username, email, hashed)
4545

4646
# notification: attempt to store account
47-
assert (
48-
result['status'] and
49-
result['id'] and not
50-
result['error']
51-
)
47+
assert result['status']
48+
assert result['id']
49+
assert not result['error']
5250

5351
# notification: email already exists
5452
else:

test/live_server/authentication/pytest_user_login.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ def test_login(client, live_server):
4747
payload = {'user[login]': username, 'user[password]': password}
4848
login = client.post(url, data=payload)
4949

50-
assert login.status_code == 200 and session.get('uid')
50+
assert login.status_code == 200
51+
assert session.get('uid') == 1
5152
else:
5253
assert False
5354

test/live_server/authentication/pytest_user_logout.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ def test_logout(client, live_server):
3939
assert False
4040

4141
# check logout succeeded
42-
assert (
43-
login.status_code == 200 and
44-
logout.status_code == 200 and
45-
not session.get('uid')
46-
)
42+
assert login.status_code == 200
43+
assert logout.status_code == 200
44+
assert not session.get('uid')

test/live_server/programmatic_interface/dataset_url/pytest_svm_dataset_url.py

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
'''
1818

1919
import json
20-
import pytest
2120
import os.path
2221
from flask import url_for
2322
from flask import current_app
@@ -36,25 +35,21 @@ def get_sample_json(jsonfile, model_type):
3635
# open file
3736
json_dataset = None
3837

39-
try:
40-
with open(
41-
os.path.join(
42-
root,
43-
'interface',
44-
'static',
45-
'data',
46-
'json',
47-
'programmatic_interface',
48-
model_type,
49-
'dataset_url',
50-
jsonfile
51-
),
52-
'r'
53-
) as json_file:
54-
json_dataset = json.load(json_file)
55-
56-
except Exception as error:
57-
pytest.fail(error)
38+
with open(
39+
os.path.join(
40+
root,
41+
'interface',
42+
'static',
43+
'data',
44+
'json',
45+
'programmatic_interface',
46+
model_type,
47+
'dataset_url',
48+
jsonfile
49+
),
50+
'r'
51+
) as json_file:
52+
json_dataset = json.load(json_file)
5853

5954
return json.dumps(json_dataset)
6055

@@ -78,7 +73,9 @@ def get_endpoint():
7873
data=get_sample_json('svm-data-new.json', 'svm')
7974
)
8075

76+
# assertion checks
8177
assert res.status_code == 200
78+
assert res.json['status'] == 0
8279

8380

8481
def test_data_append(client, live_server):
@@ -100,7 +97,9 @@ def get_endpoint():
10097
data=get_sample_json('svm-data-append.json', 'svm')
10198
)
10299

100+
# assertion checks
103101
assert res.status_code == 200
102+
assert res.json['status'] == 0
104103

105104

106105
def test_model_generate(client, live_server):
@@ -122,14 +121,21 @@ def get_endpoint():
122121
data=get_sample_json('svm-model-generate.json', 'svm')
123122
)
124123

124+
# assertion checks
125125
assert res.status_code == 200
126+
assert res.json['status'] == 0
126127

127128

128129
def test_model_predict(client, live_server):
129130
'''@test_model_predict
130131
131132
This method tests the 'model_predict' session.
132133
134+
Note: for debugging, the following syntax will output the corresponding
135+
json values, nested within 'json.loads()', to the travis ci:
136+
137+
raise ValueError(res.json['result']['key1'])
138+
133139
'''
134140

135141
@live_server.app.route('/load-data')
@@ -144,4 +150,44 @@ def get_endpoint():
144150
data=get_sample_json('svm-model-predict.json', 'svm')
145151
)
146152

153+
# check each probability is within acceptable margin
154+
fixed_prob = [
155+
0.14075033321086294,
156+
0.14500955005546354,
157+
0.14156072707544004,
158+
0.19249135186767916,
159+
0.38018803779055466
160+
]
161+
cp = res.json['result']['confidence']['probability']
162+
margin_prob = 0.005
163+
check_prob = [
164+
i for i in fixed_prob if any(abs(i-j) > margin_prob for j in cp)
165+
]
166+
167+
# assertion checks
147168
assert res.status_code == 200
169+
assert res.json['status'] == 0
170+
assert res.json['result']
171+
assert res.json['result']['confidence']
172+
assert res.json['result']['confidence']['classes'] == [
173+
'dep-variable-1',
174+
'dep-variable-2',
175+
'dep-variable-3',
176+
'dep-variable-4',
177+
'dep-variable-5'
178+
]
179+
assert res.json['result']['confidence']['decision_function'] == [
180+
0.1221379769127864,
181+
0.0,
182+
-0.2201467913263242,
183+
-0.22014661657537662,
184+
-0.12213797691278638,
185+
-0.33333297925570843,
186+
-0.33333281615328886,
187+
-0.2201467913263242,
188+
-0.22014661657537662,
189+
1.8353514974478458e-07
190+
]
191+
assert check_prob
192+
assert res.json['result']['model'] == 'svm'
193+
assert res.json['result']['result'] == 'dep-variable-4'

0 commit comments

Comments
 (0)