willisapi-client 1.5__tar.gz → 1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {willisapi_client-1.5 → willisapi_client-1.7}/PKG-INFO +1 -1
  2. {willisapi_client-1.5 → willisapi_client-1.7}/requirements.txt +4 -4
  3. willisapi_client-1.7/tests/test_auth.py +69 -0
  4. willisapi_client-1.7/tests/test_csv_validation.py +556 -0
  5. {willisapi_client-1.5 → willisapi_client-1.7}/tests/test_download.py +9 -2
  6. {willisapi_client-1.5 → willisapi_client-1.7}/tests/test_upload.py +22 -1
  7. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/__init__.py +1 -2
  8. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/__version__.py +1 -1
  9. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/api.py +1 -1
  10. willisapi_client-1.7/willisapi_client/services/auth/__init__.py +6 -0
  11. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/auth/auth_utils.py +2 -41
  12. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/download/download_handler.py +2 -1
  13. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/download/download_utils.py +46 -20
  14. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/exceptions.py +8 -0
  15. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/upload/csv_validation.py +275 -2
  16. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/upload/language_choices.py +4 -0
  17. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/upload/upload_utils.py +13 -8
  18. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/willisapi_client.py +1 -7
  19. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client.egg-info/PKG-INFO +1 -1
  20. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client.egg-info/SOURCES.txt +0 -1
  21. willisapi_client-1.5/tests/test_auth.py +0 -151
  22. willisapi_client-1.5/tests/test_csv_validation.py +0 -259
  23. willisapi_client-1.5/willisapi_client/services/auth/__init__.py +0 -7
  24. willisapi_client-1.5/willisapi_client/services/auth/user_group_manager.py +0 -67
  25. {willisapi_client-1.5 → willisapi_client-1.7}/LICENSE +0 -0
  26. {willisapi_client-1.5 → willisapi_client-1.7}/MANIFEST.in +0 -0
  27. {willisapi_client-1.5 → willisapi_client-1.7}/README.md +0 -0
  28. {willisapi_client-1.5 → willisapi_client-1.7}/RELEASE.md +0 -0
  29. {willisapi_client-1.5 → willisapi_client-1.7}/setup.cfg +0 -0
  30. {willisapi_client-1.5 → willisapi_client-1.7}/setup.py +0 -0
  31. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/logging_setup.py +0 -0
  32. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/__init__.py +0 -0
  33. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/auth/login_manager.py +0 -0
  34. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/download/__init__.py +0 -0
  35. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/upload/__init__.py +0 -0
  36. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/upload/multipart_upload_handler.py +0 -0
  37. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/services/upload/utils.py +0 -0
  38. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client/timer.py +0 -0
  39. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client.egg-info/dependency_links.txt +0 -0
  40. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client.egg-info/not-zip-safe +0 -0
  41. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client.egg-info/requires.txt +4 -4
  42. {willisapi_client-1.5 → willisapi_client-1.7}/willisapi_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: willisapi_client
3
- Version: 1.5
3
+ Version: 1.7
4
4
  Summary: A Python client for willisapi
5
5
  Home-page: https://github.com/bklynhlth/willsiapi_client
6
6
  Author: bklynhlth
@@ -8,16 +8,16 @@ charset-normalizer==3.2.0
8
8
  frozenlist==1.4.0
9
9
  idna==3.4
10
10
  multidict==6.0.4
11
+ nest-asyncio==1.5.7
11
12
  numpy==1.25.2
12
13
  pandas==2.0.3
14
+ pytest==7.4.0
15
+ pytest-cov==4.1.0
13
16
  python-dateutil==2.8.2
14
17
  pytz==2023.3
15
18
  requests==2.31.0
16
19
  six==1.16.0
20
+ tqdm==4.66.1
17
21
  tzdata==2023.3
18
22
  urllib3==2.0.7
19
23
  yarl==1.9.2
20
- tqdm==4.66.1
21
- nest-asyncio==1.5.7
22
- pytest==7.4.0
23
- pytest-cov==4.1.0
@@ -0,0 +1,69 @@
1
+ from willisapi_client.services.auth.login_manager import login
2
+
3
+ from unittest.mock import patch
4
+ from datetime import timedelta, datetime
5
+
6
+
7
+ class TestLoginFunction:
8
+ def setup_method(self):
9
+ self.dt = datetime.now()
10
+ self.username = "dummy"
11
+ self.password = "password"
12
+ self.id_token = "dummy_token"
13
+ self.client_email = "dummy@gmail.com"
14
+ self.client_name = "dummy_group"
15
+ self.account = "Group1"
16
+ self.expires_in = 100
17
+ self.expires_in_date = str(
18
+ self.dt.replace(hour=0, minute=0, second=0, microsecond=0)
19
+ + timedelta(seconds=self.expires_in)
20
+ )
21
+
22
+ @patch("willisapi_client.services.auth.login_manager.AuthUtils.login")
23
+ def test_login_failed(self, mocked_login):
24
+ mocked_login.return_value = {}
25
+ key, expire_in = login("", "")
26
+ assert key == None
27
+ assert expire_in == None
28
+
29
+ @patch("willisapi_client.services.auth.login_manager.AuthUtils.login")
30
+ def test_login_success(self, mocked_login):
31
+ mocked_login.return_value = {
32
+ "status_code": 200,
33
+ "result": {"id_token": self.id_token, "expires_in": self.expires_in},
34
+ }
35
+
36
+ key, expire_in = login(self.username, self.password)
37
+ expire_in = str(self.dt.replace(hour=0, minute=1, second=40, microsecond=0))
38
+ assert key == self.id_token
39
+ assert expire_in == self.expires_in_date
40
+
41
+ @patch("willisapi_client.services.auth.login_manager.AuthUtils.login")
42
+ def test_login_400_status(self, mocked_login):
43
+ mocked_login.return_value = {
44
+ "status_code": 400,
45
+ "result": {"id_token": self.id_token, "expires_in": self.expires_in},
46
+ }
47
+ key, expire_in = login(self.username, self.password)
48
+ assert key == None
49
+ assert expire_in == None
50
+
51
+ @patch("willisapi_client.services.auth.login_manager.AuthUtils.login")
52
+ def test_login_403_status(self, mocked_login):
53
+ mocked_login.return_value = {
54
+ "status_code": 403,
55
+ "result": {"id_token": self.id_token, "expires_in": self.expires_in},
56
+ }
57
+ key, expire_in = login(self.username, self.password)
58
+ assert key == None
59
+ assert expire_in == None
60
+
61
+ @patch("willisapi_client.services.auth.login_manager.AuthUtils.login")
62
+ def test_login_500_status(self, mocked_login):
63
+ mocked_login.return_value = {
64
+ "status_code": 500,
65
+ "result": {"id_token": self.id_token, "expires_in": self.expires_in},
66
+ }
67
+ key, expire_in = login(self.username, self.password)
68
+ assert key == None
69
+ assert expire_in == None
@@ -0,0 +1,556 @@
1
+ from willisapi_client.services.upload.csv_validation import CSVValidation
2
+
3
+ from unittest.mock import patch
4
+
5
+
6
+ class TestCSVValidation:
7
+ def test_directory(self):
8
+ csv = CSVValidation(file_path="/")
9
+ assert csv._is_valid() == False
10
+
11
+ def test_incorrect_mp4_file(self):
12
+ csv = CSVValidation(file_path="/video.mp4")
13
+ assert csv._is_valid() == False
14
+
15
+ def test_incorrect_csv_file(self):
16
+ csv = CSVValidation(file_path="/metadata.csv")
17
+ assert csv._is_valid() == False
18
+
19
+ @patch(
20
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
21
+ )
22
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
23
+ def test_correct_csv_file(self, mocked_headers, mocked_file):
24
+ mocked_headers.return_value = True
25
+ mocked_file.return_value = True
26
+ csv = CSVValidation(file_path="/metadata.csv")
27
+ assert csv._is_valid() == True
28
+ assert csv._is_file() == True
29
+ assert csv._is_valid_file_ext() == True
30
+ assert csv.get_filename() == "metadata.csv"
31
+
32
+ @patch(
33
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
34
+ )
35
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
36
+ @patch(
37
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
38
+ )
39
+ def test_csv_row_validation_success(
40
+ self, mocked_upload_file, mocked_file, mocked_headers
41
+ ):
42
+ mocked_headers.return_value = True
43
+ mocked_file.return_value = True
44
+ mocked_upload_file.return_value = (True, "")
45
+ csv = CSVValidation(file_path="/data.csv")
46
+ assert csv._is_valid() == True
47
+ row = {
48
+ "project_name": "project_name",
49
+ "file_path": "/video.mp4",
50
+ "workflow_tags": "speech_characteristics",
51
+ "pt_id_external": "qwerty",
52
+ "time_collected": "2023-02-02",
53
+ "language": "en-US",
54
+ "age": 30,
55
+ "sex": "M",
56
+ "race": "Asian",
57
+ "study_arm": "Study Arm",
58
+ "clinical_score_a": "Score A",
59
+ "clinical_score_b": "Score B",
60
+ "clinical_score_c": "Score C",
61
+ "clinical_score_d": "Score D",
62
+ "clinical_score_e": "Score E",
63
+ }
64
+ is_valid, _ = csv.validate_row(row)
65
+ assert is_valid == True
66
+
67
+ @patch(
68
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
69
+ )
70
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
71
+ @patch(
72
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
73
+ )
74
+ def test_csv_row_validation_fail_empty_project(
75
+ self, mocked_upload_file, mocked_file, mocked_headers
76
+ ):
77
+ mocked_headers.return_value = True
78
+ mocked_file.return_value = True
79
+ mocked_upload_file.return_value = (True, "")
80
+ csv = CSVValidation(file_path="/metadata.csv")
81
+ assert csv._is_valid() == True
82
+ row = {
83
+ "project_name": "",
84
+ "file_path": "/video.mp4",
85
+ "workflow_tags": "speech_characteristics",
86
+ "pt_id_external": "qwerty",
87
+ "time_collected": "2023-02-02",
88
+ }
89
+ is_valid, _ = csv.validate_row(row)
90
+ assert is_valid == False
91
+
92
+ @patch(
93
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
94
+ )
95
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
96
+ @patch(
97
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
98
+ )
99
+ def test_csv_row_validation_failed_incorrect_file(
100
+ self, mocked_upload_file, mocked_file, mocked_headers
101
+ ):
102
+ mocked_headers.return_value = True
103
+ mocked_file.return_value = True
104
+ mocked_upload_file.return_value = (False, "Error")
105
+ csv = CSVValidation(file_path="/metadata.csv")
106
+ assert csv._is_valid() == True
107
+ row = {
108
+ "project_name": "project_name",
109
+ "file_path": "",
110
+ "workflow_tags": "speech_characteristics",
111
+ "pt_id_external": "qwerty",
112
+ "time_collected": "2023-02-02",
113
+ }
114
+ is_valid, _ = csv.validate_row(row)
115
+ assert is_valid == False
116
+
117
+ @patch(
118
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
119
+ )
120
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
121
+ @patch(
122
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
123
+ )
124
+ def test_csv_row_validation_failed_incorrect_wfts(
125
+ self, mocked_upload_file, mocked_file, mocked_headers
126
+ ):
127
+ mocked_headers.return_value = True
128
+ mocked_file.return_value = True
129
+ mocked_upload_file.return_value = (True, None)
130
+ csv = CSVValidation(file_path="/metadata.csv")
131
+ assert csv._is_valid() == True
132
+ row = {
133
+ "project_name": "project_name",
134
+ "file_path": "file.mp4",
135
+ "workflow_tags": "wrong_tag",
136
+ "pt_id_external": "qwerty",
137
+ "time_collected": "2023-02-02",
138
+ }
139
+ is_valid, _ = csv.validate_row(row)
140
+ assert is_valid == False
141
+
142
+ @patch(
143
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
144
+ )
145
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
146
+ @patch(
147
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
148
+ )
149
+ def test_csv_row_validation_dynamic_wfts(
150
+ self, mocked_upload_file, mocked_file, mocked_headers
151
+ ):
152
+ mocked_headers.return_value = True
153
+ mocked_file.return_value = True
154
+ mocked_upload_file.return_value = (True, None)
155
+ csv = CSVValidation(file_path="/metadata.csv")
156
+ assert csv._is_valid() == True
157
+ row = {
158
+ "project_name": "project_name",
159
+ "file_path": "file.mp4",
160
+ "workflow_tags": "scale_abc,speech_transcription_aws_dummy",
161
+ "pt_id_external": "qwerty",
162
+ "time_collected": "2023-02-02",
163
+ "language": "en-US",
164
+ "age": 30,
165
+ "sex": "M",
166
+ "race": "Asian",
167
+ "study_arm": "Study Arm",
168
+ "clinical_score_a": "Score A",
169
+ "clinical_score_b": "Score B",
170
+ "clinical_score_c": "Score C",
171
+ "clinical_score_d": "Score D",
172
+ "clinical_score_e": "Score E",
173
+ }
174
+ is_valid, _ = csv.validate_row(row)
175
+ assert is_valid == True
176
+
177
+ @patch(
178
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
179
+ )
180
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
181
+ @patch(
182
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
183
+ )
184
+ def test_csv_row_validation_failed_empty_pt_id(
185
+ self, mocked_upload_file, mocked_file, mocked_headers
186
+ ):
187
+ mocked_headers.return_value = True
188
+ mocked_file.return_value = True
189
+ mocked_upload_file.return_value = (True, None)
190
+ csv = CSVValidation(file_path="/metadata.csv")
191
+ assert csv._is_valid() == True
192
+ row = {
193
+ "project_name": "project_name",
194
+ "file_path": "file.mp4",
195
+ "workflow_tags": "speech_characteristics",
196
+ "pt_id_external": "",
197
+ "time_collected": "2023-02-02",
198
+ }
199
+ is_valid, _ = csv.validate_row(row)
200
+ assert is_valid == False
201
+
202
+ @patch(
203
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
204
+ )
205
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
206
+ @patch(
207
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
208
+ )
209
+ def test_csv_row_validation_failed_incorrect_time_collected(
210
+ self, mocked_upload_file, mocked_file, mocked_headers
211
+ ):
212
+ mocked_headers.return_value = True
213
+ mocked_file.return_value = True
214
+ mocked_upload_file.return_value = (True, None)
215
+ csv = CSVValidation(file_path="/metadata.csv")
216
+ assert csv._is_valid() == True
217
+ row = {
218
+ "project_name": "project_name",
219
+ "file_path": "file.mp4",
220
+ "workflow_tags": "speech_characteristics",
221
+ "pt_id_external": "",
222
+ "time_collected": "20-02-02",
223
+ }
224
+ is_valid, _ = csv.validate_row(row)
225
+ assert is_valid == False
226
+
227
+ @patch(
228
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
229
+ )
230
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
231
+ @patch(
232
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
233
+ )
234
+ def test_csv_row_validation_failed_empty_language_code(
235
+ self, mocked_upload_file, mocked_file, mocked_headers
236
+ ):
237
+ mocked_headers.return_value = True
238
+ mocked_file.return_value = True
239
+ mocked_upload_file.return_value = (True, None)
240
+ csv = CSVValidation(file_path="/metadata.csv")
241
+ assert csv._is_valid() == True
242
+ row = {
243
+ "project_name": "project_name",
244
+ "file_path": "file.mp4",
245
+ "workflow_tags": "speech_characteristics",
246
+ "pt_id_external": "",
247
+ "time_collected": "20-02-02",
248
+ "language": None,
249
+ }
250
+ is_valid, _ = csv.validate_row(row)
251
+ assert is_valid == False
252
+
253
+ @patch(
254
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
255
+ )
256
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
257
+ @patch(
258
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
259
+ )
260
+ def test_csv_row_validation_passed_non_empty_language_code(
261
+ self, mocked_upload_file, mocked_file, mocked_headers
262
+ ):
263
+ mocked_headers.return_value = True
264
+ mocked_file.return_value = True
265
+ mocked_upload_file.return_value = (True, None)
266
+ csv = CSVValidation(file_path="/metadata.csv")
267
+ assert csv._is_valid() == True
268
+ row = {
269
+ "project_name": "project_name",
270
+ "file_path": "file.mp4",
271
+ "workflow_tags": "speech_characteristics",
272
+ "pt_id_external": "",
273
+ "time_collected": "20-02-02",
274
+ "language": "random",
275
+ }
276
+ is_valid, _ = csv.validate_row(row)
277
+ assert is_valid == False
278
+
279
+ @patch(
280
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
281
+ )
282
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
283
+ @patch(
284
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
285
+ )
286
+ def test_csv_row_validation_fail_empty_age(
287
+ self, mocked_upload_file, mocked_file, mocked_headers
288
+ ):
289
+ mocked_headers.return_value = True
290
+ mocked_file.return_value = True
291
+ mocked_upload_file.return_value = (True, None)
292
+ csv = CSVValidation(file_path="/metadata.csv")
293
+ assert csv._is_valid() == True
294
+ row = {
295
+ "project_name": "project_name",
296
+ "file_path": "file.mp4",
297
+ "workflow_tags": "speech_characteristics",
298
+ "pt_id_external": "qwerty",
299
+ "time_collected": "2023-02-02",
300
+ "language": "en-US",
301
+ "age": "",
302
+ }
303
+ is_valid, _ = csv.validate_row(row)
304
+ assert is_valid == False
305
+
306
+ @patch(
307
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
308
+ )
309
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
310
+ @patch(
311
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
312
+ )
313
+ def test_csv_row_validation_fail_empty_sex_field(
314
+ self, mocked_upload_file, mocked_file, mocked_headers
315
+ ):
316
+ mocked_headers.return_value = True
317
+ mocked_file.return_value = True
318
+ mocked_upload_file.return_value = (True, None)
319
+ csv = CSVValidation(file_path="/metadata.csv")
320
+ assert csv._is_valid() == True
321
+ row = {
322
+ "project_name": "project_name",
323
+ "file_path": "file.mp4",
324
+ "workflow_tags": "speech_characteristics",
325
+ "pt_id_external": "qwerty",
326
+ "time_collected": "2023-02-02",
327
+ "language": "en-US",
328
+ "age": 30,
329
+ "sex": "",
330
+ }
331
+ is_valid, _ = csv.validate_row(row)
332
+ assert is_valid == False
333
+
334
+ @patch(
335
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
336
+ )
337
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
338
+ @patch(
339
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
340
+ )
341
+ def test_csv_row_validation_fail_empty_race(
342
+ self, mocked_upload_file, mocked_file, mocked_headers
343
+ ):
344
+ mocked_headers.return_value = True
345
+ mocked_file.return_value = True
346
+ mocked_upload_file.return_value = (True, "")
347
+ csv = CSVValidation(file_path="/metadata.csv")
348
+ assert csv._is_valid() == True
349
+ row = {
350
+ "project_name": "project_name",
351
+ "file_path": "/video.mp4",
352
+ "workflow_tags": "speech_characteristics",
353
+ "pt_id_external": "qwerty",
354
+ "time_collected": "2023-02-02",
355
+ "language": "en-US",
356
+ "age": 30,
357
+ "sex": "M",
358
+ "race": "",
359
+ }
360
+ is_valid, _ = csv.validate_row(row)
361
+ assert is_valid == False
362
+
363
+ @patch(
364
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
365
+ )
366
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
367
+ @patch(
368
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
369
+ )
370
+ def test_csv_row_validation_fail_empty_study_arm(
371
+ self, mocked_upload_file, mocked_file, mocked_headers
372
+ ):
373
+ mocked_headers.return_value = True
374
+ mocked_file.return_value = True
375
+ mocked_upload_file.return_value = (True, "")
376
+ csv = CSVValidation(file_path="/metadata.csv")
377
+ assert csv._is_valid() == True
378
+ row = {
379
+ "project_name": "project_name",
380
+ "file_path": "/video.mp4",
381
+ "workflow_tags": "speech_characteristics",
382
+ "pt_id_external": "qwerty",
383
+ "time_collected": "2023-02-02",
384
+ "language": "en-US",
385
+ "age": 30,
386
+ "sex": "M",
387
+ "race": "Asian",
388
+ "study_arm": "",
389
+ }
390
+ is_valid, _ = csv.validate_row(row)
391
+ assert is_valid == False
392
+
393
+ @patch(
394
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
395
+ )
396
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
397
+ @patch(
398
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
399
+ )
400
+ def test_csv_row_validation_fail_empty_clinical_score_a(
401
+ self, mocked_upload_file, mocked_file, mocked_headers
402
+ ):
403
+ mocked_headers.return_value = True
404
+ mocked_file.return_value = True
405
+ mocked_upload_file.return_value = (True, "")
406
+ csv = CSVValidation(file_path="/metadata.csv")
407
+ assert csv._is_valid() == True
408
+ row = {
409
+ "project_name": "project_name",
410
+ "file_path": "/video.mp4",
411
+ "workflow_tags": "speech_characteristics",
412
+ "pt_id_external": "qwerty",
413
+ "time_collected": "2023-02-02",
414
+ "language": "en-US",
415
+ "age": 30,
416
+ "sex": "M",
417
+ "race": "Asian",
418
+ "study_arm": "Study Arm",
419
+ "clinical_score_a": "",
420
+ }
421
+ is_valid, _ = csv.validate_row(row)
422
+ assert is_valid == False
423
+
424
+ @patch(
425
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
426
+ )
427
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
428
+ @patch(
429
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
430
+ )
431
+ def test_csv_row_validation_fail_empty_clinical_score_b(
432
+ self, mocked_upload_file, mocked_file, mocked_headers
433
+ ):
434
+ mocked_headers.return_value = True
435
+ mocked_file.return_value = True
436
+ mocked_upload_file.return_value = (True, "")
437
+ csv = CSVValidation(file_path="/metadata.csv")
438
+ assert csv._is_valid() == True
439
+ row = {
440
+ "project_name": "project_name",
441
+ "file_path": "/video.mp4",
442
+ "workflow_tags": "speech_characteristics",
443
+ "pt_id_external": "qwerty",
444
+ "time_collected": "2023-02-02",
445
+ "language": "en-US",
446
+ "age": 30,
447
+ "sex": "M",
448
+ "race": "Asian",
449
+ "study_arm": "Study Arm",
450
+ "clinical_score_a": "Score A",
451
+ "clinical_score_b": "",
452
+ }
453
+ is_valid, _ = csv.validate_row(row)
454
+ assert is_valid == False
455
+
456
+ @patch(
457
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
458
+ )
459
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
460
+ @patch(
461
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
462
+ )
463
+ def test_csv_row_validation_fail_empty_clinical_score_c(
464
+ self, mocked_upload_file, mocked_file, mocked_headers
465
+ ):
466
+ mocked_headers.return_value = True
467
+ mocked_file.return_value = True
468
+ mocked_upload_file.return_value = (True, "")
469
+ csv = CSVValidation(file_path="/metadata.csv")
470
+ assert csv._is_valid() == True
471
+ row = {
472
+ "project_name": "project_name",
473
+ "file_path": "/video.mp4",
474
+ "workflow_tags": "speech_characteristics",
475
+ "pt_id_external": "qwerty",
476
+ "time_collected": "2023-02-02",
477
+ "language": "en-US",
478
+ "age": 30,
479
+ "sex": "M",
480
+ "race": "Asian",
481
+ "study_arm": "Study Arm",
482
+ "clinical_score_a": "Score A",
483
+ "clinical_score_b": "Score B",
484
+ "clinical_score_c": "",
485
+ }
486
+ is_valid, _ = csv.validate_row(row)
487
+ assert is_valid == False
488
+
489
+ @patch(
490
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
491
+ )
492
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
493
+ @patch(
494
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
495
+ )
496
+ def test_csv_row_validation_fail_empty_clinical_score_d(
497
+ self, mocked_upload_file, mocked_file, mocked_headers
498
+ ):
499
+ mocked_headers.return_value = True
500
+ mocked_file.return_value = True
501
+ mocked_upload_file.return_value = (True, "")
502
+ csv = CSVValidation(file_path="/metadata.csv")
503
+ assert csv._is_valid() == True
504
+ row = {
505
+ "project_name": "project_name",
506
+ "file_path": "/video.mp4",
507
+ "workflow_tags": "speech_characteristics",
508
+ "pt_id_external": "qwerty",
509
+ "time_collected": "2023-02-02",
510
+ "language": "en-US",
511
+ "age": 30,
512
+ "sex": "M",
513
+ "race": "Asian",
514
+ "study_arm": "Study Arm",
515
+ "clinical_score_a": "Score A",
516
+ "clinical_score_b": "Score B",
517
+ "clinical_score_c": "Score C",
518
+ "clinical_score_d": "",
519
+ }
520
+ is_valid, _ = csv.validate_row(row)
521
+ assert is_valid == False
522
+
523
+ @patch(
524
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_valid_headers"
525
+ )
526
+ @patch("willisapi_client.services.upload.csv_validation.CSVValidation._is_file")
527
+ @patch(
528
+ "willisapi_client.services.upload.csv_validation.CSVValidation._is_file_path_valid"
529
+ )
530
+ def test_csv_row_validation_fail_empty_clinical_score_e(
531
+ self, mocked_upload_file, mocked_file, mocked_headers
532
+ ):
533
+ mocked_headers.return_value = True
534
+ mocked_file.return_value = True
535
+ mocked_upload_file.return_value = (True, "")
536
+ csv = CSVValidation(file_path="/metadata.csv")
537
+ assert csv._is_valid() == True
538
+ row = {
539
+ "project_name": "project_name",
540
+ "file_path": "/video.mp4",
541
+ "workflow_tags": "speech_characteristics",
542
+ "pt_id_external": "qwerty",
543
+ "time_collected": "2023-02-02",
544
+ "language": "en-US",
545
+ "age": 30,
546
+ "sex": "M",
547
+ "race": "Asian",
548
+ "study_arm": "Study Arm",
549
+ "clinical_score_a": "Score A",
550
+ "clinical_score_b": "Score B",
551
+ "clinical_score_c": "Score C",
552
+ "clinical_score_d": "Score C",
553
+ "clinical_score_e": "",
554
+ }
555
+ is_valid, _ = csv.validate_row(row)
556
+ assert is_valid == False
@@ -38,16 +38,23 @@ class TestDownloadFunction:
38
38
  def test_download_no_items_from_api(self, mocked_data):
39
39
  mocked_data.return_value = {
40
40
  "status_code": 200,
41
- "items": {},
41
+ "presigned_url": None,
42
42
  }
43
43
  data = download(self.key, self.project_name)
44
44
  assert data.empty == True
45
45
 
46
46
  @patch("willisapi_client.services.download.download_utils.DownloadUtils.request")
47
- def test_download_success(self, mocked_data):
47
+ @patch(
48
+ "willisapi_client.services.download.download_utils.DownloadUtils.get_data_from_presigned_url"
49
+ )
50
+ def test_download_success(self, mocked_data, mocked_response):
48
51
  with open("tests/test.json") as json_file:
49
52
  data = json.load(json_file)
50
53
  mocked_data.return_value = data
54
+ mocked_response.return_value = {
55
+ "status_code": 200,
56
+ "presigned_url": "https://google.com",
57
+ }
51
58
  data = download(self.key, self.project_name)
52
59
  assert data.empty == False
53
60
  assert data.filename.tolist()[0] == "test_video.mp4"