Coverage for test/test_concept_handler.py: 99%

247 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-12 17:57 +0000

1from unittest.mock import patch 

2 

3from concept.concept import Concept 

4from concept.concept_handler import ConceptHandler 

5from util.constants import NULL_VAL_STRING 

6from test.data_for_tests import vars_responses, worms_responses 

7 

8 

9class MockResponse: 

10 def __init__(self, req_url): 

11 self.req_url = req_url 

12 self.status_code = 200 

13 

14 if 'NO_MATCH' in req_url or 'encrusting' in req_url: 

15 self.status_code = 204 

16 if 'yellow' in req_url and 'marinespecies' in req_url: 

17 self.status_code = 204 

18 if 'AphiaVernacularsByAphiaID/151540' in req_url: 

19 self.status_code = 204 

20 

21 def json(self): 

22 match self.req_url: 

23 case 'NO_MATCH': 

24 return {} 

25 case 'http://hurlstor.soest.hawaii.edu:8083/v1/concept/Pennatulacea': 

26 return vars_responses['Pennatulacea'] 

27 case 'http://hurlstor.soest.hawaii.edu:8083/v1/concept/Demospongiae': 

28 return vars_responses['Demospongiae'] 

29 case 'http://hurlstor.soest.hawaii.edu:8083/v1/concept/Actinopterygii': 

30 return vars_responses['Actinopterygii'] 

31 case 'https://www.marinespecies.org/rest/AphiaRecordsByName/Antipatharia?like=false&marine_only=true&offset=1': 

32 return worms_responses['Antipatharia'] 

33 case 'https://www.marinespecies.org/rest/AphiaRecordsByName/Demospongiae?like=false&marine_only=true&offset=1': 

34 return worms_responses['Demospongiae'] 

35 case 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up/Demospongiae' | \ 

36 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up/Demospongiae cf': 

37 return vars_responses['Demospongiae phylogeny'] 

38 case 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up/Pennatula': 

39 return vars_responses['Pennatula phylogeny'] 

40 case 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up/Ptilella': 

41 return vars_responses['Ptilella phylogeny'] 

42 case 'https://www.marinespecies.org/rest/AphiaRecordsByName/Stolonifera?like=false&marine_only=true&offset=1': 

43 return worms_responses['Stolonifera'] 

44 case 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up/Stolonifera': 

45 return vars_responses['Stolonifera phylogeny'] 

46 case 'https://www.marinespecies.org/rest/AphiaRecordsByName/Malacalcyonacea?like=false&marine_only=true&offset=1': 

47 return worms_responses['Malacalcyonacea'] 

48 case 'https://www.marinespecies.org/rest/AphiaClassificationByAphiaID/164811': 

49 return worms_responses['Demospongiae phylogeny'] 

50 case 'https://www.marinespecies.org/rest/AphiaVernacularsByAphiaID/164811': 

51 return worms_responses['Demospongiae vernaculars'] 

52 case 'https://www.marinespecies.org/rest/AphiaVernacularsByAphiaID/10314': 

53 return worms_responses['Ophidiiformes vernaculars'] 

54 case 'http://hurlstor.soest.hawaii.edu:8083/v1/concept/Plexauridae%20yellow' | \ 

55 'http://hurlstor.soest.hawaii.edu:8083/v1/concept/Paramuriceidae%20yellow': 

56 return vars_responses['Plexauridae yellow'] 

57 case 'https://www.marinespecies.org/rest/AphiaRecordsByName/Plexauridae?like=false&marine_only=true&offset=1': 

58 return worms_responses['Plexauridae'] 

59 case 'https://www.marinespecies.org/rest/AphiaRecordsByName/Paramuriceidae?like=false&marine_only=true&offset=1': 

60 return worms_responses['Paramuriceidae'] 

61 case 'https://www.marinespecies.org/rest/AphiaClassificationByAphiaID/151540': 

62 return worms_responses['Paramuriceidae phylogeny'] 

63 return None 

64 

65 

66def mocked_requests_get(*args, **kwargs): 

67 return MockResponse(args[0]) 

68 

69 

70class TestConceptHandler: 

71 """ 

72 def test_worms_endpoints(self): 

73 res1 = requests.get('https://www.marinespecies.org/rest/AphiaRecordsByName/Demospongiae?like=true&marine_only=true&offset=1') 

74 res2 = requests.get('https://www.marinespecies.org/rest/AphiaClassificationByAphiaID/164811') 

75 res3 = requests.get('https://www.marinespecies.org/rest/AphiaVernacularsByAphiaID/164811') 

76 assert res1.ok 

77 assert res2.ok 

78 assert res3.ok 

79 

80 def test_vars_endpoints(self): 

81 res1 = requests.get('http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up/Demospongiae') 

82 res2 = requests.get('http://hurlstor.soest.hawaii.edu:8083/v1/concept/Demospongiae') 

83 assert res1.ok 

84 assert res2.ok 

85 """ 

86 

87 def test_init(self): 

88 test_concept = Concept('test concept') 

89 test_handler = ConceptHandler(test_concept) 

90 assert test_handler.concept == test_concept 

91 assert test_handler.phylum == '' 

92 assert test_handler.found_worms_match is False 

93 assert test_handler.unaccepted_names == [] 

94 

95 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

96 def test_fetch_worms_aphia_record_simple(self, mock_get): 

97 test_concept = Concept('Antipatharia') 

98 test_handler = ConceptHandler(test_concept) 

99 test_handler.fetch_worms_aphia_record() 

100 assert test_handler.found_worms_match is True 

101 assert test_concept.aphia_id == 22549 

102 assert test_concept.scientific_name == 'Antipatharia' 

103 assert test_concept.taxon_rank == 'Order' 

104 

105 def test_fetch_worms_aphia_record_egg(self): 

106 test_concept1 = Concept('eggcase') 

107 test_concept2 = Concept('eggs') 

108 test_handler1 = ConceptHandler(test_concept1) 

109 test_handler2 = ConceptHandler(test_concept2) 

110 test_handler1.fetch_worms_aphia_record() 

111 test_handler2.fetch_worms_aphia_record() 

112 assert test_concept1.scientific_name == 'Animalia' 

113 assert test_concept1.descriptors == ['egg case'] 

114 assert test_concept2.scientific_name == 'Animalia' 

115 assert test_concept2.descriptors == ['eggs'] 

116 

117 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

118 def test_fetch_worms_aphia_record_no_match(self, mock_get): 

119 test_concept = Concept('NO_MATCH') 

120 test_handler = ConceptHandler(test_concept) 

121 test_handler.fetch_worms_aphia_record() 

122 assert test_handler.found_worms_match is False 

123 

124 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

125 def test_fetch_worms_aphia_record_extra_bits(self, mock_get): 

126 test_concept = Concept('Demospongiae encrusting') 

127 test_handler = ConceptHandler(test_concept) 

128 test_handler.fetch_worms_aphia_record() 

129 assert test_handler.found_worms_match is True 

130 assert test_concept.aphia_id == 164811 

131 assert test_concept.scientific_name == 'Demospongiae' 

132 assert test_concept.taxon_rank == 'Class' 

133 

134 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

135 def test_find_parent_simple(self, mock_get): 

136 test_concept = Concept('Demospongiae cf') 

137 ConceptHandler(test_concept) 

138 assert test_concept.concept_words == ['Porifera'] 

139 

140 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

141 def test_find_parent_simple_fail(self, mock_get): 

142 test_concept = Concept('NO_MATCH cf') 

143 ConceptHandler(test_concept) 

144 assert test_concept.concept_words == ['NA'] 

145 

146 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

147 def test_find_parent_slash_name(self, mock_get): 

148 test_concept = Concept('Ptilella/Pennatula') 

149 ConceptHandler(test_concept) 

150 assert test_concept.concept_words == ['Pennatulidae'] 

151 

152 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

153 def test_find_parent_slash_name_fail(self, mock_get): 

154 test_concept = Concept('NO_MATCH/Pennatula') 

155 ConceptHandler(test_concept) 

156 assert test_concept.concept_words == ['NEED_PARENT'] 

157 

158 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

159 def test_find_accepted_record(self, mock_get): 

160 # multiple records (we already check single record in test_fetch_worms_aphia_record) 

161 test_concept = Concept('Stolonifera') 

162 test_handler = ConceptHandler(test_concept) 

163 test_handler.fetch_worms_aphia_record() 

164 assert test_handler.found_worms_match is True 

165 assert test_concept.aphia_id == 1609357 

166 assert test_concept.scientific_name == 'Malacalcyonacea' 

167 assert test_concept.taxon_rank == 'Order' 

168 

169 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

170 def test_find_accepted_record_no_match(self, mock_get): 

171 test_concept = Concept('Stolonifera') 

172 test_handler = ConceptHandler(test_concept) 

173 test_handler.fetch_worms_aphia_record() 

174 assert test_handler.found_worms_match is True 

175 assert test_concept.aphia_id == 1609357 

176 assert test_concept.scientific_name == 'Malacalcyonacea' 

177 assert test_concept.taxon_rank == 'Order' 

178 

179 def test_check_status_accepted(self): 

180 test_handler = ConceptHandler(Concept('test')) 

181 test_handler.check_status({ 

182 'status': 'accepted', 'AphiaID': 42, 'scientificname': 'hehe', 'rank': 'sgt', 'authority': None 

183 }) 

184 assert test_handler.found_worms_match is True 

185 assert test_handler.concept.aphia_id == 42 

186 assert test_handler.concept.scientific_name == 'hehe' 

187 assert test_handler.concept.taxon_rank == 'sgt' 

188 

189 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

190 def test_check_status_unaccepted(self, mock_get): 

191 test_handler = ConceptHandler(Concept('test')) 

192 test_handler.check_status({ 

193 'status': 'unaccepted', 'scientificname': 'oh no', 'valid_name': 'Demospongiae' 

194 }) 

195 assert test_handler.found_worms_match is True 

196 assert test_handler.unaccepted_names == ['oh no'] 

197 assert test_handler.concept.aphia_id == 164811 

198 assert test_handler.concept.scientific_name == 'Demospongiae' 

199 assert test_handler.concept.taxon_rank == 'Class' 

200 

201 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

202 def test_check_status_other_same_valid_name(self, mock_get): 

203 test_handler = ConceptHandler(Concept('Demospongiae')) 

204 test_handler.check_status({ 

205 'status': 'abc123', 

206 'AphiaID': 42, 

207 'scientificname': 'Demospongiae', 

208 'rank': 'Class', 

209 'valid_name': 'Demospongiae', 

210 'authority': None 

211 }) 

212 assert test_handler.found_worms_match is True 

213 assert test_handler.concept.aphia_id == 42 

214 assert test_handler.concept.scientific_name == 'Demospongiae' 

215 assert test_handler.concept.taxon_rank == 'Class' 

216 

217 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

218 def test_check_status_other_different_valid_name(self, mock_get): 

219 test_handler = ConceptHandler(Concept('test')) 

220 test_handler.check_status({ 

221 'status': 'abc123', 'scientificname': 'test', 'valid_name': 'Demospongiae' 

222 }) 

223 assert test_handler.found_worms_match is True 

224 assert test_handler.unaccepted_names == ['test'] 

225 assert test_handler.concept.aphia_id == 164811 

226 assert test_handler.concept.scientific_name == 'Demospongiae' 

227 assert test_handler.concept.taxon_rank == 'Class' 

228 

229 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

230 def test_fetch_worms_taxon_tree(self, mock_get): 

231 test_concept = Concept('Demospongiae') 

232 test_handler = ConceptHandler(test_concept) 

233 test_concept.scientific_name = 'Demospongiae' 

234 test_concept.aphia_id = 164811 

235 test_handler.fetch_worms_taxon_tree() 

236 assert test_concept.taxon_ranks == { 

237 'Superdomain': 'Biota', 'Kingdom': 'Animalia', 'Phylum': 'Porifera', 'Class': 'Demospongiae' 

238 } 

239 

240 def test_fetch_worms_taxon_tree_egg(self): 

241 test_concept = Concept('eggcase') 

242 test_handler = ConceptHandler(test_concept) 

243 test_handler.fetch_worms_taxon_tree() 

244 assert test_concept.taxon_ranks == {'Kingdom': 'Animalia'} 

245 

246 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

247 def test_fetch_worms_taxon_tree_no_match(self, mock_get): 

248 test_concept = Concept('nah') 

249 test_handler = ConceptHandler(test_concept) 

250 test_concept.scientific_name = 'Demospongiae' 

251 test_concept.aphia_id = 164811 

252 test_handler.fetch_worms_vernaculars() 

253 assert test_concept.taxon_ranks == {} 

254 

255 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

256 def test_fetch_worms_vernaculars(self, mock_get): 

257 test_concept = Concept('Demospongiae') 

258 test_handler = ConceptHandler(test_concept) 

259 test_concept.scientific_name = 'Demospongiae' 

260 test_concept.aphia_id = 164811 

261 test_handler.fetch_worms_vernaculars() 

262 assert test_concept.vernacular_names == 'demosponges | horny sponges' 

263 

264 def test_fetch_worms_vernaculars_egg(self): 

265 test_concept = Concept('eggcase') 

266 test_handler = ConceptHandler(test_concept) 

267 test_handler.fetch_vars_synonyms(warning_messages=[]) 

268 assert test_concept.vernacular_names == NULL_VAL_STRING 

269 

270 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

271 def test_fetch_worms_vernaculars_no_eng(self, mock_get): 

272 test_concept = Concept('Ophidiiformes') 

273 test_handler = ConceptHandler(test_concept) 

274 test_concept.scientific_name = 'Ophidiiformes' 

275 test_concept.aphia_id = 10314 

276 test_handler.fetch_worms_vernaculars() 

277 assert test_concept.vernacular_names == NULL_VAL_STRING 

278 

279 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

280 def test_fetch_worms_vernaculars_none(self, mock_get): 

281 test_concept = Concept('nope') 

282 test_handler = ConceptHandler(test_concept) 

283 test_concept.aphia_id = 'NO_MATCH' 

284 test_handler.fetch_worms_vernaculars() 

285 assert test_concept.vernacular_names == NULL_VAL_STRING 

286 

287 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

288 def test_fetch_vars_synonyms_simple(self, mock_get): 

289 test_concept = Concept('Actinopterygii') 

290 test_handler = ConceptHandler(test_concept) 

291 test_handler.fetch_vars_synonyms(warning_messages=[]) 

292 assert test_concept.synonyms == ['Actinopteri'] 

293 

294 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

295 def test_fetch_vars_synonyms_complex(self, mock_get): 

296 warnings = [] 

297 test_concept = Concept('Plexauridae yellow') 

298 test_handler = ConceptHandler(test_concept) 

299 test_handler.fetch_worms_aphia_record() 

300 test_handler.fetch_vars_synonyms(warning_messages=warnings) 

301 assert test_concept.synonyms == ['Plexauridae yellow'] 

302 assert len(warnings) == 1 

303 

304 def test_fetch_vars_synonyms_egg(self): 

305 test_concept = Concept('eggcase') 

306 test_handler = ConceptHandler(test_concept) 

307 test_handler.fetch_vars_synonyms(warning_messages=[]) 

308 assert test_concept.synonyms == [] 

309 

310 @patch('concept.concept_handler.requests.get', side_effect=mocked_requests_get) 

311 def test_fetch_vars_synonyms_none(self, mock_get): 

312 test_concept = Concept('Demospongiae') 

313 test_handler = ConceptHandler(test_concept) 

314 test_handler.fetch_vars_synonyms(warning_messages=[]) 

315 assert test_concept.synonyms == []