1
- import json
2
1
from csv import DictReader
3
2
from datetime import UTC , datetime , timedelta
4
3
5
4
import pytest
5
+ from fastapi .encoders import jsonable_encoder
6
6
from sqlalchemy .orm .session import Session
7
7
from starlette .testclient import TestClient
8
8
@@ -154,7 +154,6 @@ def test_get_metadata_submissions_report_as_admin(
154
154
author = logged_in_user ,
155
155
author_orcid = logged_in_user .orcid ,
156
156
created = now ,
157
- date_last_modified = datetime .now (tz = UTC ),
158
157
is_test_submission = False ,
159
158
)
160
159
fakes .SubmissionRoleFactory (
@@ -168,7 +167,6 @@ def test_get_metadata_submissions_report_as_admin(
168
167
author = other_user ,
169
168
author_orcid = other_user .orcid ,
170
169
created = now + timedelta (seconds = 1 ),
171
- date_last_modified = datetime .now (tz = UTC ),
172
170
# TODO: Omit some optional fields in order to simplify the test data.
173
171
# See: `class MetadataSubmissionRecordCreate` in `schema_submission.py`
174
172
# See: https://microbiomedata.github.io/submission-schema/SampleData/
@@ -467,7 +465,6 @@ def test_cannot_release_other_users_submission_lock(
467
465
author_orcid = logged_in_user .orcid ,
468
466
locked_by = locking_user ,
469
467
lock_updated = datetime .now (tz = UTC ),
470
- date_last_modified = datetime .now (tz = UTC ),
471
468
)
472
469
fakes .SubmissionRoleFactory (
473
470
submission = submission ,
@@ -492,21 +489,20 @@ def test_try_edit_locked_submission(db: Session, client: TestClient, logged_in_u
492
489
author_orcid = logged_in_user .orcid ,
493
490
locked_by = fakes .UserFactory (),
494
491
lock_updated = datetime .now (tz = UTC ),
495
- date_last_modified = datetime .now (tz = UTC ),
496
492
)
497
493
fakes .SubmissionRoleFactory (
498
494
submission = submission ,
499
495
submission_id = submission .id ,
500
496
user_orcid = logged_in_user .orcid ,
501
497
role = SubmissionEditorRole .owner ,
502
498
)
503
- payload = SubmissionMetadataSchema ( ** submission . __dict__ ). json ( exclude_unset = True )
499
+ payload = SubmissionMetadataSchema . model_validate ( submission )
504
500
db .commit ()
505
501
506
502
response = client .request (
507
503
method = "patch" ,
508
504
url = f"/api/metadata_submission/{ submission .id } " ,
509
- json = json . loads (payload ),
505
+ json = jsonable_encoder (payload , exclude_unset = True ),
510
506
)
511
507
assert response .status_code == 400
512
508
@@ -518,19 +514,20 @@ def test_try_edit_expired_locked_submission(db: Session, client: TestClient, log
518
514
author_orcid = logged_in_user .orcid ,
519
515
locked_by = fakes .UserFactory (),
520
516
lock_updated = datetime .now (tz = UTC ) - timedelta (hours = 1 ),
521
- date_last_modified = datetime .now (tz = UTC ),
522
517
)
523
518
fakes .SubmissionRoleFactory (
524
519
submission = submission ,
525
520
submission_id = submission .id ,
526
521
user_orcid = logged_in_user .orcid ,
527
522
role = SubmissionEditorRole .owner ,
528
523
)
529
- payload = SubmissionMetadataSchema ( ** submission . __dict__ ). json ( exclude_unset = True )
524
+ payload = SubmissionMetadataSchema . model_validate ( submission )
530
525
db .commit ()
531
526
532
527
response = client .request (
533
- method = "patch" , url = f"/api/metadata_submission/{ submission .id } " , json = json .loads (payload )
528
+ method = "patch" ,
529
+ url = f"/api/metadata_submission/{ submission .id } " ,
530
+ json = jsonable_encoder (payload , exclude_unset = True ),
534
531
)
535
532
assert response .status_code == 200
536
533
@@ -543,36 +540,32 @@ def test_try_edit_locked_by_current_user_submission(
543
540
author_orcid = logged_in_user .orcid ,
544
541
locked_by = logged_in_user ,
545
542
lock_updated = datetime .now (tz = UTC ),
546
- date_last_modified = datetime .now (tz = UTC ),
547
543
)
548
544
fakes .SubmissionRoleFactory (
549
545
submission = submission ,
550
546
submission_id = submission .id ,
551
547
user_orcid = logged_in_user .orcid ,
552
548
role = SubmissionEditorRole .owner ,
553
549
)
554
- payload = SubmissionMetadataSchema ( ** submission . __dict__ ). json ( exclude_unset = True )
550
+ payload = SubmissionMetadataSchema . model_validate ( submission )
555
551
db .commit ()
556
552
557
553
response = client .request (
558
- method = "patch" , url = f"/api/metadata_submission/{ submission .id } " , json = json .loads (payload )
554
+ method = "patch" ,
555
+ url = f"/api/metadata_submission/{ submission .id } " ,
556
+ json = jsonable_encoder (payload , exclude_unset = True ),
559
557
)
560
558
assert response .status_code == 200
561
559
562
560
563
561
def test_submission_list_with_roles (db : Session , client : TestClient , logged_in_user ):
564
562
user_a = fakes .UserFactory ()
565
- submission_a = fakes .MetadataSubmissionFactory (
566
- author = user_a , author_orcid = user_a .orcid , date_last_modified = datetime .now (tz = UTC )
567
- )
563
+ submission_a = fakes .MetadataSubmissionFactory (author = user_a , author_orcid = user_a .orcid )
568
564
fakes .MetadataSubmissionFactory (
569
565
author = logged_in_user ,
570
566
author_orcid = logged_in_user .orcid ,
571
- date_last_modified = datetime .now (tz = UTC ),
572
- )
573
- fakes .MetadataSubmissionFactory (
574
- author = user_a , author_orcid = user_a .orcid , date_last_modified = datetime .now (tz = UTC )
575
567
)
568
+ fakes .MetadataSubmissionFactory (author = user_a , author_orcid = user_a .orcid )
576
569
db .commit ()
577
570
fakes .SubmissionRoleFactory (
578
571
submission = submission_a ,
@@ -593,13 +586,13 @@ def test_submission_list_with_roles(db: Session, client: TestClient, logged_in_u
593
586
@pytest .mark .parametrize ("role,code" , [(SubmissionEditorRole .owner , 200 ), (None , 403 )])
594
587
def test_get_submission_with_roles (db : Session , client : TestClient , logged_in_user , role , code ):
595
588
if role == SubmissionEditorRole .owner :
596
- submission = fakes .MetadataSubmissionFactory (date_last_modified = datetime . now ( tz = UTC ) )
589
+ submission = fakes .MetadataSubmissionFactory ()
597
590
db .commit ()
598
591
role = fakes .SubmissionRoleFactory (
599
592
submission = submission , submission_id = submission .id , user_orcid = logged_in_user .orcid
600
593
)
601
594
else :
602
- submission = fakes .MetadataSubmissionFactory (date_last_modified = datetime . now ( tz = UTC ) )
595
+ submission = fakes .MetadataSubmissionFactory ()
603
596
db .commit ()
604
597
response = client .request (method = "get" , url = f"/api/metadata_submission/{ submission .id } " )
605
598
assert response .status_code == code
@@ -608,20 +601,22 @@ def test_get_submission_with_roles(db: Session, client: TestClient, logged_in_us
608
601
@pytest .mark .parametrize ("role,code" , [(SubmissionEditorRole .owner , 200 ), (None , 403 )])
609
602
def test_edit_submission_with_roles (db : Session , client : TestClient , logged_in_user , role , code ):
610
603
if role == SubmissionEditorRole .owner :
611
- submission = fakes .MetadataSubmissionFactory (date_last_modified = datetime . now ( tz = UTC ) )
612
- payload = SubmissionMetadataSchema ( ** submission . __dict__ ). json ( )
604
+ submission = fakes .MetadataSubmissionFactory ()
605
+ payload = SubmissionMetadataSchema . model_validate ( submission )
613
606
db .commit ()
614
607
role = fakes .SubmissionRoleFactory (
615
608
submission = submission ,
616
609
submission_id = submission .id ,
617
610
user_orcid = logged_in_user .orcid ,
618
611
)
619
612
else :
620
- submission = fakes .MetadataSubmissionFactory (date_last_modified = datetime . now ( tz = UTC ) )
621
- payload = SubmissionMetadataSchema ( ** submission . __dict__ ). json ( )
613
+ submission = fakes .MetadataSubmissionFactory ()
614
+ payload = SubmissionMetadataSchema . model_validate ( submission )
622
615
db .commit ()
623
616
response = client .request (
624
- method = "patch" , url = f"/api/metadata_submission/{ submission .id } " , json = json .loads (payload )
617
+ method = "patch" ,
618
+ url = f"/api/metadata_submission/{ submission .id } " ,
619
+ json = jsonable_encoder (payload ),
625
620
)
626
621
assert response .status_code == code
627
622
@@ -641,7 +636,7 @@ def test_create_role_on_patch(db: Session, client: TestClient, logged_in_user):
641
636
response = client .request (
642
637
method = "patch" ,
643
638
url = f"/api/metadata_submission/{ submission .id } " ,
644
- json = json . loads (payload . json () ),
639
+ json = jsonable_encoder (payload ),
645
640
)
646
641
assert response .status_code == 200
647
642
@@ -667,22 +662,24 @@ def test_piecewise_patch_metadata_contributor(
667
662
user_orcid = logged_in_user .orcid ,
668
663
role = SubmissionEditorRole .metadata_contributor ,
669
664
)
670
- full_payload = SubmissionMetadataSchemaPatch ( ** submission . __dict__ )
665
+ full_payload = SubmissionMetadataSchemaPatch . model_validate ( submission )
671
666
db .commit ()
672
667
673
668
if samples_only :
674
669
request_dict = {
675
670
"metadata_submission" : {"sampleData" : full_payload .metadata_submission .sampleData }
676
671
}
677
- request_payload = SubmissionMetadataSchemaPatch (** request_dict ).json (exclude_unset = True )
672
+ request_payload = jsonable_encoder (
673
+ SubmissionMetadataSchemaPatch .model_validate (request_dict ), exclude_unset = True
674
+ )
678
675
else :
679
- request_payload = full_payload . json ( )
676
+ request_payload = jsonable_encoder ( full_payload )
680
677
681
678
# Logged in user should not be able to submit full payload because it contains non-sample data
682
679
response = client .request (
683
680
method = "patch" ,
684
681
url = f"/api/metadata_submission/{ submission .id } " ,
685
- json = json . loads ( request_payload ) ,
682
+ json = request_payload ,
686
683
)
687
684
assert response .status_code == code
688
685
@@ -709,15 +706,15 @@ def test_delete_role_on_patch(db: Session, client: TestClient, logged_in_user):
709
706
user_orcid = user_orcid ,
710
707
role = SubmissionEditorRole .viewer ,
711
708
)
712
- payload = SubmissionMetadataSchemaPatch ( ** submission . __dict__ )
709
+ payload = SubmissionMetadataSchemaPatch . model_validate ( submission )
713
710
db .commit ()
714
711
715
712
payload .permissions = {}
716
713
717
714
response = client .request (
718
715
method = "patch" ,
719
716
url = f"/api/metadata_submission/{ submission .id } " ,
720
- json = json . loads (payload . json () ),
717
+ json = jsonable_encoder (payload ),
721
718
)
722
719
assert response .status_code == 200
723
720
roles = db .query (SubmissionRole )
@@ -742,14 +739,14 @@ def test_update_role_on_patch(db: Session, client: TestClient, logged_in_user):
742
739
user_orcid = user_orcid ,
743
740
role = SubmissionEditorRole .viewer ,
744
741
)
745
- payload = SubmissionMetadataSchemaPatch ( ** submission . __dict__ )
742
+ payload = SubmissionMetadataSchemaPatch . model_validate ( submission )
746
743
db .commit ()
747
744
748
745
payload .permissions = {str (user_orcid ): SubmissionEditorRole .editor .value }
749
746
response = client .request (
750
747
method = "patch" ,
751
748
url = f"/api/metadata_submission/{ submission .id } " ,
752
- json = json . loads (payload . json () ),
749
+ json = jsonable_encoder (payload ),
753
750
)
754
751
assert response .status_code == 200
755
752
roles = db .query (SubmissionRole ).filter (SubmissionRole .user_orcid == str (user_orcid ))
@@ -844,8 +841,8 @@ def test_sync_submission_templates(db: Session, client: TestClient, logged_in_us
844
841
user_orcid = logged_in_user .orcid ,
845
842
role = SubmissionEditorRole .owner ,
846
843
)
847
- payload = json . loads (
848
- SubmissionMetadataSchemaPatch ( ** submission . __dict__ ). json ( exclude_unset = True )
844
+ payload = jsonable_encoder (
845
+ SubmissionMetadataSchemaPatch . model_validate ( submission ), exclude_unset = True
849
846
)
850
847
payload ["metadata_submission" ]["templates" ] = [template ]
851
848
db .commit ()
@@ -873,8 +870,8 @@ def test_sync_submission_study_name(db: Session, client: TestClient, logged_in_u
873
870
user_orcid = logged_in_user .orcid ,
874
871
role = SubmissionEditorRole .owner ,
875
872
)
876
- payload = json . loads (
877
- SubmissionMetadataSchemaPatch ( ** submission . __dict__ ). json ( exclude_unset = True )
873
+ payload = jsonable_encoder (
874
+ SubmissionMetadataSchemaPatch . model_validate ( submission ), exclude_unset = True
878
875
)
879
876
payload ["metadata_submission" ]["studyForm" ]["studyName" ] = expected_val
880
877
db .commit ()
0 commit comments