Coverage for test/test_vars_annotation_processor.py: 100%
73 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-23 02:22 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-23 02:22 +0000
1from unittest.mock import patch
3from application.image_review.vars.vars_annotation_processor import VarsAnnotationProcessor
4from application.util.functions import parse_datetime
5from test.data.vars_responses import ex_23060001
6from test.util.mock_response import MockResponse
8VARS_DIVE_QUERY_URL = 'http://hurlstor.soest.hawaii.edu:8086/query/dive'
9VARS_PHYLOGENY_URL = 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up'
12def mocked_requests_get(*args, **kwargs):
13 return MockResponse(url=kwargs.get('url'))
16class TestVarsAnnotationProcessor:
17 def test_init(self):
18 annotation_processor = VarsAnnotationProcessor(
19 sequence_names=['Deep Discoverer 23060001'],
20 vars_dive_url=VARS_DIVE_QUERY_URL,
21 vars_phylogeny_url=VARS_PHYLOGENY_URL,
22 )
23 assert annotation_processor.vessel_name == 'Deep Discoverer'
24 assert annotation_processor.sequence_names == ['Deep Discoverer 23060001']
25 assert annotation_processor.highest_id_ref == 0
26 assert annotation_processor.phylogeny == {}
27 assert annotation_processor.working_records == []
28 assert annotation_processor.final_records == []
30 def test_load_phylogeny(self):
31 annotation_processor = VarsAnnotationProcessor(
32 sequence_names=['Deep Discoverer 23060001'],
33 vars_dive_url=VARS_DIVE_QUERY_URL,
34 vars_phylogeny_url=VARS_PHYLOGENY_URL,
35 )
36 annotation_processor.load_phylogeny()
37 assert len(annotation_processor.phylogeny.keys()) > 0
39 @patch('requests.get', side_effect=mocked_requests_get)
40 def test_fetch_media(self, mock_get):
41 annotation_processor = VarsAnnotationProcessor(
42 sequence_names=['Deep Discoverer 23060001'],
43 vars_dive_url=VARS_DIVE_QUERY_URL,
44 vars_phylogeny_url=VARS_PHYLOGENY_URL,
45 )
46 sequence_videos = []
47 annotation_processor.fetch_media(annotation_processor.sequence_names[0], sequence_videos)
48 assert sequence_videos == [
49 {
50 'start_timestamp': parse_datetime('2023-08-24T18:30:00Z'),
51 'uri': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T183000Z.m4v',
52 'sequence_name': 'Deep Discoverer 23060001',
53 'video_reference_uuid': 'dda3dc62-9f78-4dbb-91cd-5015026e0434',
54 },
55 {
56 'start_timestamp': parse_datetime('2023-08-24T20:30:00Z'),
57 'uri': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T203000Z.m4v',
58 'sequence_name': 'Deep Discoverer 23060001',
59 'video_reference_uuid': 'd955c4ef-94e0-4f0d-83f5-d0144a09a933',
60 },
61 ]
62 assert len(annotation_processor.working_records) == 3
64 @patch('requests.get', side_effect=mocked_requests_get)
65 def test_fetch_vars_phylogeny(self, mock_get):
66 annotation_processor = VarsAnnotationProcessor(
67 sequence_names=['Deep Discoverer 23060001'],
68 vars_dive_url=VARS_DIVE_QUERY_URL,
69 vars_phylogeny_url=VARS_PHYLOGENY_URL,
70 )
71 annotation_processor.fetch_vars_phylogeny('Pomacentridae', no_match_records=set())
72 assert annotation_processor.phylogeny['Pomacentridae'] == {
73 'phylum': 'Chordata',
74 'subphylum': 'Vertebrata',
75 'superclass': 'Pisces',
76 'class': 'Actinopterygii',
77 'order': 'Perciformes',
78 'family': 'Pomacentridae',
79 }
81 def test_get_image_url_only_one(self): # only one image to choose from
82 annotation_processor = VarsAnnotationProcessor(
83 sequence_names=['Deep Discoverer 23060001'],
84 vars_dive_url=VARS_DIVE_QUERY_URL,
85 vars_phylogeny_url=VARS_PHYLOGENY_URL,
86 )
87 assert annotation_processor.get_image_url(ex_23060001['annotations'][1]) \
88 == 'https://hurlimage.soest.hawaii.edu/SupplementalPhotos/Hphotos/NA138photos/H1920/cam1_20220419064757.png'
90 def test_get_image_url_png(self): # multiple images to choose from, get the png
91 annotation_processor = VarsAnnotationProcessor(
92 sequence_names=['Deep Discoverer 23060001'],
93 vars_dive_url=VARS_DIVE_QUERY_URL,
94 vars_phylogeny_url=VARS_PHYLOGENY_URL,
95 )
96 assert annotation_processor.get_image_url(ex_23060001['annotations'][0]) \
97 == 'https://hurlimage.soest.hawaii.edu/Hercules/images/1381920/20220418T202402.015Z--542830a8-ec69-4ee5-a57d-9de66a412dba.png'
99 @patch('requests.get', side_effect=mocked_requests_get)
100 def test_get_video(self, mock_get):
101 annotation_processor = VarsAnnotationProcessor(
102 sequence_names=['Deep Discoverer 23060001'],
103 vars_dive_url=VARS_DIVE_QUERY_URL,
104 vars_phylogeny_url=VARS_PHYLOGENY_URL,
105 )
106 sequence_videos = []
107 annotation_processor.fetch_media(annotation_processor.sequence_names[0], sequence_videos)
108 print(sequence_videos)
109 assert annotation_processor.get_video(ex_23060001['annotations'][0], sequence_videos)['uri'] \
110 == 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T183000Z.m4v#t=374'
112 @patch('requests.get', side_effect=mocked_requests_get)
113 def test_get_video_url_second_media(self, mock_get):
114 annotation_processor = VarsAnnotationProcessor(
115 sequence_names=['Deep Discoverer 23060001'],
116 vars_dive_url=VARS_DIVE_QUERY_URL,
117 vars_phylogeny_url=VARS_PHYLOGENY_URL,
118 )
119 sequence_videos = []
120 annotation_processor.fetch_media(annotation_processor.sequence_names[0], sequence_videos)
121 assert annotation_processor.get_video(ex_23060001['annotations'][1], sequence_videos)['uri'] \
122 == 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T203000Z.m4v#t=3505'
124 @patch('requests.get', side_effect=mocked_requests_get)
125 def test_process_images(self, mock_get):
126 annotation_processor = VarsAnnotationProcessor(
127 sequence_names=['Deep Discoverer 23060001'],
128 vars_dive_url=VARS_DIVE_QUERY_URL,
129 vars_phylogeny_url=VARS_PHYLOGENY_URL,
130 )
131 sequence_videos = []
132 annotation_processor.fetch_media(annotation_processor.sequence_names[0], sequence_videos)
133 assert annotation_processor.process_working_records(sequence_videos) == [
134 {
135 'observation_uuid': '0059f860-4799-485f-c06c-5830e5ddd31e',
136 'concept': 'Pomacentridae',
137 'associations': ex_23060001['annotations'][0]['associations'],
138 'identity_reference': '12',
139 'image_url': 'https://hurlimage.soest.hawaii.edu/Hercules/images/1381920/20220418T202402.015Z--542830a8-ec69-4ee5-a57d-9de66a412dba.png',
140 'video_url': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T183000Z.m4v#t=374',
141 'recorded_timestamp': '2023-08-24T18:36:14.245Z',
142 'video_sequence_name': 'Deep Discoverer 23060001',
143 'annotator': 'Nikki Cunanan',
144 'depth': 668,
145 'phylum': 'Chordata',
146 'subphylum': 'Vertebrata',
147 'superclass': 'Pisces',
148 'class': 'Actinopterygii',
149 'order': 'Perciformes',
150 'family': 'Pomacentridae',
151 'activity': None,
152 },
153 {
154 'observation_uuid': '0d9133d7-1d49-47d5-4b6d-6e4fb25dd41e',
155 'concept': 'Pomacentridae',
156 'associations': ex_23060001['annotations'][1]['associations'],
157 'identity_reference': '13',
158 'image_url': 'https://hurlimage.soest.hawaii.edu/SupplementalPhotos/Hphotos/NA138photos/H1920/cam1_20220419064757.png',
159 'video_url': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T203000Z.m4v#t=3505',
160 'recorded_timestamp': '2023-08-24T21:28:25.675Z',
161 'video_sequence_name': 'Deep Discoverer 23060001',
162 'annotator': 'Meagan Putts',
163 'depth': 668,
164 'phylum': 'Chordata',
165 'subphylum': 'Vertebrata',
166 'superclass': 'Pisces',
167 'class': 'Actinopterygii',
168 'order': 'Perciformes',
169 'family': 'Pomacentridae',
170 'activity': 'cruise',
171 },
172 {
173 'observation_uuid': '0059f860-4799-485f-c06c-asdfasdfadsf',
174 'concept': 'Pomacentridae',
175 'identity_reference': '12',
176 'associations': ex_23060001['annotations'][5]['associations'],
177 'annotator': 'Nikki Cunanan',
178 'depth': 668,
179 'phylum': 'Chordata',
180 'subphylum': 'Vertebrata',
181 'superclass': 'Pisces',
182 'class': 'Actinopterygii',
183 'order': 'Perciformes',
184 'family': 'Pomacentridae',
185 'image_url': 'https://hurlimage.soest.hawaii.edu/Hercules/images/1381920/20220418T202402.015Z--542830a8-ec69-4ee5-a57d-9de66a412dba.png',
186 'video_url': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T183000Z.m4v#t=913',
187 'recorded_timestamp': '2023-08-24T18:45:13Z',
188 'video_sequence_name': 'Deep Discoverer 23060001',
189 'activity': None,
190 },
191 ]
193 @patch('requests.get', side_effect=mocked_requests_get)
194 def test_sort_records(self, mock_get):
195 annotation_processor = VarsAnnotationProcessor(
196 sequence_names=['Deep Discoverer 23060001'],
197 vars_dive_url=VARS_DIVE_QUERY_URL,
198 vars_phylogeny_url=VARS_PHYLOGENY_URL,
199 )
200 sequence_videos = []
201 annotation_processor.fetch_media(annotation_processor.sequence_names[0], sequence_videos)
202 annotation_processor.sort_records(annotation_processor.process_working_records(sequence_videos))
203 assert annotation_processor.final_records == [
204 {
205 'observation_uuid': '0059f860-4799-485f-c06c-5830e5ddd31e',
206 'concept': 'Pomacentridae',
207 'identity_reference': '12',
208 'associations': ex_23060001['annotations'][0]['associations'],
209 'annotator': 'Nikki Cunanan',
210 'depth': 668,
211 'phylum': 'Chordata',
212 'class': 'Actinopterygii',
213 'order': 'Perciformes',
214 'family': 'Pomacentridae',
215 'genus': None,
216 'species': None,
217 'image_url': 'https://hurlimage.soest.hawaii.edu/Hercules/images/1381920/20220418T202402.015Z--542830a8-ec69-4ee5-a57d-9de66a412dba.png',
218 'video_url': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T183000Z.m4v#t=374',
219 'recorded_timestamp': '24 Aug 23 18:36:14 UTC',
220 'video_sequence_name': 'Deep Discoverer 23060001',
221 'activity': None,
222 },
223 {
224 'observation_uuid': '0059f860-4799-485f-c06c-asdfasdfadsf',
225 'concept': 'Pomacentridae',
226 'identity_reference': '12',
227 'associations': ex_23060001['annotations'][5]['associations'],
228 'annotator': 'Nikki Cunanan',
229 'depth': 668,
230 'phylum': 'Chordata',
231 'class': 'Actinopterygii',
232 'order': 'Perciformes',
233 'family': 'Pomacentridae',
234 'genus': None,
235 'species': None,
236 'image_url': 'https://hurlimage.soest.hawaii.edu/Hercules/images/1381920/20220418T202402.015Z--542830a8-ec69-4ee5-a57d-9de66a412dba.png',
237 'video_url': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T183000Z.m4v#t=913',
238 'recorded_timestamp': '24 Aug 23 18:45:13 UTC',
239 'video_sequence_name': 'Deep Discoverer 23060001',
240 'activity': None,
241 },
242 {
243 'observation_uuid': '0d9133d7-1d49-47d5-4b6d-6e4fb25dd41e',
244 'concept': 'Pomacentridae',
245 'associations': ex_23060001['annotations'][1]['associations'],
246 'identity_reference': '13',
247 'annotator': 'Meagan Putts',
248 'depth': 668,
249 'phylum': 'Chordata',
250 'class': 'Actinopterygii',
251 'order': 'Perciformes',
252 'family': 'Pomacentridae',
253 'genus': None,
254 'species': None,
255 'image_url': 'https://hurlimage.soest.hawaii.edu/SupplementalPhotos/Hphotos/NA138photos/H1920/cam1_20220419064757.png',
256 'video_url': 'https://hurlvideo.soest.hawaii.edu/D2/2023/EX2306_01/EX2306_01_20230824T203000Z.m4v#t=3505',
257 'recorded_timestamp': '24 Aug 23 21:28:25 UTC',
258 'video_sequence_name': 'Deep Discoverer 23060001',
259 'activity': 'cruise',
260 },
262 ]
264 @patch('requests.get', side_effect=mocked_requests_get)
265 def test_find_highest_id_refs(self, mock_get):
266 annotation_processor = VarsAnnotationProcessor(
267 sequence_names=['Deep Discoverer 23060001'],
268 vars_dive_url=VARS_DIVE_QUERY_URL,
269 vars_phylogeny_url=VARS_PHYLOGENY_URL,
270 )
271 sequence_videos = []
272 annotation_processor.fetch_media(annotation_processor.sequence_names[0], sequence_videos)
273 annotation_processor.process_working_records(sequence_videos)
274 assert annotation_processor.highest_id_ref == 13