-
Notifications
You must be signed in to change notification settings - Fork 1
/
calculators_tests.py
217 lines (191 loc) · 11.4 KB
/
calculators_tests.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
import json
import calculators
import unittest
import utils
import urllib
from bs4 import BeautifulSoup
# import ssl
import time
from gail.gail import GailRiskCalculator
class CalculatorsTestCase(unittest.TestCase):
def setUp(self):
self.app = calculators.app.test_client()
# No special tearDown?
# def tearDown(self):
def get_NCI(self,
genetics=0,
current_age=48,
age_at_menarche=2,
age_at_first_live_birth=3,
ever_had_biopsy=0,
previous_biopsies=0,
biopsy_with_hyperplasia=0,
related_with_breast_cancer=0,
race=0):
serviceurl = "http://www.cancer.gov/bcrisktool/RiskAssessment.aspx?"
scontext = None
cgvfiveyearRiskABS = -1.1
cgvfiveyearRiskAVE = -1.1
cgvLifetimeRiskABS = -1.1
cgvLifetimeRiskAVE = -1.1
explainer = ""
if age_at_menarche == 0:
age_at_menarche = 14
elif age_at_menarche == 1:
age_at_menarche = 13
elif age_at_menarche == 2:
age_at_menarche = 10
if age_at_first_live_birth == 3:
age_at_first_live_birth = 30
elif age_at_first_live_birth == 1:
age_at_first_live_birth = 22
elif age_at_first_live_birth == 0:
# encode once at 15
age_at_first_live_birth = 15
elif age_at_first_live_birth == 2:
# encode once at 27
age_at_first_live_birth = 27
url = serviceurl + urllib.urlencode(
{"genetics": genetics, "current_age": current_age, "age_at_menarche": age_at_menarche,
"age_at_first_live_birth": age_at_first_live_birth, "ever_had_biopsy": ever_had_biopsy,
"previous_biopsies": previous_biopsies, "biopsy_with_hyperplasia": biopsy_with_hyperplasia,
"related_with_breast_cancer": related_with_breast_cancer,
"race": race})
time.sleep(0.1) # delays for 1 seconds
myhtml = urllib.urlopen(url, context=scontext).read()
soup = BeautifulSoup(myhtml, "lxml")
tags = soup.find_all('p')
explainer = explainer + str(tags[7]) + str(tags[8])
tags = soup('span', {'id': 'ctl00_cphMain_lbl5YrAbsoluteRisk'})
for x in tags: cgvfiveyearRiskABS = (float(x.get_text()[:-1]) / 100)
tags = soup('span', {'id': 'ctl00_cphMain_lbl5YrAveragRisk'})
for x in tags: cgvfiveyearRiskAVE = (float(x.get_text()[:-1]) / 100)
tags = soup('span', {'id': 'ctl00_cphMain_lblLifetimeAbsoluteRisk90'})
for x in tags: cgvLifetimeRiskABS = (float(x.get_text()[:-1]) / 100)
tags = soup('span', {'id': 'ctl00_cphMain_lblLifeTimeAverageRisk90'})
for x in tags: cgvLifetimeRiskAVE = (float(x.get_text()[:-1]) / 100)
return (utils.roundLikeNCI(cgvfiveyearRiskABS),
utils.roundLikeNCI(cgvfiveyearRiskAVE),
utils.roundLikeNCI(cgvLifetimeRiskABS),
utils.roundLikeNCI(cgvLifetimeRiskAVE))
def test_bad_calc_name(self):
print "Testing Unknown Calculator Name (For v2.0)"
# test getting the docs for a bad calc
rv = self.app.get('/api/v2.0/bad_calc')
assert rv.status_code == 501
rv = self.app.get('/api/v2.0/bad_calc/json')
assert rv.status_code == 501
rv = self.app.post('/api/v2.0/bad_calc', data="[Doesn't matter]")
assert rv.status_code == 501
def test_gail_calc_doc(self):
print "Testing GAIL Doc URLs (For v2.0)"
rv = self.app.get('/api/v2.0/gail')
assert rv.status_code == 200
assert "VisExcell API For GAIL - version 2.0" in rv.get_data()
rv = self.app.get('/api/v2.0/gail/json')
assert rv.status_code == 200
assert rv.mimetype == "application/json"
def test_gail_calc_post(self):
print "Testing getting GAIL results for (v2.0)"
post_data = {
"age": 48,
"menarch_age": 2,
"live_birth_age": 3,
"ever_had_biopsy": 1,
"num_biopsy": 2,
"first_deg_relatives": 2,
"ihyp": 1,
"race": 1
}
expected_results = {
"five_year_abs": 0.10708078148151635,
"five_year_ave": 0.011606210299941746,
"lifetime_abs": 0.59497901225876715,
"lifetime_ave": 0.1148439582786286
}
rv = self.app.post('/api/v2.0/gail',data=json.dumps(post_data),content_type='application/json')
response_obj = json.loads(rv.get_data())
self.assertEqual(response_obj["code"],200)
self.assertEqual(len(response_obj["assessment"]["results"].keys()), 4)
for ex_result in expected_results:
self.assertEqual(response_obj["assessment"]["results"][ex_result],expected_results[ex_result])
# TODO: Add bad post data to check error responses
def test_unknown_biopsies(self):
print "Testing for unknown biopsy bug (using v1.0)"
post_data = {
"age": 40,
"menarch_age": 2,
"live_birth_age": 0,
"ever_had_biopsy": 0,
"num_biopsy": 0,
"first_deg_relatives": 0,
"ihyp": 99,
"race": 3
}
ever_had_vals = [0,99]
num_vals = [0,1,2]
hyp_vals = [0,1,99]
for nv in num_vals:
post_data["num_biopsy"] = nv
for ehv in ever_had_vals:
post_data["ever_had_biopsy"] = ehv
for hv in hyp_vals:
post_data["ihyp"] = hv
# print "-------"
# print post_data
rv = self.app.post('/api/v1.0/gail', data=json.dumps(post_data), content_type="application/json")
output = json.loads(rv.get_data())
fyr = utils.roundLikeNCI(output["results"]["five_year_abs"])
fyra = utils.roundLikeNCI(output["results"]["five_year_ave"])
ltr = utils.roundLikeNCI(output["results"]["lifetime_abs"])
ltra = utils.roundLikeNCI(output["results"]["lifetime_ave"])
# print "Ours:\t5yr: %.4f\t5ave: %.4f\tLTR: %.4f\tLTA: %.4f" % (fyr,fyra,ltr,ltra)
cleaned_ever_had, cleaned_number, cleaned_hyp = GailRiskCalculator.clean_biopsy_inputs(post_data["ever_had_biopsy"], post_data["num_biopsy"],post_data["ihyp"])
(nci_fyr,nci_fyra,nci_ltr,nci_ltra) = self.get_NCI(current_age=post_data["age"],
age_at_menarche=post_data["menarch_age"],
age_at_first_live_birth=post_data["live_birth_age"],
ever_had_biopsy=cleaned_ever_had, # post_data["ever_had_biopsy"],
previous_biopsies=cleaned_number, # post_data["num_biopsy"],
biopsy_with_hyperplasia=cleaned_hyp, # post_data["ihyp"],
related_with_breast_cancer=post_data["first_deg_relatives"],
race=post_data["race"])
# print "NCIs:\t5yr: %.4f\t5ave: %.4f\tLTR: %.4f\tLTA: %.4f" % (fyr, fyra, ltr, ltra)
self.assertEqual((fyr, fyra, ltr, ltra),(nci_fyr,nci_fyra,nci_ltr,nci_ltra), "Inputs: %r" % post_data)
def test_calculations_valid_inputs(self):
print "Testing for valid inputs (using v1.0)"
test_inputs = [{"age": 42, "menarch_age": 2, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 1},
{"age": 50, "menarch_age": 2, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 1},
{"age": 68, "menarch_age": 2, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 1},
{"age": 42, "menarch_age": 0, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 1, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 2, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 1, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 2, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 3, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 1, "ihyp": 99, "race": 3},
{"age": 42, "menarch_age": 0, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 2, "ihyp": 99, "race": 3},]
races_to_test = [1,2,7,8,9,10,11,12] # (3 is tested in above)
for r in races_to_test:
test_inputs.append({"age": 42, "menarch_age": 2, "live_birth_age": 0, "ever_had_biopsy": 0, "num_biopsy": 0, "first_deg_relatives": 0, "ihyp": 99, "race": r})
for post_data in test_inputs:
# print post_data
rv = self.app.post('/api/v1.0/gail', data=json.dumps(post_data), content_type="application/json")
output = json.loads(rv.get_data())
fyr = utils.roundLikeNCI(output["results"]["five_year_abs"])
fyra = utils.roundLikeNCI(output["results"]["five_year_ave"])
ltr = utils.roundLikeNCI(output["results"]["lifetime_abs"])
ltra = utils.roundLikeNCI(output["results"]["lifetime_ave"])
(nci_fyr, nci_fyra, nci_ltr, nci_ltra) = self.get_NCI(current_age=post_data["age"],
age_at_menarche=post_data["menarch_age"],
age_at_first_live_birth=post_data["live_birth_age"],
ever_had_biopsy=post_data["ever_had_biopsy"],
previous_biopsies=post_data["num_biopsy"],
biopsy_with_hyperplasia=post_data["ihyp"],
related_with_breast_cancer=post_data[
"first_deg_relatives"],
race=post_data["race"])
self.assertEqual((fyr, fyra, ltr, ltra), (nci_fyr, nci_fyra, nci_ltr, nci_ltra), "Inputs: %r" % post_data)
if __name__ == '__main__':
unittest.main()