-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #83 from c3g/develop
Release v0.5.1
- Loading branch information
Showing
13 changed files
with
440 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,234 @@ | ||
EXAMPLE_INGEST = { | ||
"subject": { | ||
"id": "patient1", | ||
"date_of_birth": "1964-03-15T00:00:00Z", | ||
"sex": "MALE", | ||
"karyotypic_sex": "UNKNOWN_KARYOTYPE" | ||
}, | ||
"phenotypic_features": [ | ||
{ | ||
"description": "", | ||
"type": { | ||
"id": "HP:0000790", | ||
"label": "Hematuria" | ||
}, | ||
"negated": False, | ||
"modifier": [], | ||
"evidence": [] | ||
}, | ||
{ | ||
"description": "", | ||
"type": { | ||
"id": "HP:0100518", | ||
"label": "Dysuria" | ||
}, | ||
"negated": False, | ||
"severity": { | ||
"id": "HP:0012828", | ||
"label": "Severe" | ||
}, | ||
"modifier": [], | ||
"evidence": [] | ||
} | ||
], | ||
"diseases": [ | ||
{ | ||
"term": { | ||
"id": "NCIT:C39853", | ||
"label": "Infiltrating Urothelial Carcinoma" | ||
}, | ||
"disease_stage": [ | ||
{ | ||
"id": "NCIT:C48766", | ||
"label": "pT2b Stage Finding" | ||
}, | ||
{ | ||
"id": "NCIT:C48750", | ||
"label": "pN2 Stage Finding" | ||
} | ||
] | ||
} | ||
], | ||
"meta_data": { | ||
"created": "2019-04-03T15:31:40.765Z", | ||
"created_by": "Peter R", | ||
"submitted_by": "Peter R", | ||
"resources": [ | ||
{ | ||
"id": "hp", | ||
"name": "human phenotype ontology", | ||
"namespace_prefix": "HP", | ||
"url": "http://purl.obolibrary.org/obo/hp.owl", | ||
"version": "2019-04-08", | ||
"iri_prefix": "http://purl.obolibrary.org/obo/HP_" | ||
}, | ||
{ | ||
"id": "uberon", | ||
"name": "uber anatomy ontology", | ||
"namespace_prefix": "UBERON", | ||
"url": "http://purl.obolibrary.org/obo/uberon.owl", | ||
"version": "2019-03-08", | ||
"iri_prefix": "http://purl.obolibrary.org/obo/UBERON_" | ||
}, | ||
{ | ||
"id": "ncit", | ||
"name": "NCI Thesaurus OBO Edition", | ||
"namespace_prefix": "NCIT", | ||
"url": "http://purl.obolibrary.org/obo/ncit.owl", | ||
"version": "18.05d", | ||
"iri_prefix": "http://purl.obolibrary.org/obo/NCIT_" | ||
} | ||
], | ||
"updated": [], | ||
"external_references": [ | ||
{ | ||
"id": "PMID:29221636", | ||
"description": "Urothelial neoplasms in pediatric and young adult patients: A large single-center " | ||
"series" | ||
} | ||
] | ||
}, | ||
"biosamples": [ | ||
{ | ||
"id": "sample1", | ||
"individual_id": "patient1", | ||
"description": "", | ||
"sampled_tissue": { | ||
"id": "UBERON_0001256", | ||
"label": "wall of urinary bladder" | ||
}, | ||
"phenotypic_features": [], | ||
"individual_age_at_collection": { | ||
"age": "P52Y2M" | ||
}, | ||
"histological_diagnosis": { | ||
"id": "NCIT:C39853", | ||
"label": "Infiltrating Urothelial Carcinoma" | ||
}, | ||
"tumor_progression": { | ||
"id": "NCIT:C84509", | ||
"label": "Primary Malignant Neoplasm" | ||
}, | ||
"diagnostic_markers": [], | ||
"procedure": { | ||
"code": { | ||
"id": "NCIT:C5189", | ||
"label": "Radical Cystoprostatectomy" | ||
} | ||
}, | ||
"is_control_sample": False | ||
}, | ||
{ | ||
"id": "sample2", | ||
"individual_id": "patient1", | ||
"description": "", | ||
"sampled_tissue": { | ||
"id": "UBERON:0002367", | ||
"label": "prostate gland" | ||
}, | ||
"phenotypic_features": [], | ||
"individual_age_at_collection": { | ||
"age": "P52Y2M" | ||
}, | ||
"histological_diagnosis": { | ||
"id": "NCIT:C5596", | ||
"label": "Prostate Acinar Adenocarcinoma" | ||
}, | ||
"tumor_progression": { | ||
"id": "NCIT:C95606", | ||
"label": "Second Primary Malignant Neoplasm" | ||
}, | ||
"tumor_grade": { | ||
"id": "NCIT:C28091", | ||
"label": "Gleason Score 7" | ||
}, | ||
"disease_stage": [], | ||
"diagnostic_markers": [], | ||
"procedure": { | ||
"code": { | ||
"id": "NCIT:C15189", | ||
"label": "Biopsy" | ||
} | ||
}, | ||
"is_control_sample": False | ||
}, | ||
{ | ||
"id": "sample3", | ||
"individual_id": "patient1", | ||
"description": "", | ||
"sampled_tissue": { | ||
"id": "UBERON:0001223", | ||
"label": "left ureter" | ||
}, | ||
"phenotypic_features": [], | ||
"individual_age_at_collection": { | ||
"age": "P52Y2M" | ||
}, | ||
"histological_diagnosis": { | ||
"id": "NCIT:C38757", | ||
"label": "Negative Finding" | ||
}, | ||
"disease_stage": [], | ||
"diagnostic_markers": [], | ||
"procedure": { | ||
"code": { | ||
"id": "NCIT:C15189", | ||
"label": "Biopsy" | ||
} | ||
}, | ||
"is_control_sample": False | ||
}, | ||
{ | ||
"id": "sample4", | ||
"individual_id": "patient1", | ||
"description": "", | ||
"sampled_tissue": { | ||
"id": "UBERON:0001222", | ||
"label": "right ureter" | ||
}, | ||
"phenotypic_features": [], | ||
"individual_age_at_collection": { | ||
"age": "P52Y2M" | ||
}, | ||
"histological_diagnosis": { | ||
"id": "NCIT:C38757", | ||
"label": "Negative Finding" | ||
}, | ||
"disease_stage": [], | ||
"diagnostic_markers": [], | ||
"procedure": { | ||
"code": { | ||
"id": "NCIT:C15189", | ||
"label": "Biopsy" | ||
} | ||
}, | ||
"is_control_sample": False | ||
}, | ||
{ | ||
"id": "sample5", | ||
"individual_id": "patient1", | ||
"description": "", | ||
"sampled_tissue": { | ||
"id": "UBERON:0015876", | ||
"label": "pelvic lymph node" | ||
}, | ||
"phenotypic_features": [], | ||
"individual_age_at_collection": { | ||
"age": "P52Y2M" | ||
}, | ||
"tumor_progression": { | ||
"id": "NCIT:C3261", | ||
"label": "Metastatic Neoplasm" | ||
}, | ||
"disease_stage": [], | ||
"diagnostic_markers": [], | ||
"procedure": { | ||
"code": { | ||
"id": "NCIT:C15189", | ||
"label": "Biopsy" | ||
} | ||
}, | ||
"is_control_sample": False | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
import json | ||
|
||
from django.test import override_settings | ||
from django.urls import reverse | ||
from rest_framework import status | ||
from rest_framework.test import APITestCase | ||
from uuid import uuid4 | ||
|
||
from .constants import * | ||
from ..views_ingest import METADATA_WORKFLOWS | ||
|
||
|
||
def generate_ingest(table_id): | ||
return { | ||
"table_id": table_id, | ||
"workflow_id": "phenopackets_json", | ||
"workflow_metadata": METADATA_WORKFLOWS["ingestion"]["phenopackets_json"], | ||
"workflow_outputs": { | ||
"json_document": "" # TODO | ||
}, | ||
"workflow_params": { | ||
"json_document": "" # TODO | ||
} | ||
} | ||
|
||
|
||
class WorkflowTest(APITestCase): | ||
def test_workflows(self): | ||
r = self.client.get(reverse("workflows"), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_200_OK) | ||
self.assertDictEqual(r.json(), METADATA_WORKFLOWS) | ||
|
||
# Non-existent workflow | ||
r = self.client.get(reverse("workflow-detail", args=("invalid_workflow",)), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_404_NOT_FOUND) | ||
|
||
# Valid workflow | ||
r = self.client.get(reverse("workflow-detail", args=("phenopackets_json",)), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_200_OK) | ||
self.assertDictEqual(r.json(), METADATA_WORKFLOWS["ingestion"]["phenopackets_json"]) | ||
|
||
# Non-existent workflow file | ||
r = self.client.get(reverse("workflow-file", args=("invalid_workflow",)), content_type="text/plain") | ||
self.assertEqual(r.status_code, status.HTTP_404_NOT_FOUND) | ||
|
||
# Valid workflow file | ||
r = self.client.get(reverse("workflow-file", args=("phenopackets_json",)), content_type="text/plain") | ||
self.assertEqual(r.status_code, status.HTTP_200_OK) | ||
# TODO: Check file contents | ||
|
||
|
||
class IngestTest(APITestCase): | ||
@override_settings(AUTH_OVERRIDE=True) # For permissions | ||
def setUp(self) -> None: | ||
r = self.client.post(reverse("project-list"), data=json.dumps(VALID_PROJECT_1), content_type="application/json") | ||
self.project = r.json() | ||
|
||
r = self.client.post(reverse("dataset-list"), data=json.dumps(valid_dataset_1(self.project["identifier"])), | ||
content_type="application/json") | ||
self.dataset = r.json() | ||
|
||
@override_settings(AUTH_OVERRIDE=True) # For permissions | ||
def test_ingest(self): | ||
# No ingestion body | ||
r = self.client.post(reverse("ingest"), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_400_BAD_REQUEST) | ||
|
||
# Invalid ingestion request | ||
r = self.client.post(reverse("ingest"), data=json.dumps({}), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_400_BAD_REQUEST) | ||
|
||
# Non-existent dataset ID | ||
r = self.client.post(reverse("ingest"), data=json.dumps(generate_ingest(str(uuid4()))), | ||
content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_400_BAD_REQUEST) | ||
|
||
# Non-existent workflow ID | ||
bad_wf = generate_ingest(self.dataset["identifier"]) | ||
bad_wf["workflow_id"] += "_invalid" | ||
r = self.client.post(reverse("ingest"), data=json.dumps(bad_wf), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_400_BAD_REQUEST) | ||
|
||
# json_document not in output | ||
bad_wf = generate_ingest(self.dataset["identifier"]) | ||
bad_wf["workflow_outputs"] = {} | ||
r = self.client.post(reverse("ingest"), data=json.dumps(bad_wf), content_type="application/json") | ||
self.assertEqual(r.status_code, status.HTTP_400_BAD_REQUEST) | ||
|
||
# TODO: More |
Oops, something went wrong.