Skip to content

Commit 3aaecfa

Browse files
committed
Unit tests of API-level authorization when getting multiple score sets
1 parent 4462d60 commit 3aaecfa

1 file changed

Lines changed: 166 additions & 71 deletions

File tree

tests/routers/test_score_set.py

Lines changed: 166 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
716807
def 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

788947
def 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

Comments
 (0)