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
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-12 17:57 +0000
1from unittest.mock import patch
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
9class MockResponse:
10 def __init__(self, req_url):
11 self.req_url = req_url
12 self.status_code = 200
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
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
66def mocked_requests_get(*args, **kwargs):
67 return MockResponse(args[0])
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
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 """
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 == []
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'
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']
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
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'
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']
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']
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']
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']
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'
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'
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'
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'
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'
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'
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 }
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'}
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 == {}
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'
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
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
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
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']
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
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 == []
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 == []