Esempio n. 1
0
    def test_delete_gene(self):
        gps = GenePanelSnapshotFactory()
        genes = GenePanelEntrySnapshotFactory.create_batch(5, panel=gps)
        gene_symbol = genes[2].gene['gene_symbol']

        number_of_genes = gps.stats.get('number_of_genes')

        assert gps.has_gene(gene_symbol) is True
        gps = gps.panel.active_panel
        gps.delete_gene(gene_symbol)
        gps = gps.panel.active_panel
        assert gps.panel.active_panel.has_gene(gene_symbol) is False
        assert number_of_genes - 1 == gps.panel.active_panel.stats.get(
            'number_of_genes')  # 4 is due to create_batch

        old_gps = GenePanel.objects.get(
            pk=gps.panel.pk).genepanelsnapshot_set.last()
        assert old_gps.version != gps.version
        assert old_gps.has_gene(gene_symbol) is True

        new_gps = GenePanel.objects.get(pk=gps.panel.pk).active_panel
        assert new_gps.has_gene(gene_symbol) is False

        gene_symbol = genes[3].gene['gene_symbol']
        assert new_gps.has_gene(gene_symbol) is True
        new_gps.delete_gene(gene_symbol, False)
        assert new_gps.has_gene(gene_symbol) is False

        new_gps = GenePanel.objects.get(pk=gps.panel.pk).active_panel
        assert new_gps.has_gene(gene_symbol) is False
Esempio n. 2
0
    def test_evaluation_single_panel(self):
        gps = GenePanelSnapshotFactory()
        gpes = GenePanelEntrySnapshotFactory(panel=gps)
        gps.panel.active_panel.increment_version()
        gps.panel.active_panel.increment_version()
        gps = gps.panel.active_panel

        gene_symbol = gpes.gene_core.gene_symbol

        # check we copy evaluation rather than assign it
        current_count = gps.panel.active_panel.get_all_genes[
            0].evaluation.first().genepanelentrysnapshot_set.count()
        self.assertEqual(current_count, 1)

        # check if deleting gene preserves it in the previous versions
        gp = gps.panel
        gps.delete_gene(gene_symbol)
        v1 = gp.genepanelsnapshot_set.get(major_version=0, minor_version=1)
        self.assertTrue(v1.has_gene(gene_symbol))
Esempio n. 3
0
class TestAPIV1(LoginExternalUser):
    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,
                              panel=self.gps)
        STRFactory(panel__panel__status=GenePanel.STATUS.public)
        self.region = RegionFactory(
            panel__panel__status=GenePanel.STATUS.public, panel=self.gps)
        RegionFactory(panel__panel__status=GenePanel.STATUS.public)

    def test_list_panels(self):
        r = self.client.get(reverse_lazy('api:v1:panels-list'))
        self.assertEqual(r.status_code, 200)

    def test_read_only_list_of_panels(self):
        r = self.client.post(reverse_lazy('api:v1:panels-list'),
                             {'something': 'something'})
        self.assertEqual(r.status_code, 405)

    def test_list_panels_name(self):
        url = reverse_lazy('api:v1:panels-list')
        r = self.client.get(url)
        self.assertEqual(len(r.json()['results']), 4)
        self.assertEqual(r.status_code, 200)

    def test_list_panels_filter_types(self):
        panel_type = PanelTypeFactory()
        self.gps.panel.types.add(panel_type)
        url = reverse_lazy('api:v1:panels-list') + '?type=' + panel_type.slug
        r = self.client.get(url)
        json_res = r.json()['results']
        self.assertEqual(json_res[0]['types'][0]['name'], panel_type.name)
        self.assertEqual(r.status_code, 200)

    def test_retired_panels(self):
        url = reverse_lazy('api:v1:panels-list')

        self.gps.panel.status = GenePanel.STATUS.deleted
        self.gps.panel.save()

        r = self.client.get(url)
        self.assertEqual(len(r.json()['results']), 3)
        self.assertEqual(r.status_code, 200)

        # Test deleted panels
        url = reverse_lazy('api:v1:panels-list')
        r = self.client.get("{}?retired=True".format(url))
        self.assertEqual(len(r.json()['results']),
                         4)  # 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('api:v1:panels-list')
        r = self.client.get("{}?retired=True".format(url))
        self.assertEqual(len(r.json()['results']),
                         3)  # 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('api:v1:panels-detail', args=(self.gps.panel.pk, ))
        r = self.client.get(url)
        self.assertEqual(r.status_code, 404)
        self.assertEqual(r.json(), {'detail': 'Not found.'})

        new_version = self.gps.increment_version()
        self.gps.panel.active_panel.increment_version()
        r = self.client.get("{}?version=0.1".format(url))
        self.assertEqual(r.status_code, 200)

    def test_get_panel_name(self):
        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         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('api:v1:panels-detail',
                         args=(self.gpes_deleted.panel.panel.name, )))
        self.assertEqual(r.status_code, 404)
        self.assertEqual(r.json(), {'detail': 'Not found.'})

    def test_get_panel_internal(self):
        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.gpes_internal.panel.panel.name, )))
        self.assertEqual(r.status_code, 404)
        self.assertEqual(r.json(), {'detail': 'Not found.'})

    def test_get_panel_retired(self):
        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.gpes_retired.panel.panel.name, )))
        self.assertEqual(r.status_code, 404)
        self.assertEqual(r.json(), {'detail': 'Not found.'})

    def test_get_panel_pk(self):
        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.gpes.panel.panel.pk, )))
        self.assertEqual(r.status_code, 200)

    def test_get_panel_version(self):
        self.gpes.panel.increment_version()
        self.gpes.panel.panel.active_panel.increment_version()

        url = reverse_lazy('api:v1:panels-detail',
                           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('api:v1:panels-detail',
                           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('api:v1:panels-list')
        res = self.client.get(url)
        # find gps panel
        title = self.gps_public.level4title.name
        current_time = str(self.gps_public.created).replace('+00:00',
                                                            'Z').replace(
                                                                ' ', 'T')
        gps_panel = [r for r in res.json()['results'] if r['name'] == title][0]
        self.assertEqual(gps_panel['version_created'], current_time)

        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(gps_panel['id'], ))).json()
        self.assertEqual(r['version_created'], current_time)

    def test_get_search_gene(self):
        url = reverse_lazy('api:v1:genes-detail',
                           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('api:v1:genes-detail',
                           args=(self.gpes.gene_core.gene_symbol, ))
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)

        r = self.client.get("{}?panel_name={}".format(
            url, self.gps_public.level4title.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('api:v1:genes-detail',
                                       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('api:v1:panels-detail',
                         args=(self.str.panel.panel.pk, )))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.json()['strs'][0]['entity_name'], self.str.name)
        self.assertEqual(
            r.json()['strs'][0]['grch37_coordinates'],
            [self.str.position_37.lower, self.str.position_37.upper])
        self.assertEqual(
            r.json()['strs'][0]['grch38_coordinates'],
            [self.str.position_38.lower, self.str.position_38.upper])
        self.assertEqual(r.json()['strs'][0]['pathogenic_repeats'],
                         self.str.pathogenic_repeats)

    def test_genes_in_panel(self):
        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.gpes.panel.panel.pk, )))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.json()['genes'][0]['entity_name'],
                         self.gpes.gene.get('gene_symbol'))
        self.assertEqual(r.json()['genes'][0]['mode_of_pathogenicity'],
                         self.gpes.mode_of_pathogenicity)

    def test_genes_in_panel_version(self):
        gene_symbol = self.gpes.gene.get('gene_symbol')
        self.gps_public.delete_gene(gene_symbol)
        self.gps_public = self.gps_public.panel.active_panel

        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.gpes.panel.panel.pk, )) + '?version=0.0')
        j = r.json()
        self.assertEqual(r.status_code, 200)
        gene_symbols_v0 = [g['entity_name'] for g in j['genes']]
        self.assertTrue(gene_symbols_v0, gene_symbol)

        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.gpes.panel.panel.pk, )) + '?version=0.1')
        j = r.json()
        self.assertEqual(r.status_code, 200)
        gene_symbols_v0 = [g['entity_name'] for g in j['genes']]
        self.assertFalse(gene_symbols_v0, gene_symbol)

    def test_green_genes_panel(self):
        # get all genes and their confidence levels counts
        r = self.client.get(
            reverse_lazy('api:v1:panels_genes-list',
                         args=(self.gps.panel_id, )) + '?confidence_level=3')
        j = r.json()
        green_db = [
            e for e in self.gps.get_all_genes if e.saved_gel_status >= 3
        ]
        green_api = [
            e for e in j['results'] if int(e.get('confidence_level')) >= 3
        ]
        self.assertEqual(len(green_db), len(green_api))

        r = self.client.get(
            reverse_lazy('api:v1:panels_genes-list',
                         args=(self.gps.panel_id, )) + '?confidence_level=2')
        j = r.json()
        amber_db = [
            e for e in self.gps.get_all_genes if e.saved_gel_status == 2
        ]
        amber_api = [
            e for e in j['results'] if int(e.get('confidence_level')) == 2
        ]
        self.assertEqual(len(amber_db), len(amber_api))

        r = self.client.get(
            reverse_lazy('api:v1:panels_genes-list',
                         args=(self.gps.panel_id, )) + '?confidence_level=1')
        j = r.json()
        red_db = [e for e in self.gps.get_all_genes if e.saved_gel_status == 1]
        red_api = [
            e for e in j['results'] if int(e.get('confidence_level')) == 1
        ]
        self.assertEqual(len(red_db), len(red_api))

    def test_genes_endpoint_in_panel_version(self):
        gene_symbol = self.gpes.gene.get('gene_symbol')
        self.gps_public.delete_gene(gene_symbol)
        self.gps_public = self.gps_public.panel.active_panel

        r = self.client.get(
            reverse_lazy('api:v1:panels_genes-list',
                         args=(self.gpes.panel.panel.pk, )) + '?version=0.0')
        j = r.json()
        self.assertEqual(r.status_code, 200)
        gene_symbols_v0 = [g['entity_name'] for g in j['results']]
        self.assertTrue(gene_symbols_v0, gene_symbol)

        r = self.client.get(
            reverse_lazy('api:v1:panels_genes-list',
                         args=(self.gpes.panel.panel.pk, )) + '?version=0.1')
        j = r.json()
        self.assertEqual(r.status_code, 200)
        gene_symbols_v0 = [g['entity_name'] for g in j['results']]
        self.assertFalse(gene_symbols_v0, gene_symbol)

    def test_genes_endpoint_entities_name(self):
        gene_symbol1 = self.genes[0].gene.get('gene_symbol')
        gene_symbol2 = self.genes[1].gene.get('gene_symbol')
        r = self.client.get(
            reverse_lazy('api:v1:panels_genes-list',
                         args=(self.gps.panel_id, )) +
            '?entity_name={},{}'.format(gene_symbol1, gene_symbol2))
        j = r.json()
        self.assertEqual(r.status_code, 200)
        gene_symbols = [g['entity_name'] for g in j['results']]
        self.assertTrue(len(j['results']), 2)
        self.assertTrue(gene_symbol1 in gene_symbols)
        self.assertTrue(gene_symbol2 in gene_symbols)

    def test_region_in_panel(self):
        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(self.region.panel.panel.pk, )))
        self.assertEqual(r.status_code, 200)
        region = r.json()['regions'][0]
        self.assertEqual(region['entity_name'], self.region.name)
        self.assertEqual(
            region['grch37_coordinates'],
            [self.region.position_37.lower, self.region.position_37.upper])
        self.assertEqual(
            region['grch38_coordinates'],
            [self.region.position_38.lower, self.region.position_38.upper])
        self.assertEqual(region['triplosensitivity_score'],
                         self.region.triplosensitivity_score)

    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('api:v1:panels-detail',
                         args=(self.gps_public.panel.pk, )))
        result_genes = list(
            sorted(r_direct.json()['genes'],
                   key=lambda x: x.get('gene_symbol')))

        r = self.client.get(
            reverse_lazy('api:v1:panels-detail',
                         args=(super_panel.panel.pk, )))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(
            result_genes,
            list(sorted(r.json()['genes'],
                        key=lambda x: x.get('gene_symbol'))))

    def test_evaluations(self):
        r = self.client.get(
            reverse_lazy('api:v1:genes-evaluations-list',
                         args=(self.gpes.panel.panel.pk,
                               self.gpes.gene_core.gene_symbol)))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 4)

    def test_region_evaluations(self):
        r = self.client.get(
            reverse_lazy('api:v1:regions-evaluations-list',
                         args=(self.region.panel.panel.pk, self.region.name)))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 4)

    def test_genes_list(self):
        r = self.client.get(reverse_lazy('api:v1:genes-list'))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 5)

    def test_genes_list_filter_types(self):
        panel_type = PanelTypeFactory()
        self.gps.panel.types.add(panel_type)
        r = self.client.get(
            reverse_lazy('api:v1:genes-list') + '?type=' + panel_type.slug)
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 4)

    def test_genes_list_filter_name(self):
        r = self.client.get(
            reverse_lazy('api:v1:genes-detail',
                         args=(self.gpes.gene_core.gene_symbol, )))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 1)

    def test_strs_list(self):
        r = self.client.get(reverse_lazy('api:v1:strs-list'))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 2)

    def test_strs_list_filter_types(self):
        panel_type = PanelTypeFactory()
        self.gps.panel.types.add(panel_type)
        r = self.client.get(
            reverse_lazy('api:v1:strs-list') + '?type=' + panel_type.slug)
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 1)

    def test_regions_list(self):
        r = self.client.get(reverse_lazy('api:v1:regions-list'))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 2)

    def test_regions_list_filter_types(self):
        panel_type = PanelTypeFactory()
        self.gps.panel.types.add(panel_type)
        r = self.client.get(
            reverse_lazy('api:v1:regions-list') + '?type=' + panel_type.slug)
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 1)

    def test_entities_list(self):
        r = self.client.get(reverse_lazy('api:v1:entities-list'))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 9)

    def test_read_only_list_of_entities(self):
        r = self.client.post(reverse_lazy('api:v1:entities-list'),
                             {'something': 'something'})
        self.assertEqual(r.status_code, 405)

    def test_entities_list_filter_name(self):
        r = self.client.get(
            reverse_lazy('api:v1:entities-detail', args=(self.region.name, )))
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 1)

    def test_entities_list_filter_types(self):
        panel_type = PanelTypeFactory()
        self.gps.panel.types.add(panel_type)
        url = reverse_lazy('api:v1:entities-list') + '?type=' + panel_type.slug
        r = self.client.get(url)
        self.assertEqual(r.status_code, 200)
        self.assertEqual(len(r.json()['results']), 6)