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

1from unittest.mock import patch 

2 

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 

7 

8VARS_DIVE_QUERY_URL = 'http://hurlstor.soest.hawaii.edu:8086/query/dive' 

9VARS_PHYLOGENY_URL = 'http://hurlstor.soest.hawaii.edu:8083/v1/phylogeny/up' 

10 

11 

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

13 return MockResponse(url=kwargs.get('url')) 

14 

15 

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 == [] 

29 

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 

38 

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 

63 

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 } 

80 

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' 

89 

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' 

98 

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' 

111 

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' 

123 

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 ] 

192 

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 }, 

261 

262 ] 

263 

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