|
7 | 7 | import pytest |
8 | 8 | from arq import ArqRedis |
9 | 9 | from humps import camelize |
| 10 | +from sqlalchemy import select |
10 | 11 |
|
11 | 12 | from mavedb.lib.validation.urn_re import MAVEDB_TMP_URN_RE, MAVEDB_SCORE_SET_URN_RE, MAVEDB_EXPERIMENT_URN_RE |
12 | 13 | from mavedb.models.enums.processing_state import ProcessingState |
13 | 14 | from mavedb.models.experiment import Experiment as ExperimentDbModel |
14 | 15 | from mavedb.models.score_set import ScoreSet as ScoreSetDbModel |
| 16 | +from mavedb.models.variant import Variant as VariantDbModel |
15 | 17 | from mavedb.view_models.orcid import OrcidUser |
16 | 18 | from mavedb.view_models.score_set import ScoreSet, ScoreSetCreate |
17 | 19 | from tests.helpers.constants import ( |
@@ -531,6 +533,59 @@ def test_add_score_set_variants_scores_and_counts_endpoint(session, client, setu |
531 | 533 | assert score_set == response_data |
532 | 534 |
|
533 | 535 |
|
| 536 | +def test_add_score_set_variants_scores_only_endpoint_utf8_encoded(client, setup_router_db, data_files): |
| 537 | + experiment = create_experiment(client) |
| 538 | + score_set = create_seq_score_set(client, experiment["urn"]) |
| 539 | + scores_csv_path = data_files / "scores_utf8_encoded.csv" |
| 540 | + with ( |
| 541 | + open(scores_csv_path, "rb") as scores_file, |
| 542 | + patch.object(ArqRedis, "enqueue_job", return_value=None) as queue, |
| 543 | + ): |
| 544 | + response = client.post( |
| 545 | + f"/api/v1/score-sets/{score_set['urn']}/variants/data", |
| 546 | + files={"scores_file": (scores_csv_path.name, scores_file, "text/csv")}, |
| 547 | + ) |
| 548 | + queue.assert_called_once() |
| 549 | + |
| 550 | + assert response.status_code == 200 |
| 551 | + response_data = response.json() |
| 552 | + jsonschema.validate(instance=response_data, schema=ScoreSet.schema()) |
| 553 | + |
| 554 | + # We test the worker process that actually adds the variant data separately. Here, we take it as |
| 555 | + # fact that it would have succeeded. |
| 556 | + score_set.update({"processingState": "processing"}) |
| 557 | + assert score_set == response_data |
| 558 | + |
| 559 | + |
| 560 | +def test_add_score_set_variants_scores_and_counts_endpoint_utf8_encoded(session, client, setup_router_db, data_files): |
| 561 | + experiment = create_experiment(client) |
| 562 | + score_set = create_seq_score_set(client, experiment["urn"]) |
| 563 | + scores_csv_path = data_files / "scores_utf8_encoded.csv" |
| 564 | + counts_csv_path = data_files / "counts_utf8_encoded.csv" |
| 565 | + with ( |
| 566 | + open(scores_csv_path, "rb") as scores_file, |
| 567 | + open(counts_csv_path, "rb") as counts_file, |
| 568 | + patch.object(ArqRedis, "enqueue_job", return_value=None) as queue, |
| 569 | + ): |
| 570 | + response = client.post( |
| 571 | + f"/api/v1/score-sets/{score_set['urn']}/variants/data", |
| 572 | + files={ |
| 573 | + "scores_file": (scores_csv_path.name, scores_file, "text/csv"), |
| 574 | + "counts_file": (counts_csv_path.name, counts_file, "text/csv"), |
| 575 | + }, |
| 576 | + ) |
| 577 | + queue.assert_called_once() |
| 578 | + |
| 579 | + assert response.status_code == 200 |
| 580 | + response_data = response.json() |
| 581 | + jsonschema.validate(instance=response_data, schema=ScoreSet.schema()) |
| 582 | + |
| 583 | + # We test the worker process that actually adds the variant data separately. Here, we take it as |
| 584 | + # fact that it would have succeeded. |
| 585 | + score_set.update({"processingState": "processing"}) |
| 586 | + assert score_set == response_data |
| 587 | + |
| 588 | + |
534 | 589 | def test_cannot_add_scores_to_score_set_without_email(session, client, setup_router_db, data_files): |
535 | 590 | experiment = create_experiment(client) |
536 | 591 | score_set = create_seq_score_set(client, experiment["urn"]) |
@@ -788,6 +843,11 @@ def test_publish_score_set(session, data_provider, client, setup_router_db, data |
788 | 843 | for key in expected_response: |
789 | 844 | assert (key, expected_response[key]) == (key, score_set[key]) |
790 | 845 |
|
| 846 | + score_set_variants = session.execute( |
| 847 | + select(VariantDbModel).join(ScoreSetDbModel).where(ScoreSetDbModel.urn == score_set["urn"]) |
| 848 | + ).scalars() |
| 849 | + assert all([variant.urn.startswith("urn:mavedb:") for variant in score_set_variants]) |
| 850 | + |
791 | 851 |
|
792 | 852 | def test_publish_multiple_score_sets(session, data_provider, client, setup_router_db, data_files): |
793 | 853 | experiment = create_experiment(client) |
@@ -820,6 +880,19 @@ def test_publish_multiple_score_sets(session, data_provider, client, setup_route |
820 | 880 | assert pub_score_set_3_data["title"] == score_set_3["title"] |
821 | 881 | assert pub_score_set_3_data["experiment"]["urn"] == "urn:mavedb:00000001-a" |
822 | 882 |
|
| 883 | + score_set_1_variants = session.execute( |
| 884 | + select(VariantDbModel).join(ScoreSetDbModel).where(ScoreSetDbModel.urn == score_set_1["urn"]) |
| 885 | + ).scalars() |
| 886 | + assert all([variant.urn.startswith("urn:mavedb:") for variant in score_set_1_variants]) |
| 887 | + score_set_2_variants = session.execute( |
| 888 | + select(VariantDbModel).join(ScoreSetDbModel).where(ScoreSetDbModel.urn == score_set_2["urn"]) |
| 889 | + ).scalars() |
| 890 | + assert all([variant.urn.startswith("urn:mavedb:") for variant in score_set_2_variants]) |
| 891 | + score_set_3_variants = session.execute( |
| 892 | + select(VariantDbModel).join(ScoreSetDbModel).where(ScoreSetDbModel.urn == score_set_3["urn"]) |
| 893 | + ).scalars() |
| 894 | + assert all([variant.urn.startswith("urn:mavedb:") for variant in score_set_3_variants]) |
| 895 | + |
823 | 896 |
|
824 | 897 | def test_cannot_publish_score_set_without_variants(client, setup_router_db): |
825 | 898 | experiment = create_experiment(client) |
@@ -917,6 +990,11 @@ def test_contributor_can_publish_other_users_score_set(session, data_provider, c |
917 | 990 | for key in expected_response: |
918 | 991 | assert (key, expected_response[key]) == (key, score_set[key]) |
919 | 992 |
|
| 993 | + score_set_variants = session.execute( |
| 994 | + select(VariantDbModel).join(ScoreSetDbModel).where(ScoreSetDbModel.urn == score_set["urn"]) |
| 995 | + ).scalars() |
| 996 | + assert all([variant.urn.startswith("urn:mavedb:") for variant in score_set_variants]) |
| 997 | + |
920 | 998 |
|
921 | 999 | def test_admin_cannot_publish_other_user_private_score_set( |
922 | 1000 | session, data_provider, client, admin_app_overrides, setup_router_db, data_files |
|
0 commit comments