# -*- coding: utf-8 -*-
"""Tests wqflask/base/trait.py"""
import unittest
from unittest import mock
from base.trait import GeneralTrait
from base.trait import retrieve_trait_info
class TestResponse:
"""Mock Test Response after a request"""
@property
def content(self):
"""Mock the content from Requests.get(params).content"""
return "[1, 2, 3, 4]"
class TestNilResponse:
"""Mock Test Response after a request"""
@property
def content(self):
"""Mock the content from Requests.get(params).content"""
return "{}"
class MockTrait(GeneralTrait):
@property
def wikidata_alias_fmt(self):
return "Mock alias"
class TestRetrieveTraitInfo(unittest.TestCase):
"""Tests for 'retrieve_trait_info'"""
@mock.patch('base.trait.database_connection')
def test_retrieve_trait_info_with_empty_dataset(self, mock_db):
"""Test that an exception is raised when dataset is empty"""
conn = mock.MagicMock()
mock_db.return_value.__enter__.return_value = conn
with self.assertRaises(ValueError):
retrieve_trait_info(trait=mock.MagicMock(),
dataset={})
@mock.patch('base.trait.requests.get')
@mock.patch('base.trait.g', mock.Mock())
@mock.patch('base.trait.database_connection')
def test_retrieve_trait_info_with_empty_trait_info(self,
mock_db,
requests_mock):
"""Empty trait info"""
conn = mock.MagicMock()
cursor = mock.MagicMock()
cursor.fetchone.return_value = {}
conn.cursor.return_value.__enter__.return_value = cursor
mock_db.return_value.__enter__.return_value = conn
requests_mock.return_value = TestNilResponse()
with self.assertRaises(KeyError):
retrieve_trait_info(trait=mock.MagicMock(),
dataset=mock.MagicMock())
@mock.patch('base.trait.requests.get')
@mock.patch('base.trait.g', mock.Mock())
@mock.patch('base.trait.database_connection')
def test_retrieve_trait_info_with_non_empty_trait_info(self,
mock_db,
requests_mock):
"""Test that attributes are set"""
mock_dataset = mock.MagicMock()
conn = mock.MagicMock()
cursor = mock.MagicMock()
cursor.fetchone.return_value = [1, 2, 3, 4]
conn.cursor.return_value.__enter__.return_value = cursor
mock_db.return_value.__enter__.return_value = conn
requests_mock.return_value = TestResponse()
type(mock_dataset).display_fields = mock.PropertyMock(
return_value=["a", "b", "c", "d"])
test_trait = retrieve_trait_info(trait=MockTrait(dataset=mock_dataset),
dataset=mock_dataset)
self.assertEqual(test_trait.a, 1)
self.assertEqual(test_trait.b, 2)
self.assertEqual(test_trait.c, 3)
self.assertEqual(test_trait.d, 4)
@mock.patch('base.trait.requests.get')
@mock.patch('base.trait.g', mock.Mock())
@mock.patch('base.trait.database_connection')
def test_retrieve_trait_info_utf8_parsing(self,
mock_db,
requests_mock):
"""Test that utf-8 strings are parsed correctly"""
utf_8_string = "test_string"
conn = mock.MagicMock()
mock_db.return_value.__enter__.return_value = conn
mock_dataset = mock.MagicMock()
requests_mock.return_value = TestResponse()
type(mock_dataset).display_fields = mock.PropertyMock(
return_value=["a", "b", "c", "d"])
type(mock_dataset).type = 'Publish'
mock_trait = MockTrait(
dataset=mock_dataset,
pre_publication_description=utf_8_string
)
trait_attrs = {
"group_code": "test_code",
"pre_publication_description": "test_pre_pub",
"pre_publication_abbreviation": "ファイルを画面毎に見て行くには、次のコマンドを使います。",
"post_publication_description": None,
"pubmed_id": None,
'year': "2020",
"authors": "Jane Doe かいと",
}
for key, val in list(trait_attrs.items()):
setattr(mock_trait, key, val)
test_trait = retrieve_trait_info(trait=mock_trait,
dataset=mock_dataset)
self.assertEqual(test_trait.abbreviation,
"ファイルを画面毎に見て行くには、次のコマンドを使います。")
self.assertEqual(test_trait.authors,
"Jane Doe かいと")
@unittest.skip("Too complicated")
@mock.patch('base.trait.requests.get')
@mock.patch('base.trait.database_connection')
@mock.patch('base.trait.get_resource_id')
def test_retrieve_trait_info_with_non_empty_lrs(self,
resource_id_mock,
mock_db,
requests_mock):
"""Test retrieve trait info when lrs has a value"""
resource_id_mock.return_value = 1
conn = mock.MagicMock()
mock_db.return_value.__enter__.return_value = conn
with conn.cursor() as cursor:
cursor.fetchone.side_effect = [
# trait_info = g.db.execute(query).fetchone()
[1, 2, 3, 4],
# trait_qtl = g.db.execute(query).fetchone()
[1, 2.37, 3, 4, 5],
# trait_info = g.db.execute(query).fetchone()
[2.7333, 2.1204]
]
requests_mock.return_value = None
mock_dataset = mock.MagicMock()
type(mock_dataset).display_fields = mock.PropertyMock(
return_value=["a", "b", "c", "d"])
type(mock_dataset).type = "ProbeSet"
type(mock_dataset).name = "RandomName"
mock_trait = MockTrait(
dataset=mock_dataset,
pre_publication_description="test_string"
)
trait_attrs = {
"description": "some description",
"probe_target_description": "some description",
"cellid": False,
"chr": 2.733,
"mb": 2.1204
}
for key, val in list(trait_attrs.items()):
setattr(mock_trait, key, val)
test_trait = retrieve_trait_info(trait=mock_trait,
dataset=mock_dataset,
get_qtl_info=True)
self.assertEqual(test_trait.LRS_score_repr,
"2.4")
@unittest.skip("Too complicated")
@mock.patch('base.trait.requests.get')
@mock.patch('base.trait.g')
@mock.patch('base.trait.get_resource_id')
def test_retrieve_trait_info_with_empty_lrs_field(self,
resource_id_mock,
g_mock,
requests_mock):
"""Test retrieve trait info with empty lrs field"""
resource_id_mock.return_value = 1
g_mock.db.execute.return_value.fetchone = mock.Mock()
g_mock.db.execute.return_value.fetchone.side_effect = [
[1, 2, 3, 4], # trait_info = g.db.execute(query).fetchone()
[1, None, 3, 4, 5], # trait_qtl = g.db.execute(query).fetchone()
[2, 3] # trait_info = g.db.execute(query).fetchone()
]
requests_mock.return_value = None
mock_dataset = mock.MagicMock()
type(mock_dataset).display_fields = mock.PropertyMock(
return_value=["a", "b", "c", "d"])
type(mock_dataset).type = "ProbeSet"
type(mock_dataset).name = "RandomName"
mock_trait = MockTrait(
dataset=mock_dataset,
pre_publication_description="test_string"
)
trait_attrs = {
"description": "some description",
"probe_target_description": "some description",
"cellid": False,
"chr": 2.733,
"mb": 2.1204
}
for key, val in list(trait_attrs.items()):
setattr(mock_trait, key, val)
test_trait = retrieve_trait_info(trait=mock_trait,
dataset=mock_dataset,
get_qtl_info=True)
self.assertEqual(test_trait.LRS_score_repr,
"N/A")
self.assertEqual(test_trait.LRS_location_repr,
"Chr2: 3.000000")
@unittest.skip("Too complicated")
@mock.patch('base.trait.requests.get')
@mock.patch('base.trait.g')
@mock.patch('base.trait.get_resource_id')
def test_retrieve_trait_info_with_empty_chr_field(self,
resource_id_mock,
g_mock,
requests_mock):
"""Test retrieve trait info with empty chr field"""
resource_id_mock.return_value = 1
g_mock.db.execute.return_value.fetchone = mock.Mock()
g_mock.db.execute.return_value.fetchone.side_effect = [
[1, 2, 3, 4], # trait_info = g.db.execute(query).fetchone()
[1, 2, 3, 4, 5], # trait_qtl = g.db.execute(query).fetchone()
[None, 3] # trait_info = g.db.execute(query).fetchone()
]
requests_mock.return_value = None
mock_dataset = mock.MagicMock()
type(mock_dataset).display_fields = mock.PropertyMock(
return_value=["a", "b", "c", "d"])
type(mock_dataset).type = "ProbeSet"
type(mock_dataset).name = "RandomName"
mock_trait = MockTrait(
dataset=mock_dataset,
pre_publication_description="test_string"
)
trait_attrs = {
"description": "some description",
"probe_target_description": "some description",
"cellid": False,
"chr": 2.733,
"mb": 2.1204
}
for key, val in list(trait_attrs.items()):
setattr(mock_trait, key, val)
test_trait = retrieve_trait_info(trait=mock_trait,
dataset=mock_dataset,
get_qtl_info=True)
self.assertEqual(test_trait.LRS_score_repr,
"N/A")
self.assertEqual(test_trait.LRS_location_repr,
"N/A")