Skip to content

Commit 5b60918

Browse files
Merge pull request #602 from biocore/csymons_sbi_prelaunch
SBI Pre-launch Adjustments
2 parents d9653bc + d0a0f35 commit 5b60918

File tree

2 files changed

+92
-18
lines changed

2 files changed

+92
-18
lines changed

microsetta_private_api/repo/sample_repo.py

+31-18
Original file line numberDiff line numberDiff line change
@@ -612,26 +612,39 @@ def _validate_barcode_meta(self, sample_site, barcode_meta):
612612
bc_valid = True
613613
for fn, fv in barcode_meta.items():
614614
if fn == "sample_site_last_washed_date":
615-
try:
616-
ret_val = datetime.datetime.strptime(
617-
fv,
618-
self.SAMPLE_SITE_LAST_WASHED_DATE_FORMAT
619-
)
620-
ret_dict[fn] = ret_val
621-
except ValueError:
622-
bc_valid = False
615+
if fv is None or len(fv) == 0:
616+
# Null value is acceptable, bypass format validation
617+
ret_dict[fn] = None
618+
else:
619+
try:
620+
ret_val = datetime.datetime.strptime(
621+
fv,
622+
self.SAMPLE_SITE_LAST_WASHED_DATE_FORMAT
623+
)
624+
ret_dict[fn] = ret_val
625+
except ValueError:
626+
bc_valid = False
623627
elif fn == "sample_site_last_washed_time":
624-
try:
625-
ret_val = datetime.datetime.strptime(
626-
fv,
627-
self.SAMPLE_SITE_LAST_WASHED_TIME_FORMAT_STRPTIME
628-
)
629-
ret_dict[fn] = ret_val
630-
except ValueError:
631-
bc_valid = False
628+
if fv is None or len(fv) == 0:
629+
# Null value is acceptable, bypass format validation
630+
ret_dict[fn] = None
631+
else:
632+
try:
633+
ret_val = datetime.datetime.strptime(
634+
fv,
635+
self.SAMPLE_SITE_LAST_WASHED_TIME_FORMAT_STRPTIME
636+
)
637+
ret_dict[fn] = ret_val
638+
except ValueError:
639+
bc_valid = False
632640
elif fn == "sample_site_last_washed_product":
633-
# The ENUM type in the database will validate the value
634-
ret_dict[fn] = fv
641+
if fv is None or len(fv) == 0:
642+
# Ensure that blank value - None/Null or "" - is passed on
643+
# as None
644+
ret_dict[fn] = None
645+
else:
646+
# The ENUM type in the database will validate the value
647+
ret_dict[fn] = fv
635648
else:
636649
bc_valid = False
637650

microsetta_private_api/repo/tests/test_sample.py

+61
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,49 @@ def test_validate_barcode_meta_pass(self):
184184
bc_valid = sample_repo._validate_barcode_meta("Cheek", bc_meta)
185185
self.assertNotEqual(bc_valid, False)
186186

187+
# Test each scenario where only one field is present to confirm
188+
# that any other field can be nullable
189+
bc_meta = {
190+
"sample_site_last_washed_date": "01/10/2025",
191+
"sample_site_last_washed_time": "",
192+
"sample_site_last_washed_product": ""
193+
}
194+
exp = {
195+
"sample_site_last_washed_date": datetime.datetime(
196+
2025, 1, 10),
197+
"sample_site_last_washed_time": None,
198+
"sample_site_last_washed_product": None
199+
}
200+
bc_valid = sample_repo._validate_barcode_meta("Cheek", bc_meta)
201+
self.assertEqual(bc_valid, exp)
202+
203+
bc_meta = {
204+
"sample_site_last_washed_date": "",
205+
"sample_site_last_washed_time": "9:30 AM",
206+
"sample_site_last_washed_product": ""
207+
}
208+
exp = {
209+
"sample_site_last_washed_date": None,
210+
"sample_site_last_washed_time": datetime.datetime(
211+
1900, 1, 1, 9, 30),
212+
"sample_site_last_washed_product": None
213+
}
214+
bc_valid = sample_repo._validate_barcode_meta("Cheek", bc_meta)
215+
self.assertEqual(bc_valid, exp)
216+
217+
bc_meta = {
218+
"sample_site_last_washed_date": "",
219+
"sample_site_last_washed_time": "",
220+
"sample_site_last_washed_product": "Face cleanser"
221+
}
222+
exp = {
223+
"sample_site_last_washed_date": None,
224+
"sample_site_last_washed_time": None,
225+
"sample_site_last_washed_product": "Face cleanser"
226+
}
227+
bc_valid = sample_repo._validate_barcode_meta("Cheek", bc_meta)
228+
self.assertEqual(bc_valid, exp)
229+
187230
# Confirm that empty dicts pass, regardless of site
188231
bc_meta = {}
189232
bc_valid = sample_repo._validate_barcode_meta("Stool", bc_meta)
@@ -206,6 +249,24 @@ def test_validate_barcode_meta_fail(self):
206249
bc_valid = sample_repo._validate_barcode_meta("Stool", bc_meta)
207250
self.assertFalse(bc_valid)
208251

252+
# Try using an invalid value for the date
253+
bc_meta = {
254+
"sample_site_last_washed_date": "Cookie monster",
255+
"sample_site_last_washed_time": "",
256+
"sample_site_last_washed_product": "Face cleanser"
257+
}
258+
bc_valid = sample_repo._validate_barcode_meta("Cheek", bc_meta)
259+
self.assertEqual(bc_valid, False)
260+
261+
# Try using an invalid value for the time
262+
bc_meta = {
263+
"sample_site_last_washed_date": "",
264+
"sample_site_last_washed_time": "Rosemary focaccia",
265+
"sample_site_last_washed_product": "Face cleanser"
266+
}
267+
bc_valid = sample_repo._validate_barcode_meta("Cheek", bc_meta)
268+
self.assertEqual(bc_valid, False)
269+
209270
def test_update_barcode_meta_via_update_info(self):
210271
# We're going to use a stable sample and override_locked to test
211272
# the barcode meta update via update_info()

0 commit comments

Comments
 (0)