"""Test cases for gn3.db.menu"""
import unittest
from unittest import mock
import pytest
from gn3.db.menu import gen_dropdown_json
from gn3.db.menu import get_groups
from gn3.db.menu import get_types
from gn3.db.menu import get_datasets
from gn3.db.menu import phenotypes_exist
from gn3.db.menu import genotypes_exist
from gn3.db.menu import build_datasets
from gn3.db.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']]
}
}
@pytest.mark.unit_test
def test_get_groups(self):
"""Test that species groups are grouped correctly"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchall.side_effect = [(
# Human
('BXD', 'BXD', None, "human"),
(
'HLC',
('Liver: Normal Gene Expression with Genotypes (Merck)'),
'Test',
"human"),
# Mouse
('H_T1', "H_T", "DescriptionA", "mouse"),
('H_T2', "H_T'", None, "mouse")
)]
self.assertEqual(
get_groups(db_mock, ["human", "mouse"]), self.test_group)
cursor.execute.assert_called_once_with(
("SELECT InbredSet.Name, InbredSet.FullName, "
"IFNULL(InbredSet.Family, 'None'), Species.Name AS "
"species_name FROM Species INNER JOIN InbredSet "
"ON InbredSet.SpeciesId = Species.Id "
"WHERE "
"Species.Name IN (%s, %s) "
"GROUP BY "
"InbredSet.Name ORDER BY IFNULL(InbredSet.FamilyOrder, "
"InbredSet.FullName) ASC, IFNULL(InbredSet.Family, "
"InbredSet.FullName) ASC, InbredSet.FullName ASC, "
"InbredSet.MenuOrderId ASC"),
("human", "mouse"))
@pytest.mark.unit_test
def test_phenotypes_exist_with_falsy_values(self):
"""Test that phenotype check returns correctly when given
a None value"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
for item in [None, False, (), [], ""]:
cursor.fetchone.return_value = item
self.assertFalse(phenotypes_exist(db_mock, "test"))
@pytest.mark.unit_test
def test_phenotypes_exist_with_truthy_value(self):
"""Test that phenotype check returns correctly when given Truthy"""
db_mock = mock.MagicMock()
with db_mock.cursor() as conn:
with conn.cursor() as cursor:
for item in ["x", ("result"), ["result"], [1]]:
cursor.fetchone.return_value = (item)
self.assertTrue(phenotypes_exist(db_mock, "test"))
@pytest.mark.unit_test
def test_genotypes_exist_with_falsy_values(self):
"""Test that genotype check returns correctly when given a None value
"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
for item in [None, False, (), [], ""]:
cursor.fetchone.return_value = item
self.assertFalse(genotypes_exist(db_mock, "test"))
@pytest.mark.unit_test
def test_genotypes_exist_with_truthy_value(self):
"""Test that genotype check returns correctly when given Truthy """
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
for item in ["x", ("result"), ["result"], [1]]:
cursor.fetchone.return_value = (item)
self.assertTrue(phenotypes_exist(db_mock, "test"))
@pytest.mark.unit_test
def test_build_datasets_with_type_phenotypes(self):
"""Test that correct dataset is returned for a phenotype type"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchall.return_value = (
(602, "BXDPublish", "BXD Published Phenotypes"),
)
self.assertEqual(build_datasets(db_mock, "Mouse", "BXD",
"Phenotypes"),
[['602', "BXDPublish",
"BXD Published Phenotypes"]])
cursor.execute.assert_called_with((
"SELECT InfoFiles.GN_AccesionId, PublishFreeze.Name, "
"PublishFreeze.FullName FROM InfoFiles, PublishFreeze, "
"InbredSet WHERE InbredSet.Name = %s AND "
"PublishFreeze.InbredSetId = InbredSet.Id AND "
"InfoFiles.InfoPageName = PublishFreeze.Name "
"ORDER BY PublishFreeze.CreateTime ASC"
), ("BXD",))
self.assertEqual(
build_datasets(db_mock, "Mouse", "MDP","Phenotypes"),
[['602', "BXDPublish", "Mouse Phenome Database"]])
cursor.fetchall.return_value = ()
cursor.fetchone.return_value = (
"BXDPublish", "Mouse Phenome Database"
)
self.assertEqual(
build_datasets(db_mock, "Mouse", "MDP", "Phenotypes"),
[["None", "BXDPublish", "Mouse Phenome Database"]])
@pytest.mark.unit_test
def test_build_datasets_with_type_phenotypes_and_no_results(self):
"""Test that correct dataset is returned for a phenotype type with no
results
"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchall.return_value = None
cursor.fetchone.return_value = (121,
"text value")
self.assertEqual(
build_datasets(db_mock, "Mouse", "BXD", "Phenotypes"),
[["None", "121", "text value"]])
cursor.execute.assert_called_with((
"SELECT PublishFreeze.Name, PublishFreeze.FullName "
"FROM PublishFreeze, InbredSet "
"WHERE InbredSet.Name = %s AND "
"PublishFreeze.InbredSetId = InbredSet.Id "
"ORDER BY PublishFreeze.CreateTime ASC"
), ("BXD",))
@pytest.mark.unit_test
def test_build_datasets_with_type_genotypes(self):
"""Test that correct dataset is returned for a phenotype type"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchone.return_value = (
635, "HLCPublish", "HLC Published Genotypes"
)
self.assertEqual(
build_datasets(db_mock, "Mouse", "HLC", "Genotypes"),
[["635", "HLCGeno", "HLC Genotypes"]])
cursor.execute.assert_called_with((
"SELECT InfoFiles.GN_AccesionId FROM InfoFiles, "
"GenoFreeze, InbredSet WHERE InbredSet.Name = %s AND "
"GenoFreeze.InbredSetId = InbredSet.Id AND "
"InfoFiles.InfoPageName = GenoFreeze.ShortName "
"ORDER BY GenoFreeze.CreateTime DESC"
), ("HLC",))
cursor.fetchone.return_value = ()
self.assertEqual(
build_datasets(db_mock, "Mouse", "HLC", "Genotypes"),
[["None", "HLCGeno", "HLC Genotypes"]])
@pytest.mark.unit_test
def test_build_datasets_with_type_mrna(self):
"""Test that correct dataset is returned for a mRNA
expression/ Probeset"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchall.return_value = (
(112, "HC_M2_0606_P",
"Hippocampus Consortium M430v2 (Jun06) PDNN"), )
self.assertEqual(
build_datasets(db_mock, "Mouse", "HLC", "mRNA"),
[["112", 'HC_M2_0606_P',
"Hippocampus Consortium M430v2 (Jun06) PDNN"]])
cursor.execute.assert_called_once_with((
"SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, "
"ProbeSetFreeze.FullName FROM ProbeSetFreeze, "
"ProbeFreeze, InbredSet, Tissue, Species WHERE "
"Species.Name = %s AND Species.Id = "
"InbredSet.SpeciesId AND InbredSet.Name = %s AND "
"ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id AND "
"Tissue.Name = %s AND ProbeFreeze.TissueId = "
"Tissue.Id AND ProbeFreeze.InbredSetId = InbredSet.Id AND "
"ProbeSetFreeze.public > 0 "
"ORDER BY -ProbeSetFreeze.OrderList DESC, "
"ProbeSetFreeze.CreateTime DESC"), ("Mouse", "HLC", "mRNA"))
@pytest.mark.unit_test
@mock.patch('gn3.db.menu.build_datasets')
def test_build_types(self, datasets_mock):
"""Test that correct tissue metadata is returned"""
db_mock = mock.MagicMock()
datasets_mock.return_value = [
["112", 'HC_M2_0606_P',
"Hippocampus Consortium M430v2 (Jun06) PDNN"]
]
with db_mock.cursor() as cursor:
cursor.fetchall.return_value = (
('Mouse Tissue'), ('Human Tissue'), ('Rat Tissue')
)
self.assertEqual(
build_types(db_mock, 'mouse', 'random group'),
[['M', 'M', 'Molecular Traits'],
['H', 'H', 'Molecular Traits'],
['R', 'R', 'Molecular Traits']])
cursor.execute.assert_called_once_with((
"SELECT DISTINCT Tissue.Name "
"FROM ProbeFreeze, ProbeSetFreeze, InbredSet, "
"Tissue, Species WHERE Species.Name = %s "
"AND Species.Id = InbredSet.SpeciesId AND "
"InbredSet.Name = %s AND "
"ProbeFreeze.TissueId = Tissue.Id AND "
"ProbeFreeze.InbredSetId = InbredSet.Id AND "
"ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
"ORDER BY Tissue.Name"
), ("mouse", "random group"))
@pytest.mark.unit_test
@mock.patch('gn3.db.menu.build_types')
@mock.patch('gn3.db.menu.genotypes_exist')
@mock.patch('gn3.db.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(mock.MagicMock(), self.test_group,), expected_result)
@pytest.mark.unit_test
@mock.patch('gn3.db.menu.build_types')
@mock.patch('gn3.db.menu.genotypes_exist')
@mock.patch('gn3.db.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(mock.MagicMock(), self.test_group),
{'mouse': {}, 'human': {}})
@pytest.mark.unit_test
@mock.patch('gn3.db.menu.build_types')
@mock.patch('gn3.db.menu.genotypes_exist')
@mock.patch('gn3.db.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(mock.MagicMock(), self.test_group),
expected_result)
@pytest.mark.unit_test
@mock.patch('gn3.db.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(mock.MagicMock(), self.test_type), expected_result)
@pytest.mark.unit_test
@mock.patch('gn3.db.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(mock.MagicMock(), self.test_type), expected_result)
@pytest.mark.unit_test
@mock.patch('gn3.db.menu.get_datasets')
@mock.patch('gn3.db.menu.get_types')
@mock.patch('gn3.db.menu.get_groups')
@mock.patch('gn3.db.menu.get_all_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(mock.MagicMock()), expected_result)
@pytest.mark.unit_test
def test_phenotypes_exist_called_with_correct_query():
"""Test that phenotypes_exist is called with the correct query"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchone.return_value = None
phenotypes_exist(db_mock, "test")
cursor.execute.assert_called_with((
"SELECT Name FROM PublishFreeze "
"WHERE PublishFreeze.Name = %s"
), ("testPublish",))
@pytest.mark.unit_test
def test_genotypes_exist_called_with_correct_query():
"""Test that genotypes_exist is called with the correct query"""
db_mock = mock.MagicMock()
with db_mock.cursor() as cursor:
cursor.fetchone.return_value = None
genotypes_exist(db_mock, "test")
cursor.execute.assert_called_with((
"SELECT Name FROM GenoFreeze WHERE "
"GenoFreeze.Name = %s"
), ("testGeno",))