Skip to content

Commit ef21155

Browse files
committed
Refactor score set validation to handle None values for URNs and update test cases for superseded score set URN handling
1 parent 2746d7b commit ef21155

File tree

3 files changed

+132
-5
lines changed

3 files changed

+132
-5
lines changed

src/mavedb/view_models/score_set.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,25 +224,37 @@ class ScoreSetCreate(ScoreSetModify):
224224
meta_analyzes_score_set_urns: Optional[list[str]] = None
225225

226226
@field_validator("superseded_score_set_urn")
227-
def validate_superseded_score_set_urn(cls, v: str) -> str:
227+
def validate_superseded_score_set_urn(cls, v: Optional[str]) -> Optional[str]:
228+
if not v:
229+
return None
230+
228231
if urn_re.MAVEDB_SCORE_SET_URN_RE.fullmatch(v) is None:
229232
if urn_re.MAVEDB_TMP_URN_RE.fullmatch(v) is None:
230233
raise ValueError(f"'{v}' is not a valid score set URN")
231234
else:
232235
raise ValueError("cannot supersede a private score set - please edit it instead")
236+
233237
return v
234238

235239
@field_validator("meta_analyzes_score_set_urns")
236-
def validate_score_set_urn(cls, v: str) -> str:
240+
def validate_score_set_urn(cls, v: Optional[list[str]]) -> Optional[list[str]]:
241+
if not v:
242+
return None
243+
237244
for s in v:
238245
if urn_re.MAVEDB_SCORE_SET_URN_RE.fullmatch(s) is None and urn_re.MAVEDB_TMP_URN_RE.fullmatch(s) is None:
239246
raise ValueError(f"'{s}' is not a valid score set URN")
247+
240248
return v
241249

242250
@field_validator("experiment_urn")
243-
def validate_experiment_urn(cls, v: str) -> str:
251+
def validate_experiment_urn(cls, v: Optional[str]) -> Optional[str]:
252+
if not v:
253+
return None
254+
244255
if urn_re.MAVEDB_EXPERIMENT_URN_RE.fullmatch(v) is None and urn_re.MAVEDB_TMP_URN_RE.fullmatch(v) is None:
245256
raise ValueError(f"'{v}' is not a valid experiment URN")
257+
246258
return v
247259

248260
@model_validator(mode="after")

tests/helpers/constants.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66

77

88
VALID_EXPERIMENT_SET_URN = "urn:mavedb:01234567"
9-
VALID_EXPERIMENT_URN = f"{VALID_EXPERIMENT_SET_URN}-abcd"
10-
VALID_SCORE_SET_URN = f"{VALID_EXPERIMENT_URN}-0123"
9+
VALID_EXPERIMENT_URN = f"{VALID_EXPERIMENT_SET_URN}-a"
10+
VALID_SCORE_SET_URN = f"{VALID_EXPERIMENT_URN}-1"
11+
VALID_TMP_URN = "tmp:79471b5b-2dbd-4a96-833c-c33023862437"
1112
VALID_VARIANT_URN = f"{VALID_SCORE_SET_URN}#1"
1213

1314
TEST_PUBMED_IDENTIFIER = "20711194"

tests/view_models/test_score_set.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
TEST_BIORXIV_IDENTIFIER,
1919
TEST_MINIMAL_SEQ_SCORESET_RESPONSE,
2020
VALID_EXPERIMENT_URN,
21+
VALID_SCORE_SET_URN,
22+
VALID_TMP_URN,
2123
)
2224
from tests.helpers.util.common import dummy_attributed_object_from_dict
2325

@@ -502,3 +504,115 @@ def test_cannot_create_saved_score_set_without_all_attributed_properties(exclude
502504

503505
assert "Unable to create SavedScoreSet without attribute" in str(exc_info.value)
504506
assert exclude in str(exc_info.value)
507+
508+
509+
def test_can_create_score_set_with_none_type_superseded_score_set_urn():
510+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
511+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
512+
score_set_test["superseded_score_set_urn"] = None
513+
514+
saved_score_set = ScoreSetCreate(**score_set_test)
515+
516+
assert saved_score_set.superseded_score_set_urn is None
517+
518+
519+
def test_can_create_score_set_with_superseded_score_set_urn():
520+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
521+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
522+
score_set_test["superseded_score_set_urn"] = VALID_SCORE_SET_URN
523+
524+
saved_score_set = ScoreSetCreate(**score_set_test)
525+
526+
assert saved_score_set.superseded_score_set_urn == VALID_SCORE_SET_URN
527+
528+
529+
def test_cant_create_score_set_with_invalid_superseded_score_set_urn():
530+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
531+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
532+
score_set_test["superseded_score_set_urn"] = "invalid-urn"
533+
534+
with pytest.raises(ValueError) as exc_info:
535+
ScoreSetCreate(**score_set_test)
536+
537+
assert f"'{score_set_test['superseded_score_set_urn']}' is not a valid score set URN" in str(exc_info.value)
538+
539+
540+
def test_cant_create_score_set_with_tmp_superseded_score_set_urn():
541+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
542+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
543+
score_set_test["superseded_score_set_urn"] = VALID_TMP_URN
544+
545+
with pytest.raises(ValueError) as exc_info:
546+
ScoreSetCreate(**score_set_test)
547+
548+
assert "cannot supersede a private score set - please edit it instead" in str(exc_info.value)
549+
550+
551+
def test_can_create_score_set_with_none_type_meta_analyzes_score_set_urn():
552+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
553+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
554+
score_set_test["meta_analyzes_score_set_urns"] = None
555+
556+
saved_score_set = ScoreSetCreate(**score_set_test)
557+
558+
assert saved_score_set.meta_analyzes_score_set_urns is None
559+
560+
561+
def test_can_create_score_set_with_empty_meta_analyzes_score_set_urn():
562+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
563+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
564+
score_set_test["meta_analyzes_score_set_urns"] = []
565+
566+
saved_score_set = ScoreSetCreate(**score_set_test)
567+
568+
assert saved_score_set.meta_analyzes_score_set_urns is None
569+
570+
571+
def test_can_create_score_set_with_meta_analyzes_score_set_urn():
572+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
573+
score_set_test["meta_analyzes_score_set_urns"] = [VALID_SCORE_SET_URN]
574+
575+
saved_score_set = ScoreSetCreate(**score_set_test)
576+
assert saved_score_set.meta_analyzes_score_set_urns == [VALID_SCORE_SET_URN]
577+
578+
579+
def test_cant_create_score_set_with_invalid_meta_analyzes_score_set_urn():
580+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
581+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
582+
score_set_test["meta_analyzes_score_set_urns"] = ["invalid-urn"]
583+
584+
with pytest.raises(ValueError) as exc_info:
585+
ScoreSetCreate(**score_set_test)
586+
587+
assert f"'{score_set_test['meta_analyzes_score_set_urns'][0]}' is not a valid score set URN" in str(exc_info.value)
588+
589+
590+
def test_cant_create_score_set_with_invalid_experiment_urn():
591+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
592+
score_set_test["experiment_urn"] = "invalid-urn"
593+
594+
with pytest.raises(ValueError) as exc_info:
595+
ScoreSetCreate(**score_set_test)
596+
597+
assert f"'{score_set_test['experiment_urn']}' is not a valid experiment URN" in str(exc_info.value)
598+
599+
600+
def test_cant_create_score_set_with_experiment_urn_if_is_meta_analysis():
601+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
602+
score_set_test["experiment_urn"] = VALID_EXPERIMENT_URN
603+
score_set_test["meta_analyzes_score_set_urns"] = [VALID_SCORE_SET_URN]
604+
605+
with pytest.raises(ValueError) as exc_info:
606+
ScoreSetCreate(**score_set_test)
607+
608+
assert "experiment URN should not be supplied when your score set is a meta-analysis" in str(exc_info.value)
609+
610+
611+
def test_cant_create_score_set_without_experiment_urn_if_not_meta_analysis():
612+
score_set_test = TEST_MINIMAL_SEQ_SCORESET.copy()
613+
score_set_test["meta_analyzes_score_set_urns"] = []
614+
615+
with pytest.raises(ValueError) as exc_info:
616+
ScoreSetCreate(**score_set_test)
617+
618+
assert "experiment URN is required unless your score set is a meta-analysis" in str(exc_info.value)

0 commit comments

Comments
 (0)