about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPjotr Prins2020-08-04 09:04:08 +0100
committerGitHub2020-08-04 09:04:08 +0100
commit49e6ee926076a2ca71372ae9cb585130f3790f69 (patch)
tree35d0a7ce082808455a371d489cddb522ee63f9d2
parentb950eb2f79632ca433b76dac8f063847266c54fc (diff)
parent549726ec3c4c176f855b65ade299701d1865b261 (diff)
downloadgenenetwork2-49e6ee926076a2ca71372ae9cb585130f3790f69.tar.gz
Merge pull request #415 from BonfaceKilz/tests/add-tests-for-gen-menu
Tests/add tests for gen menu
-rw-r--r--wqflask/tests/api/__init__.py0
-rw-r--r--wqflask/tests/api/test_gen_menu.py407
-rw-r--r--wqflask/wqflask/api/gen_menu.py186
3 files changed, 500 insertions, 93 deletions
diff --git a/wqflask/tests/api/__init__.py b/wqflask/tests/api/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/wqflask/tests/api/__init__.py
diff --git a/wqflask/tests/api/test_gen_menu.py b/wqflask/tests/api/test_gen_menu.py
new file mode 100644
index 00000000..79c77fec
--- /dev/null
+++ b/wqflask/tests/api/test_gen_menu.py
@@ -0,0 +1,407 @@
+"""Test cases for wqflask.api.gen_menu"""
+import unittest
+import mock
+
+from wqflask.api.gen_menu import gen_dropdown_json
+from wqflask.api.gen_menu import get_species
+from wqflask.api.gen_menu import get_groups
+from wqflask.api.gen_menu import get_types
+from wqflask.api.gen_menu import get_datasets
+from wqflask.api.gen_menu import phenotypes_exist
+from wqflask.api.gen_menu import genotypes_exist
+from wqflask.api.gen_menu import build_datasets
+from wqflask.api.gen_menu import build_types
+
+
+class TestGenMenu(unittest.TestCase):
+    """Tests for the gen_menu module"""
+
+    def setUp(self):
+        self.test_group = {
+            'mouse': [
+                ['H_T1',
+                 'H_T',
+                 'Family:DescriptionA'
+                 ],
+                ['H_T2', "H_T'", 'Family:None']
+            ],
+            'human': [
+                ['BXD', 'BXD', 'Family:None'],
+                ['HLC', 'Liver: Normal Gene Expression with Genotypes (Merck)',
+                 'Family:Test']
+            ]
+        }
+
+        self.test_type = {
+            'mouse': {
+                'H_T2': [('Phenotypes',
+                          'Traits and Cofactors',
+                          'Phenotypes'),
+                         ('Genotypes',
+                          'DNA Markers and SNPs',
+                          'Genotypes'),
+                         ['M', 'M', 'Molecular Trait Datasets']],
+                'H_T1': [('Phenotypes',
+                          'Traits and Cofactors',
+                          'Phenotypes'),
+                         ('Genotypes',
+                          'DNA Markers and SNPs',
+                          'Genotypes'),
+                         ['M', 'M', 'Molecular Trait Datasets']]
+            },
+            'human': {
+                'HLC': [('Phenotypes',
+                         'Traits and Cofactors',
+                         'Phenotypes'),
+                        ('Genotypes',
+                         'DNA Markers and SNPs',
+                         'Genotypes'),
+                        ['M', 'M', 'Molecular Trait Datasets']],
+                'BXD': [('Phenotypes',
+                         'Traits and Cofactors',
+                         'Phenotypes'),
+                        ('Genotypes',
+                         'DNA Markers and SNPs',
+                         'Genotypes'),
+                        ['M', 'M', 'Molecular Trait Datasets']]
+            }
+        }
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_get_species(self, db_mock):
+        """Test that assertion is raised when dataset and dataset_name
+        are defined"""
+        db_mock.db.execute.return_value.fetchall.return_value = (
+            ('human', 'Human'),
+            ('mouse', 'Mouse'))
+        self.assertEqual(get_species(),
+                         [['human', 'Human'], ['mouse', 'Mouse']])
+        db_mock.db.execute.assert_called_once_with(
+            "SELECT Name, MenuName FROM Species ORDER BY OrderId"
+        )
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_get_groups(self, db_mock):
+        """Test that species groups are grouped correctly"""
+        db_mock.db.execute.return_value.fetchall.side_effect = [
+            # Mouse
+            (('BXD', 'BXD', None),
+             ('HLC', 'Liver: Normal Gene Expression with Genotypes (Merck)',
+              'Test')),
+            # Human
+            (('H_T1', "H_T", "DescriptionA"),
+             ('H_T2', "H_T'", None))
+        ]
+
+        self.assertEqual(get_groups([["human", "Human"], ["mouse", "Mouse"]]),
+                         self.test_group)
+
+        for name in ["mouse", "human"]:
+            db_mock.db.execute.assert_any_call(
+                ("SELECT InbredSet.Name, InbredSet.FullName, " +
+                 "IFNULL(InbredSet.Family, 'None') " +
+                 "FROM InbredSet, Species WHERE Species.Name " +
+                 "= '{}' AND InbredSet.SpeciesId = Species.Id GROUP by " +
+                 "InbredSet.Name ORDER BY IFNULL(InbredSet.FamilyOrder, " +
+                 "InbredSet.FullName) ASC, IFNULL(InbredSet.Family, " +
+                 "InbredSet.FullName) ASC, InbredSet.FullName ASC, " +
+                 "InbredSet.MenuOrderId ASC").format(name)
+            )
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_phenotypes_exist_called_with_correct_query(self, db_mock):
+        """Test that phenotypes_exist is called with the correct query"""
+        db_mock.db.execute.return_value.fetchone.return_value = None
+        phenotypes_exist("test")
+        db_mock.db.execute.assert_called_with(
+            "SELECT Name FROM PublishFreeze "
+            "WHERE PublishFreeze.Name = 'testPublish'"
+        )
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_phenotypes_exist_with_falsy_values(self, db_mock):
+        """Test that phenotype check returns correctly when given
+        a None value"""
+        for x in [None, False, (), [], ""]:
+            db_mock.db.execute.return_value.fetchone.return_value = x
+            self.assertFalse(phenotypes_exist("test"))
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_phenotypes_exist_with_truthy_value(self, db_mock):
+        """Test that phenotype check returns correctly when given Truthy """
+        for x in ["x", ("result"), ["result"], [1]]:
+            db_mock.db.execute.return_value.fetchone.return_value = (x)
+            self.assertTrue(phenotypes_exist("test"))
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_genotypes_exist_called_with_correct_query(self, db_mock):
+        """Test that genotypes_exist is called with the correct query"""
+        db_mock.db.execute.return_value.fetchone.return_value = None
+        genotypes_exist("test")
+        db_mock.db.execute.assert_called_with(
+            "SELECT Name FROM GenoFreeze WHERE GenoFreeze.Name = 'testGeno'"
+        )
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_genotypes_exist_with_falsy_values(self, db_mock):
+        """Test that genotype check returns correctly when given
+        a None value"""
+        for x in [None, False, (), [], ""]:
+            db_mock.db.execute.return_value.fetchone.return_value = x
+            self.assertFalse(genotypes_exist("test"))
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_genotypes_exist_with_truthy_value(self, db_mock):
+        """Test that genotype check returns correctly when given Truthy """
+        for x in ["x", ("result"), ["result"], [1]]:
+            db_mock.db.execute.return_value.fetchone.return_value = (x)
+            self.assertTrue(phenotypes_exist("test"))
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_build_datasets_with_type_phenotypes(self, db_mock):
+        """Test that correct dataset is returned for a phenotype type"""
+        db_mock.db.execute.return_value.fetchall.return_value = (
+            (602, "BXDPublish", "BXD Published Phenotypes"),
+        )
+        self.assertEqual(build_datasets("Mouse", "BXD", "Phenotypes"),
+                         [['602', "BXDPublish", "BXD Published Phenotypes"]])
+        db_mock.db.execute.assert_called_with(
+            "SELECT InfoFiles.GN_AccesionId, PublishFreeze.Name, " +
+            "PublishFreeze.FullName FROM InfoFiles, PublishFreeze, " +
+            "InbredSet WHERE InbredSet.Name = 'BXD' AND " +
+            "PublishFreeze.InbredSetId = InbredSet.Id AND " +
+            "InfoFiles.InfoPageName = PublishFreeze.Name " +
+            "ORDER BY PublishFreeze.CreateTime ASC"
+        )
+        self.assertEqual(build_datasets("Mouse", "MDP", "Phenotypes"),
+                         [['602', "BXDPublish", "Mouse Phenome Database"]])
+
+        db_mock.db.execute.return_value.fetchall.return_value = ()
+        db_mock.db.execute.return_value.fetchone.return_value = (
+            "BXDPublish", "Mouse Phenome Database"
+        )
+        self.assertEqual(build_datasets("Mouse", "MDP", "Phenotypes"),
+                         [["None", "BXDPublish", "Mouse Phenome Database"]])
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_build_datasets_with_type_phenotypes_and_no_results(self, db_mock):
+        """Test that correct dataset is returned for a phenotype type with no
+        results
+
+        """
+        db_mock.db.execute.return_value.fetchall.return_value = None
+        db_mock.db.execute.return_value.fetchone.return_value = (121,
+                                                                 "text value")
+        self.assertEqual(build_datasets("Mouse", "BXD", "Phenotypes"),
+                         [["None", "121", "text value"]])
+        db_mock.db.execute.assert_called_with(
+            "SELECT PublishFreeze.Name, PublishFreeze.FullName "
+            "FROM PublishFreeze, InbredSet "
+            "WHERE InbredSet.Name = 'BXD' AND "
+            "PublishFreeze.InbredSetId = InbredSet.Id "
+            "ORDER BY PublishFreeze.CreateTime ASC"
+        )
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_build_datasets_with_type_genotypes(self, db_mock):
+        """Test that correct dataset is returned for a phenotype type"""
+        db_mock.db.execute.return_value.fetchone.return_value = (
+            635, "HLCPublish", "HLC Published Genotypes"
+        )
+
+        self.assertEqual(build_datasets("Mouse", "HLC", "Genotypes"),
+                         [["635", "HLCGeno", "HLC Genotypes"]])
+        db_mock.db.execute.assert_called_with(
+            "SELECT InfoFiles.GN_AccesionId FROM InfoFiles, "
+            "GenoFreeze, InbredSet WHERE InbredSet.Name = 'HLC' AND "
+            "GenoFreeze.InbredSetId = InbredSet.Id AND "
+            "InfoFiles.InfoPageName = GenoFreeze.ShortName " +
+            "ORDER BY GenoFreeze.CreateTime DESC"
+        )
+        db_mock.db.execute.return_value.fetchone.return_value = ()
+        self.assertEqual(build_datasets("Mouse", "HLC", "Genotypes"),
+                         [["None", "HLCGeno", "HLC Genotypes"]])
+
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_build_datasets_with_type_mrna(self, db_mock):
+        """Test that correct dataset is returned for a mRNA
+        expression/ Probeset"""
+        db_mock.db.execute.return_value.fetchall.return_value = (
+            (112, "HC_M2_0606_P",
+             "Hippocampus Consortium M430v2 (Jun06) PDNN"), )
+        self.assertEqual(build_datasets("Mouse", "HLC", "mRNA"), [[
+            "112", 'HC_M2_0606_P', "Hippocampus Consortium M430v2 (Jun06) PDNN"
+        ]])
+        db_mock.db.execute.assert_called_once_with(
+            "SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, " +
+            "ProbeSetFreeze.FullName FROM ProbeSetFreeze, " +
+            "ProbeFreeze, InbredSet, Tissue, Species WHERE " +
+            "Species.Name = 'Mouse' AND Species.Id = " +
+            "InbredSet.SpeciesId AND InbredSet.Name = 'HLC' AND " +
+            "ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and " +
+            "Tissue.Name = 'mRNA' AND ProbeFreeze.TissueId = " +
+            "Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id " +
+            "ORDER BY ProbeSetFreeze.CreateTime DESC")
+
+    @mock.patch('wqflask.api.gen_menu.build_datasets')
+    @mock.patch('wqflask.api.gen_menu.g')
+    def test_build_types(self, db_mock, datasets_mock):
+        """Test that correct tissue metadata is returned"""
+        datasets_mock.return_value = [
+            ["112", 'HC_M2_0606_P',
+                "Hippocampus Consortium M430v2 (Jun06) PDNN"]
+        ]
+        db_mock.db.execute.return_value.fetchall.return_value = (
+            ('Mouse Tissue'), ('Human Tissue'), ('Rat Tissue')
+        )
+        self.assertEqual(build_types('mouse', 'random group'),
+                         [['M', 'M', 'Molecular Trait Datasets'],
+                          ['H', 'H', 'Molecular Trait Datasets'],
+                          ['R', 'R', 'Molecular Trait Datasets']])
+        db_mock.db.execute.assert_called_once_with(
+            "SELECT DISTINCT Tissue.Name " +
+            "FROM ProbeFreeze, ProbeSetFreeze, InbredSet, " +
+            "Tissue, Species WHERE Species.Name = 'mouse' " +
+            "AND Species.Id = InbredSet.SpeciesId AND " +
+            "InbredSet.Name = 'random group' AND " +
+            "ProbeFreeze.TissueId = Tissue.Id AND " +
+            "ProbeFreeze.InbredSetId = InbredSet.Id AND " +
+            "ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id " +
+            "ORDER BY Tissue.Name"
+        )
+
+    @mock.patch('wqflask.api.gen_menu.build_types')
+    @mock.patch('wqflask.api.gen_menu.genotypes_exist')
+    @mock.patch('wqflask.api.gen_menu.phenotypes_exist')
+    def test_get_types_with_existing_genotype_and_phenotypes(
+            self,
+            phenotypes_exist_mock,
+            genotypes_exist_mock,
+            build_types_mock):
+        """Test that build types are constructed correctly if phenotypes and genotypes
+        exist
+
+        """
+        phenotypes_exist_mock.return_value = True
+        genotypes_exist_mock.return_value = True
+
+        expected_result = self.test_type
+
+        build_types_mock.return_value = [
+            ['M', 'M', 'Molecular Trait Datasets']
+        ]
+        self.assertEqual(get_types(self.test_group), expected_result)
+
+    @mock.patch('wqflask.api.gen_menu.build_types')
+    @mock.patch('wqflask.api.gen_menu.genotypes_exist')
+    @mock.patch('wqflask.api.gen_menu.phenotypes_exist')
+    def test_get_types_with_buildtype_and_non_existent_genotype_and_phenotypes(
+            self,
+            phenotypes_exist_mock,
+            genotypes_exist_mock,
+            build_types_mock):
+        """Test that build types are constructed correctly if phenotypes_exist and
+        genotypes_exist are false but build_type is falsy
+
+        """
+        phenotypes_exist_mock.return_value = False
+        genotypes_exist_mock.return_value = False
+
+        build_types_mock.return_value = []
+        self.assertEqual(get_types(self.test_group), {
+            'mouse': {},
+            'human': {}
+        })
+
+    @mock.patch('wqflask.api.gen_menu.build_types')
+    @mock.patch('wqflask.api.gen_menu.genotypes_exist')
+    @mock.patch('wqflask.api.gen_menu.phenotypes_exist')
+    def test_get_types_with_non_existent_genotype_phenotypes_and_buildtype(
+            self,
+            phenotypes_exist_mock,
+            genotypes_exist_mock,
+            build_types_mock):
+        """Test that build types are constructed correctly if phenotypes_exist,
+        genotypes_exist and build_types are truthy
+
+        """
+        phenotypes_exist_mock.return_value = False
+        genotypes_exist_mock.return_value = False
+
+        build_types_mock.return_value = [
+            ['M', 'M', 'Molecular Trait Datasets']
+        ]
+        expected_result = {
+            'mouse': {
+                'H_T2': [['M', 'M', 'Molecular Trait Datasets']],
+                'H_T1': [['M', 'M', 'Molecular Trait Datasets']]},
+            'human': {
+                'HLC': [['M', 'M', 'Molecular Trait Datasets']],
+                'BXD': [['M', 'M', 'Molecular Trait Datasets']]}}
+        self.assertEqual(get_types(self.test_group),
+                         expected_result)
+
+    @mock.patch('wqflask.api.gen_menu.build_datasets')
+    def test_get_datasets_with_existent_datasets(self,
+                                                 build_datasets_mock):
+        """Test correct dataset is returned with existent build_datasets"""
+        build_datasets_mock.return_value = "Test"
+        expected_result = {
+            'mouse': {
+                'H_T2': {'Genotypes': 'Test',
+                         'M': 'Test',
+                         'Phenotypes': 'Test'},
+                'H_T1': {'Genotypes': 'Test',
+                         'M': 'Test',
+                         'Phenotypes': 'Test'}},
+            'human': {'HLC': {'Genotypes': 'Test',
+                              'M': 'Test',
+                              'Phenotypes': 'Test'},
+                      'BXD': {'Genotypes': 'Test',
+                              'M': 'Test',
+                              'Phenotypes': 'Test'}}}
+        self.assertEqual(get_datasets(self.test_type),
+                         expected_result)
+
+    @mock.patch('wqflask.api.gen_menu.build_datasets')
+    def test_get_datasets_with_non_existent_datasets(self,
+                                                     build_datasets_mock):
+        """Test correct dataset is returned with non-existent build_datasets"""
+        build_datasets_mock.return_value = None
+        expected_result = {
+            'mouse': {
+                'H_T2': {},
+                'H_T1': {}},
+            'human': {'HLC': {},
+                      'BXD': {}}}
+        self.assertEqual(get_datasets(self.test_type),
+                         expected_result)
+
+    @mock.patch('wqflask.api.gen_menu.get_datasets')
+    @mock.patch('wqflask.api.gen_menu.get_types')
+    @mock.patch('wqflask.api.gen_menu.get_groups')
+    @mock.patch('wqflask.api.gen_menu.get_species')
+    def test_gen_dropdown_json(self,
+                               species_mock,
+                               groups_mock,
+                               types_mock,
+                               datasets_mock):
+        "Test that the correct dictionary is constructed properly"
+        species_mock.return_value = ("speciesA speciesB speciesC speciesD"
+                                     .split(" "))
+        datasets_mock.return_value = ("datasetA datasetB datasetC datasetD"
+                                      .split(" "))
+        groups_mock.return_value = ("groupA groupB groupC groupD"
+                                    .split(" "))
+        types_mock.return_value = ("typeA typeB typeC typeD"
+                                   .split(" "))
+        datasets_mock.return_value = ("datasetA datasetB datasetC datasetD"
+                                      .split(" "))
+
+        expected_result = {
+            'datasets': ['datasetA', 'datasetB', 'datasetC', 'datasetD'],
+            'types': ['typeA', 'typeB', 'typeC', 'typeD'],
+            'groups': ['groupA', 'groupB', 'groupC', 'groupD'],
+            'species': ['speciesA', 'speciesB', 'speciesC', 'speciesD']}
+
+        self.assertEqual(gen_dropdown_json(), expected_result)
diff --git a/wqflask/wqflask/api/gen_menu.py b/wqflask/wqflask/api/gen_menu.py
index cfce0c8e..cc11e14b 100644
--- a/wqflask/wqflask/api/gen_menu.py
+++ b/wqflask/wqflask/api/gen_menu.py
@@ -1,21 +1,12 @@
 from __future__ import print_function, division
 
-import sys
-
 from flask import g
 
-from utility.tools import locate, locate_ignore_error, TEMPDIR, SQL_URI
-from utility.benchmark import Bench
-
-import MySQLdb
-
-import urlparse
-
-import utility.logger
-logger = utility.logger.getLogger(__name__ )
 
 def gen_dropdown_json():
-    """Generates and outputs (as json file) the data for the main dropdown menus on the home page"""
+    """Generates and outputs (as json file) the data for the main dropdown menus on
+    the home page
+    """
 
     species = get_species()
     groups = get_groups(species)
@@ -29,11 +20,11 @@ def gen_dropdown_json():
 
     return data
 
+
 def get_species():
     """Build species list"""
-    results = g.db.execute("""SELECT Name, MenuName
-                              FROM Species
-                              ORDER BY OrderId""").fetchall()
+    results = g.db.execute(
+        "SELECT Name, MenuName FROM Species ORDER BY OrderId").fetchall()
 
     species = []
     for result in results:
@@ -41,25 +32,31 @@ def get_species():
 
     return species
 
+
 def get_groups(species):
     """Build groups list"""
     groups = {}
     for species_name, _species_full_name in species:
         groups[species_name] = []
 
-        results = g.db.execute("""SELECT InbredSet.Name, InbredSet.FullName, IFNULL(InbredSet.Family, 'None')
-                                FROM InbredSet, Species
-                                WHERE Species.Name = '{}' AND
-                                        InbredSet.SpeciesId = Species.Id
-                                GROUP by InbredSet.Name
-                                ORDER BY IFNULL(InbredSet.FamilyOrder, InbredSet.FullName) ASC, IFNULL(InbredSet.Family, InbredSet.FullName) ASC, InbredSet.FullName ASC, InbredSet.MenuOrderId ASC""".format(species_name)).fetchall()
+        results = g.db.execute(
+            ("SELECT InbredSet.Name, InbredSet.FullName, "
+             "IFNULL(InbredSet.Family, 'None') "
+             "FROM InbredSet, Species WHERE Species.Name = '{}' "
+             "AND InbredSet.SpeciesId = Species.Id GROUP by InbredSet.Name "
+             "ORDER BY IFNULL(InbredSet.FamilyOrder, InbredSet.FullName) "
+             "ASC, IFNULL(InbredSet.Family, InbredSet.FullName) ASC, "
+             "InbredSet.FullName ASC, InbredSet.MenuOrderId ASC")
+            .format(species_name)).fetchall()
 
         for result in results:
             family_name = "Family:" + str(result[2])
-            groups[species_name].append([str(result[0]), str(result[1]), family_name])
+            groups[species_name].append(
+                [str(result[0]), str(result[1]), family_name])
 
     return groups
 
+
 def get_types(groups):
     """Build types list"""
     types = {}
@@ -68,48 +65,45 @@ def get_types(groups):
         types[species] = {}
         for group_name, _group_full_name, _family_name in group_dict:
             if phenotypes_exist(group_name):
-                types[species][group_name] = [("Phenotypes", "Traits and Cofactors", "Phenotypes")]
+                types[species][group_name] = [
+                    ("Phenotypes", "Traits and Cofactors", "Phenotypes")]
             if genotypes_exist(group_name):
                 if group_name in types[species]:
-                    types[species][group_name] += [("Genotypes", "DNA Markers and SNPs", "Genotypes")]
+                    types[species][group_name] += [
+                        ("Genotypes", "DNA Markers and SNPs", "Genotypes")]
                 else:
-                    types[species][group_name] = [("Genotypes", "DNA Markers and SNPs", "Genotypes")]
+                    types[species][group_name] = [
+                        ("Genotypes", "DNA Markers and SNPs", "Genotypes")]
             if group_name in types[species]:
                 types_list = build_types(species, group_name)
                 if len(types_list) > 0:
                     types[species][group_name] += types_list
-                else:
-                    if not phenotypes_exist(group_name) and not genotypes_exist(group_name):
-                        types[species].pop(group_name, None)
-                        groups[species] = list(group for group in groups[species] if group[0] != group_name)
-            else: #ZS: This whole else statement might be unnecessary, need to check
+            else:
                 types_list = build_types(species, group_name)
                 if len(types_list) > 0:
                     types[species][group_name] = types_list
                 else:
                     types[species].pop(group_name, None)
-                    groups[species] = list(group for group in groups[species] if group[0] != group_name)
+                    groups[species] = list(
+                        group for group in groups[species]
+                        if group[0] != group_name)
     return types
 
+
 def phenotypes_exist(group_name):
-    results = g.db.execute("""SELECT Name
-                              FROM PublishFreeze
-                              WHERE PublishFreeze.Name = '{}'""".format(group_name+"Publish")).fetchone()
+    results = g.db.execute(
+        ("SELECT Name FROM PublishFreeze "
+         "WHERE PublishFreeze.Name = "
+         "'{}'").format(group_name+"Publish")).fetchone()
+    return bool(results)
 
-    if results != None:
-        return True
-    else:
-        return False
 
 def genotypes_exist(group_name):
-    results = g.db.execute("""SELECT Name
-                              FROM GenoFreeze
-                              WHERE GenoFreeze.Name = '{}'""".format(group_name+"Geno")).fetchone()
+    results = g.db.execute(
+        ("SELECT Name FROM GenoFreeze " +
+         "WHERE GenoFreeze.Name = '{}'").format(group_name+"Geno")).fetchone()
+    return bool(results)
 
-    if results != None:
-        return True
-    else:
-        return False
 
 def build_types(species, group):
     """Fetches tissues
@@ -119,25 +113,26 @@ def build_types(species, group):
 
     """
 
-    query = """SELECT DISTINCT Tissue.Name
-               FROM ProbeFreeze, ProbeSetFreeze, InbredSet, Tissue, Species
-               WHERE Species.Name = '{0}' AND
-                     Species.Id = InbredSet.SpeciesId AND
-                     InbredSet.Name = '{1}' AND
-                     ProbeFreeze.TissueId = Tissue.Id AND
-                     ProbeFreeze.InbredSetId = InbredSet.Id AND
-                     ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id
-               ORDER BY Tissue.Name""".format(species, group)
+    query = ("SELECT DISTINCT Tissue.Name "
+             "FROM ProbeFreeze, ProbeSetFreeze, InbredSet, "
+             "Tissue, Species WHERE Species.Name = '{0}' "
+             "AND Species.Id = InbredSet.SpeciesId AND "
+             "InbredSet.Name = '{1}' AND ProbeFreeze.TissueId = "
+             "Tissue.Id AND ProbeFreeze.InbredSetId = InbredSet.Id "
+             "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+             "ORDER BY Tissue.Name").format(species, group)
 
     results = []
     for result in g.db.execute(query).fetchall():
-        if len(result):
+        if bool(result):
             these_datasets = build_datasets(species, group, result[0])
             if len(these_datasets) > 0:
-                results.append([str(result[0]), str(result[0]), "Molecular Trait Datasets"])
+                results.append([str(result[0]), str(result[0]),
+                                "Molecular Trait Datasets"])
 
     return results
 
+
 def get_datasets(types):
     """Build datasets list"""
     datasets = {}
@@ -147,7 +142,7 @@ def get_datasets(types):
             datasets[species][group] = {}
             for type_name in type_list:
                 these_datasets = build_datasets(species, group, type_name[0])
-                if len(these_datasets) > 0:
+                if bool(these_datasets):
                     datasets[species][group][type_name[0]] = these_datasets
 
     return datasets
@@ -158,29 +153,30 @@ def build_datasets(species, group, type_name):
     dataset_text = dataset_value = None
     datasets = []
     if type_name == "Phenotypes":
-        results = g.db.execute("""SELECT InfoFiles.GN_AccesionId, PublishFreeze.Name, PublishFreeze.FullName
-                                  FROM InfoFiles, PublishFreeze, InbredSet
-                                  WHERE InbredSet.Name = '{}' AND
-                                        PublishFreeze.InbredSetId = InbredSet.Id AND
-                                        InfoFiles.InfoPageName = PublishFreeze.Name
-                                  ORDER BY PublishFreeze.CreateTime ASC""".format(group)).fetchall()
-
-        if len(results) > 0:
+        results = g.db.execute(
+            ("SELECT InfoFiles.GN_AccesionId, PublishFreeze.Name, "
+             "PublishFreeze.FullName FROM InfoFiles, PublishFreeze, "
+             "InbredSet WHERE InbredSet.Name = '{}' AND "
+             "PublishFreeze.InbredSetId = InbredSet.Id AND "
+             "InfoFiles.InfoPageName = PublishFreeze.Name "
+             "ORDER BY PublishFreeze.CreateTime ASC").format(group)).fetchall()
+        if bool(results):
             for result in results:
                 dataset_id = str(result[0])
                 dataset_value = str(result[1])
+                dataset_text = str(result[2])
                 if group == 'MDP':
                     dataset_text = "Mouse Phenome Database"
-                else:
-                    #dataset_text = "%s Phenotypes" % group
-                    dataset_text = str(result[2])
+
                 datasets.append([dataset_id, dataset_value, dataset_text])
         else:
-            result = g.db.execute("""SELECT PublishFreeze.Name, PublishFreeze.FullName
-                                      FROM PublishFreeze, InbredSet
-                                      WHERE InbredSet.Name = '{}' AND
-                                          PublishFreeze.InbredSetId = InbredSet.Id
-                                      ORDER BY PublishFreeze.CreateTime ASC""".format(group)).fetchone()
+            result = g.db.execute(
+                ("SELECT PublishFreeze.Name, PublishFreeze.FullName "
+                 "FROM PublishFreeze, InbredSet "
+                 "WHERE InbredSet.Name = '{}' AND "
+                 "PublishFreeze.InbredSetId = InbredSet.Id "
+                 "ORDER BY PublishFreeze.CreateTime ASC")
+                .format(group)).fetchone()
 
             dataset_id = "None"
             dataset_value = str(result[0])
@@ -188,30 +184,34 @@ def build_datasets(species, group, type_name):
             datasets.append([dataset_id, dataset_value, dataset_text])
 
     elif type_name == "Genotypes":
-        results = g.db.execute("""SELECT InfoFiles.GN_AccesionId
-                                  FROM InfoFiles, GenoFreeze, InbredSet
-                                  WHERE InbredSet.Name = '{}' AND
-                                        GenoFreeze.InbredSetId = InbredSet.Id AND
-                                        InfoFiles.InfoPageName = GenoFreeze.ShortName
-                                  ORDER BY GenoFreeze.CreateTime DESC""".format(group)).fetchone()
-
-        if results != None:
+        results = g.db.execute(
+            ("SELECT InfoFiles.GN_AccesionId " +
+             "FROM InfoFiles, GenoFreeze, InbredSet " +
+             "WHERE InbredSet.Name = '{}' AND " +
+             "GenoFreeze.InbredSetId = InbredSet.Id AND " +
+             "InfoFiles.InfoPageName = GenoFreeze.ShortName " +
+             "ORDER BY GenoFreeze.CreateTime DESC").format(group)).fetchone()
+
+        dataset_id = "None"
+        if bool(results):
             dataset_id = str(results[0])
-        else:
-            dataset_id = "None"
+
         dataset_value = "%sGeno" % group
         dataset_text = "%s Genotypes" % group
         datasets.append([dataset_id, dataset_value, dataset_text])
 
-    else: # for mRNA expression/ProbeSet
-        results = g.db.execute("""SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, ProbeSetFreeze.FullName
-                                  FROM ProbeSetFreeze, ProbeFreeze, InbredSet, Tissue, Species
-                                  WHERE Species.Name = '{0}' AND
-                                        Species.Id = InbredSet.SpeciesId AND
-                                        InbredSet.Name = '{1}' AND
-                                        ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and Tissue.Name = '{2}' AND
-                                        ProbeFreeze.TissueId = Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id
-                                  ORDER BY ProbeSetFreeze.CreateTime DESC""".format(species, group, type_name)).fetchall()
+    else:  # for mRNA expression/ProbeSet
+        results = g.db.execute(
+            ("SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, "
+             "ProbeSetFreeze.FullName FROM ProbeSetFreeze, "
+             "ProbeFreeze, InbredSet, Tissue, Species WHERE "
+             "Species.Name = '{0}' AND Species.Id = "
+             "InbredSet.SpeciesId AND InbredSet.Name = '{1}' "
+             "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+             "and Tissue.Name = '{2}' AND ProbeFreeze.TissueId = "
+             "Tissue.Id and ProbeFreeze.InbredSetId = InbredSet.Id "
+             "ORDER BY ProbeSetFreeze.CreateTime "
+             "DESC").format(species, group, type_name)).fetchall()
 
         datasets = []
         for dataset_info in results:
@@ -220,4 +220,4 @@ def build_datasets(species, group, type_name):
                 this_dataset_info.append(str(info))
             datasets.append(this_dataset_info)
 
-    return datasets
\ No newline at end of file
+    return datasets