def test_remove_publication(self): """Remove a publication to a gene panel entry""" gpes = GenePanelEntrySnapshotFactory( penetrance=GenePanelEntrySnapshot.PENETRANCE.Incomplete) gpes.publications = [fake.sentence(), fake.sentence()] gpes.save() url = reverse_lazy('panels:edit_entity', kwargs={ 'pk': gpes.panel.panel.pk, 'entity_type': 'gene', 'entity_name': gpes.gene.get('gene_symbol') }) gene_data = { "gene": gpes.gene_core.pk, "gene_name": "Gene name", "source": set([ev.name for ev in gpes.evidence.all()]), "tags": [tag.pk for tag in gpes.tags.all()], "publications": ";".join(gpes.publications[:1]), "phenotypes": ";".join([phenotype for phenotype in gpes.phenotypes]), "moi": gpes.moi, "mode_of_pathogenicity": gpes.mode_of_pathogenicity, "penetrance": GenePanelEntrySnapshot.PENETRANCE.Complete, } res = self.client.post(url, gene_data) assert res.status_code == 302 gene = GenePanel.objects.get( pk=gpes.panel.panel.pk).active_panel.get_gene( gpes.gene_core.gene_symbol) assert gene.publications == gpes.publications[:1]
class TestWebservices(TransactionTestCase): def setUp(self): super().setUp() self.gps = GenePanelSnapshotFactory(panel__status=GenePanel.STATUS.public) self.gps_public = GenePanelSnapshotFactory(panel__status=GenePanel.STATUS.public) self.gpes = GenePanelEntrySnapshotFactory(panel=self.gps_public) self.gpes_internal = GenePanelEntrySnapshotFactory(panel__panel__status=GenePanel.STATUS.internal) self.gpes_retired = GenePanelEntrySnapshotFactory(panel__panel__status=GenePanel.STATUS.retired) self.gpes_deleted = GenePanelEntrySnapshotFactory(panel__panel__status=GenePanel.STATUS.deleted) self.genes = GenePanelEntrySnapshotFactory.create_batch(4, panel=self.gps) self.str = STRFactory(panel__panel__status=GenePanel.STATUS.public) self.region = RegionFactory(panel__panel__status=GenePanel.STATUS.public) self.region2 = RegionFactory(panel__panel__status=GenePanel.STATUS.public, position_37=None) def test_list_panels(self): r = self.client.get(reverse_lazy('webservices:list_panels')) self.assertEqual(r.status_code, 200) def test_list_panels_name(self): url = reverse_lazy('webservices:list_panels') r = self.client.get("{}?Types=all".format(url)) self.assertEqual(len(r.json()['result']), 5) self.assertEqual(r.status_code, 200) def test_list_100k_rd_type(self): panel_type = PanelTypeFactory(slug='rare-disease-100k') self.gps.panel.types.add(panel_type) url = reverse_lazy('webservices:list_panels') r = self.client.get(url) self.assertEqual(len(r.json()['result']), 1) self.assertEqual(r.status_code, 200) def test_list_panels_filter_type(self): panel_type = PanelTypeFactory() self.gps.panel.types.add(panel_type) url = reverse_lazy('webservices:list_panels') r = self.client.get(url + '?Types=' + panel_type.slug) self.assertEqual(len(r.json()['result']), 1) self.assertEqual(r.json()['result'][0]['Name'], self.gps.panel.name) self.assertEqual(r.status_code, 200) def test_retired_panels(self): url = reverse_lazy('webservices:list_panels') self.gps.panel.status = GenePanel.STATUS.deleted self.gps.panel.save() r = self.client.get("{}?Types=all".format(url)) self.assertEqual(len(r.json()['result']), 4) self.assertEqual(r.status_code, 200) # Test deleted panels url = reverse_lazy('webservices:list_panels') r = self.client.get("{}?Retired=True&Types=all".format(url)) self.assertEqual(len(r.json()['result']), 5) # one for gpes via factory, 2nd - retired self.assertEqual(r.status_code, 200) # Test for unapproved panels self.gps_public.panel.status = GenePanel.STATUS.internal self.gps_public.panel.save() url = reverse_lazy('webservices:list_panels') r = self.client.get("{}?Retired=True&Types=all".format(url)) self.assertEqual(len(r.json()['result']), 4) # only retired panel will be visible self.assertEqual(r.status_code, 200) def test_internal_panel(self): self.gps.panel.status = GenePanel.STATUS.internal self.gps.panel.save() url = reverse_lazy('webservices:get_panel', args=(self.gps.panel.pk, )) r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertEqual(r.json(), ["Query Error: {} not found.".format(self.gps.panel.pk)]) self.gps.panel.active_panel.increment_version() del self.gps.panel.active_panel self.gps.panel.active_panel.increment_version() r = self.client.get("{}?version=0.1".format(url)) self.assertEqual(r.status_code, 200) self.assertIsNot(type(r.json()), list) self.assertIsNotNone(r.json().get('result')) def test_get_panel_name(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gpes.panel.panel.name,))) self.assertEqual(r.status_code, 200) def test_get_panel_name_deleted(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gpes_deleted.panel.panel.name,))) self.assertEqual(r.status_code, 200) self.assertEqual(r.json(), ["Query Error: {} not found.".format(self.gpes_deleted.panel.panel.name)]) def test_get_panel_internal(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gpes_internal.panel.panel.name,))) self.assertEqual(r.status_code, 200) self.assertEqual(r.json(), ["Query Error: {} not found.".format(self.gpes_internal.panel.panel.name)]) def test_get_panel_retired(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gpes_retired.panel.panel.name,))) self.assertEqual(r.status_code, 200) self.assertEqual(r.json(), ["Query Error: {} not found.".format(self.gpes_retired.panel.panel.name)]) def test_get_panel_pk(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gpes.panel.panel.pk,))) self.assertEqual(r.status_code, 200) def test_get_panel_version(self): self.gpes.panel.increment_version() del self.gpes.panel.panel.active_panel self.gpes.panel.panel.active_panel.increment_version() url = reverse_lazy('webservices:get_panel', args=(self.gpes.panel.panel.pk,)) r = self.client.get("{}?version=0.1".format(url)) self.assertEqual(r.status_code, 200) self.gps.panel.status = GenePanel.STATUS.retired self.gps.panel.save() url = reverse_lazy('webservices:get_panel', args=(self.gpes.panel.panel.pk,)) r = self.client.get("{}?version=0.1".format(url)) self.assertEqual(r.status_code, 200) self.assertTrue(b'Query Error' not in r.content) def test_panel_created_timestamp(self): self.gpes.panel.increment_version() url = reverse_lazy('webservices:list_panels') res = self.client.get("{}?Types=all".format(url)) # find gps panel title = self.gps_public.panel.name current_time = str(self.gps_public.created).replace('+00:00', 'Z').replace(' ', 'T') gps_panel = [r for r in res.json()['result'] if r['Name'] == title][0] self.assertEqual(gps_panel['CurrentCreated'], current_time) r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gps_public.panel.name,))).json() self.assertEqual(r['result']['Created'], current_time) def test_get_search_gene(self): url = reverse_lazy('webservices:search_genes', args=(self.gpes.gene_core.gene_symbol,)) r = self.client.get(url) self.assertEqual(r.status_code, 200) def test_search_by_gene(self): url = reverse_lazy('webservices:search_genes', args=(self.gpes.gene_core.gene_symbol,)) r = self.client.get(url) self.assertEqual(r.status_code, 200) r = self.client.get("{}?ModeOfInheritance={}".format(url, self.gpes.moi)) self.assertEqual(r.status_code, 200) r = self.client.get("{}?ModeOfPathogenicity={}".format(url, self.gpes.mode_of_pathogenicity)) self.assertEqual(r.status_code, 200) r = self.client.get("{}?LevelOfConfidence={}".format(url, self.gpes.saved_gel_status)) self.assertEqual(r.status_code, 200) r = self.client.get("{}?Penetrance={}".format(url, self.gpes.penetrance)) self.assertEqual(r.status_code, 200) r = self.client.get("{}?Evidences={}".format(url, self.gpes.evidence.first().name)) self.assertEqual(r.status_code, 200) r = self.client.get("{}?panel_name={}".format(url, self.gps.panel.name)) self.assertEqual(r.status_code, 200) multi_genes_arg = "{},{}".format(self.genes[0].gene_core.gene_symbol, self.genes[1].gene_core.gene_symbol) multi_genes_url = reverse_lazy('webservices:search_genes', args=(multi_genes_arg,)) r = self.client.get(multi_genes_url) self.assertEqual(r.status_code, 200) def test_strs_in_panel(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.str.panel.panel.pk,))) self.assertEqual(r.status_code, 200) self.assertEqual(r.json()['result']['STRs'][0]['Name'], self.str.name) self.assertEqual(r.json()['result']['STRs'][0]['GRCh37Coordinates'], [self.str.position_37.lower, self.str.position_37.upper]) self.assertEqual(r.json()['result']['STRs'][0]['GRCh38Coordinates'], [self.str.position_38.lower, self.str.position_38.upper]) self.assertEqual(r.json()['result']['STRs'][0]['PathogenicRepeats'], self.str.pathogenic_repeats) def test_super_panel(self): super_panel = GenePanelSnapshotFactory(panel__status=GenePanel.STATUS.public) super_panel.child_panels.set([self.gps_public, ]) r_direct = self.client.get(reverse_lazy('webservices:get_panel', args=(self.gps_public.panel.pk,))) result_genes = list(sorted(r_direct.json()['result']['Genes'], key=lambda x: x.get('GeneSymbol'))) r = self.client.get(reverse_lazy('webservices:get_panel', args=(super_panel.panel.pk,))) self.assertEqual(r.status_code, 200) self.assertEqual(result_genes, list(sorted(r.json()['result']['Genes'], key=lambda x: x.get('GeneSymbol')))) def test_no_loss_of_function(self): url = reverse_lazy('webservices:search_genes', args=(self.gpes.gene_core.gene_symbol,)) r = self.client.get("{}?ModeOfPathogenicity={}".format(url, 'no_loss_of_function')) self.assertEqual(len(r.json()['results']), 0) self.gpes.mode_of_pathogenicity = convert_mop('no_loss_of_function', back=True) self.gpes.save() r = self.client.get("{}?ModeOfPathogenicity={}".format(url, 'no_loss_of_function')) self.assertEqual(len(r.json()['results']), 1) self.assertEqual(r.json()['results'][0]['GeneSymbol'], self.gpes.gene.get('gene_symbol')) def test_region_in_panel(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.region.panel.panel.pk,))) self.assertEqual(r.status_code, 200) self.assertEqual(r.json()['result']['Regions'][0]['Name'], self.region.name) self.assertEqual(r.json()['result']['Regions'][0]['GRCh37Coordinates'], [self.region.position_37.lower, self.region.position_37.upper]) self.assertEqual(r.json()['result']['Regions'][0]['GRCh38Coordinates'], [self.region.position_38.lower, self.region.position_38.upper]) self.assertEqual(r.json()['result']['Regions'][0]['TriplosensitivityScore'], self.region.triplosensitivity_score) self.assertEqual(r.json()['result']['Regions'][0]['TypeOfVariants'], self.region.type_of_variants) def test_region_in_panel_empty_pos37(self): r = self.client.get(reverse_lazy('webservices:get_panel', args=(self.region2.panel.panel.pk,))) self.assertEqual(r.status_code, 200) self.assertEqual(r.json()['result']['Regions'][0]['Name'], self.region2.name) self.assertEqual(r.json()['result']['Regions'][0]['GRCh37Coordinates'], None) self.assertEqual(r.json()['result']['Regions'][0]['GRCh38Coordinates'], [self.region2.position_38.lower, self.region2.position_38.upper]) self.assertEqual(r.json()['result']['Regions'][0]['TriplosensitivityScore'], self.region2.triplosensitivity_score) self.assertEqual(r.json()['result']['Regions'][0]['TypeOfVariants'], self.region2.type_of_variants) def test_region_filters(self): url = reverse_lazy('webservices:get_panel', args=(self.region.panel.panel.pk,)) r = self.client.get("{}?HaploinsufficiencyScore={}".format(url, self.region.haploinsufficiency_score)).json() self.assertEqual(r['result']['Regions'][0]['HaploinsufficiencyScore'], self.region.haploinsufficiency_score) r = self.client.get("{}?TriplosensitivityScore={}".format(url, self.region.triplosensitivity_score)).json() self.assertEqual(r['result']['Regions'][0]['TriplosensitivityScore'], self.region.triplosensitivity_score) def test_list_entities(self): url = reverse_lazy('webservices:list_entities') r = self.client.get(url) self.assertEqual(r.status_code, 200) res = r.json() self.assertEqual(len(res['results']), 8) self.assertEqual(len([r for r in res['results'] if r['EntityType'] == 'str']), 1) self.assertEqual(len([r for r in res['results'] if r['EntityType'] == 'region']), 2)