@@ -713,6 +713,97 @@ def test_get_own_private_score_set(client, setup_router_db):
713713 assert (key , expected_response [key ]) == (key , response_data [key ])
714714
715715
716+ def test_cannot_get_other_user_private_score_set (session , client , setup_router_db ):
717+ experiment = create_experiment (client )
718+ score_set = create_seq_score_set (client , experiment ["urn" ])
719+ change_ownership (session , score_set ["urn" ], ScoreSetDbModel )
720+ response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
721+ assert response .status_code == 404
722+ response_data = response .json ()
723+ assert f"score set with URN '{ score_set ['urn' ]} ' not found" in response_data ["detail" ]
724+
725+
726+ def test_anonymous_user_cannot_get_user_private_score_set (session , client , setup_router_db , anonymous_app_overrides ):
727+ experiment = create_experiment (client )
728+ score_set = create_seq_score_set (client , experiment ["urn" ])
729+ change_ownership (session , score_set ["urn" ], ScoreSetDbModel )
730+ with DependencyOverrider (anonymous_app_overrides ):
731+ response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
732+
733+ assert response .status_code == 404
734+ response_data = response .json ()
735+ assert f"score set with URN '{ score_set ['urn' ]} ' not found" in response_data ["detail" ]
736+
737+
738+ def test_contributor_can_get_other_users_private_score_set (session , client , setup_router_db ):
739+ experiment = create_experiment (client )
740+ score_set = create_seq_score_set (client , experiment ["urn" ])
741+ change_ownership (session , score_set ["urn" ], ScoreSetDbModel )
742+ add_contributor (
743+ session ,
744+ score_set ["urn" ],
745+ ScoreSetDbModel ,
746+ TEST_USER ["username" ],
747+ TEST_USER ["first_name" ],
748+ TEST_USER ["last_name" ],
749+ )
750+
751+ expected_response = update_expected_response_for_created_resources (
752+ deepcopy (TEST_MINIMAL_SEQ_SCORESET_RESPONSE ), experiment , score_set
753+ )
754+ expected_response ["contributors" ] = [
755+ {
756+ "recordType" : "Contributor" ,
757+ "orcidId" : TEST_USER ["username" ],
758+ "givenName" : TEST_USER ["first_name" ],
759+ "familyName" : TEST_USER ["last_name" ],
760+ }
761+ ]
762+ expected_response ["createdBy" ] = {
763+ "recordType" : "User" ,
764+ "orcidId" : EXTRA_USER ["username" ],
765+ "firstName" : EXTRA_USER ["first_name" ],
766+ "lastName" : EXTRA_USER ["last_name" ],
767+ }
768+ expected_response ["modifiedBy" ] = {
769+ "recordType" : "User" ,
770+ "orcidId" : EXTRA_USER ["username" ],
771+ "firstName" : EXTRA_USER ["first_name" ],
772+ "lastName" : EXTRA_USER ["last_name" ],
773+ }
774+ expected_response ["experiment" ].update ({"numScoreSets" : 1 })
775+
776+ response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
777+ assert response .status_code == 200
778+ response_data = response .json ()
779+
780+ assert sorted (expected_response .keys ()) == sorted (response_data .keys ())
781+ for key in expected_response :
782+ assert (key , expected_response [key ]) == (key , response_data [key ])
783+
784+
785+ def test_admin_can_get_other_user_private_score_set (session , client , admin_app_overrides , setup_router_db ):
786+ experiment = create_experiment (client )
787+ score_set = create_seq_score_set (client , experiment ["urn" ])
788+ expected_response = update_expected_response_for_created_resources (
789+ deepcopy (TEST_MINIMAL_SEQ_SCORESET_RESPONSE ), experiment , score_set
790+ )
791+ expected_response ["experiment" ].update ({"numScoreSets" : 1 })
792+ with DependencyOverrider (admin_app_overrides ):
793+ response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
794+
795+ assert response .status_code == 200
796+ response_data = response .json ()
797+ assert sorted (expected_response .keys ()) == sorted (response_data .keys ())
798+ for key in expected_response :
799+ assert (key , expected_response [key ]) == (key , response_data [key ])
800+
801+
802+ ########################################################################################################################
803+ # Multiple score set fetching
804+ ########################################################################################################################
805+
806+
716807def test_get_score_sets_by_comma_separated_urns (client , setup_router_db ):
717808 experiment = create_experiment (client )
718809 first_score_set = create_seq_score_set (client , experiment ["urn" ])
@@ -763,26 +854,94 @@ def test_get_score_sets_with_whitespace_around_urns_in_mixed_list_returns_404(cl
763854 assert response .json ()["detail" ] == f"score set with URN '{ missing_urn } ' not found"
764855
765856
766- def test_cannot_get_other_user_private_score_set (session , client , setup_router_db ):
857+ def test_show_score_sets_anonymous_can_fetch_public_score_sets (
858+ session , client , setup_router_db , anonymous_app_overrides , data_provider , data_files
859+ ):
767860 experiment = create_experiment (client )
768861 score_set = create_seq_score_set (client , experiment ["urn" ])
862+ score_set = mock_worker_variant_insertion (client , session , data_provider , score_set , data_files / "scores.csv" )
863+ with patch .object (arq .ArqRedis , "enqueue_job" , return_value = None ):
864+ published_score_set = publish_score_set (client , score_set ["urn" ])
865+
866+ with DependencyOverrider (anonymous_app_overrides ):
867+ response = client .get (
868+ "/api/v1/score-sets/" ,
869+ params = {"urns" : published_score_set ["urn" ]},
870+ )
871+
872+ assert response .status_code == 200
873+ response_data = response .json ()
874+ assert len (response_data ) == 1
875+ assert response_data [0 ]["urn" ] == published_score_set ["urn" ]
876+
877+
878+ def test_show_score_sets_anonymous_cannot_fetch_private_score_sets (session , client , setup_router_db , anonymous_app_overrides ):
879+ experiment = create_experiment (client )
880+ score_set = create_seq_score_set (client , experiment ["urn" ])
881+ # Score set is private (not published); change ownership so it belongs to another user
769882 change_ownership (session , score_set ["urn" ], ScoreSetDbModel )
770- response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
883+
884+ with DependencyOverrider (anonymous_app_overrides ):
885+ response = client .get (
886+ "/api/v1/score-sets/" ,
887+ params = {"urns" : score_set ["urn" ]},
888+ )
889+
771890 assert response .status_code == 404
891+ assert f"score set with URN '{ score_set ['urn' ]} ' not found" in response .json ()["detail" ]
892+
893+
894+ def test_show_score_sets_authenticated_user_can_fetch_own_private_score_sets (client , setup_router_db ):
895+ experiment = create_experiment (client )
896+ score_set = create_seq_score_set (client , experiment ["urn" ])
897+
898+ response = client .get (
899+ "/api/v1/score-sets/" ,
900+ params = {"urns" : score_set ["urn" ]},
901+ )
902+
903+ assert response .status_code == 200
772904 response_data = response .json ()
773- assert f"score set with URN '{ score_set ['urn' ]} ' not found" in response_data ["detail" ]
905+ assert len (response_data ) == 1
906+ assert response_data [0 ]["urn" ] == score_set ["urn" ]
774907
775908
776- def test_anonymous_user_cannot_get_user_private_score_set (session , client , setup_router_db , anonymous_app_overrides ):
909+ def test_show_score_sets_authenticated_user_cannot_fetch_other_users_private_score_sets (
910+ session , client , setup_router_db
911+ ):
777912 experiment = create_experiment (client )
778913 score_set = create_seq_score_set (client , experiment ["urn" ])
779914 change_ownership (session , score_set ["urn" ], ScoreSetDbModel )
915+
916+ response = client .get (
917+ "/api/v1/score-sets/" ,
918+ params = {"urns" : score_set ["urn" ]},
919+ )
920+
921+ assert response .status_code == 404
922+ assert f"score set with URN '{ score_set ['urn' ]} ' not found" in response .json ()["detail" ]
923+
924+
925+ def test_show_score_sets_mixed_public_and_private_returns_404 (
926+ session , client , setup_router_db , anonymous_app_overrides , data_provider , data_files
927+ ):
928+ experiment = create_experiment (client )
929+ public_score_set = create_seq_score_set (client , experiment ["urn" ])
930+ public_score_set = mock_worker_variant_insertion (client , session , data_provider , public_score_set , data_files / "scores.csv" )
931+ private_score_set = create_seq_score_set (client , experiment ["urn" ])
932+ with patch .object (arq .ArqRedis , "enqueue_job" , return_value = None ):
933+ published_score_set = publish_score_set (client , public_score_set ["urn" ])
934+ # Make private_score_set belong to a different user to make it inaccessible anonymously
935+ change_ownership (session , private_score_set ["urn" ], ScoreSetDbModel )
936+
780937 with DependencyOverrider (anonymous_app_overrides ):
781- response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
938+ response = client .get (
939+ "/api/v1/score-sets/" ,
940+ params = {"urns" : f"{ published_score_set ['urn' ]} ,{ private_score_set ['urn' ]} " },
941+ )
782942
783943 assert response .status_code == 404
784- response_data = response .json ()
785- assert f"score set with URN '{ score_set ['urn' ]} ' not found" in response_data ["detail" ]
944+ assert f"score set with URN '{ private_score_set ['urn' ]} ' not found" in response .json ()["detail" ]
786945
787946
788947def test_can_add_contributor_in_both_experiment_and_score_set (session , client , setup_router_db ):
@@ -818,70 +977,6 @@ def test_can_add_contributor_in_both_experiment_and_score_set(session, client, s
818977 assert any (c ["orcidId" ] == TEST_USER ["username" ] for c in exp_response_data ["contributors" ])
819978
820979
821- def test_contributor_can_get_other_users_private_score_set (session , client , setup_router_db ):
822- experiment = create_experiment (client )
823- score_set = create_seq_score_set (client , experiment ["urn" ])
824- change_ownership (session , score_set ["urn" ], ScoreSetDbModel )
825- add_contributor (
826- session ,
827- score_set ["urn" ],
828- ScoreSetDbModel ,
829- TEST_USER ["username" ],
830- TEST_USER ["first_name" ],
831- TEST_USER ["last_name" ],
832- )
833-
834- expected_response = update_expected_response_for_created_resources (
835- deepcopy (TEST_MINIMAL_SEQ_SCORESET_RESPONSE ), experiment , score_set
836- )
837- expected_response ["contributors" ] = [
838- {
839- "recordType" : "Contributor" ,
840- "orcidId" : TEST_USER ["username" ],
841- "givenName" : TEST_USER ["first_name" ],
842- "familyName" : TEST_USER ["last_name" ],
843- }
844- ]
845- expected_response ["createdBy" ] = {
846- "recordType" : "User" ,
847- "orcidId" : EXTRA_USER ["username" ],
848- "firstName" : EXTRA_USER ["first_name" ],
849- "lastName" : EXTRA_USER ["last_name" ],
850- }
851- expected_response ["modifiedBy" ] = {
852- "recordType" : "User" ,
853- "orcidId" : EXTRA_USER ["username" ],
854- "firstName" : EXTRA_USER ["first_name" ],
855- "lastName" : EXTRA_USER ["last_name" ],
856- }
857- expected_response ["experiment" ].update ({"numScoreSets" : 1 })
858-
859- response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
860- assert response .status_code == 200
861- response_data = response .json ()
862-
863- assert sorted (expected_response .keys ()) == sorted (response_data .keys ())
864- for key in expected_response :
865- assert (key , expected_response [key ]) == (key , response_data [key ])
866-
867-
868- def test_admin_can_get_other_user_private_score_set (session , client , admin_app_overrides , setup_router_db ):
869- experiment = create_experiment (client )
870- score_set = create_seq_score_set (client , experiment ["urn" ])
871- expected_response = update_expected_response_for_created_resources (
872- deepcopy (TEST_MINIMAL_SEQ_SCORESET_RESPONSE ), experiment , score_set
873- )
874- expected_response ["experiment" ].update ({"numScoreSets" : 1 })
875- with DependencyOverrider (admin_app_overrides ):
876- response = client .get (f"/api/v1/score-sets/{ score_set ['urn' ]} " )
877-
878- assert response .status_code == 200
879- response_data = response .json ()
880- assert sorted (expected_response .keys ()) == sorted (response_data .keys ())
881- for key in expected_response :
882- assert (key , expected_response [key ]) == (key , response_data [key ])
883-
884-
885980@pytest .mark .parametrize (
886981 "mock_publication_fetch" ,
887982 [
0 commit comments