"""Tests for gn3.db.sample_data"""
import pytest
import gn3
from gn3.db.sample_data import __extract_actions
from gn3.db.sample_data import delete_sample_data
from gn3.db.sample_data import insert_sample_data
from gn3.db.sample_data import update_sample_data
@pytest.mark.unit_test
def test_insert_sample_data(mocker):
"""Test that inserts work properly"""
mock_conn = mocker.MagicMock()
strain_id, data_id, inbredset_id = 1, 17373, 20
with mock_conn.cursor() as cursor:
cursor.fetchone.side_effect = (
0,
[
19,
],
0,
)
mocker.patch(
"gn3.db.sample_data.get_sample_data_ids",
return_value=(strain_id, data_id, inbredset_id),
)
insert_sample_data(
conn=mock_conn,
trait_name=35,
data="BXD1,18,3,0,M",
csv_header="Strain Name,Value,SE,Count,Sex",
phenotype_id=10007,
)
calls = [
mocker.call(
"SELECT Id FROM PublishData where Id = %s " "AND StrainId = %s",
(data_id, strain_id),
),
mocker.call(
"INSERT INTO PublishData " "(StrainId, Id, value) VALUES (%s, %s, %s)",
(strain_id, data_id, "18"),
),
mocker.call(
"INSERT INTO PublishSE "
"(StrainId, DataId, error) VALUES (%s, %s, %s)",
(strain_id, data_id, "3"),
),
mocker.call(
"INSERT INTO NStrain " "(StrainId, DataId, count) VALUES (%s, %s, %s)",
(strain_id, data_id, "0"),
),
mocker.call("SELECT Id FROM CaseAttribute WHERE Name = %s", ("Sex",)),
mocker.call(
"SELECT StrainId FROM CaseAttributeXRefNew "
"WHERE StrainId = %s AND "
"CaseAttributeId = %s AND InbredSetId = %s",
(strain_id, 19, inbredset_id),
),
mocker.call(
"INSERT INTO CaseAttributeXRefNew "
"(StrainId, CaseAttributeId, Value, "
"InbredSetId) VALUES (%s, %s, %s, %s)",
(strain_id, 19, "M", inbredset_id),
),
]
cursor.execute.assert_has_calls(calls, any_order=False)
@pytest.mark.unit_test
def test_delete_sample_data(mocker):
"""Test that deletes work properly"""
mock_conn = mocker.MagicMock()
strain_id, data_id, inbredset_id = 1, 17373, 20
with mock_conn.cursor() as cursor:
cursor.fetchone.side_effect = (
0,
[
19,
],
0,
)
mocker.patch(
"gn3.db.sample_data.get_sample_data_ids",
return_value=(strain_id, data_id, inbredset_id),
)
delete_sample_data(
conn=mock_conn,
trait_name=35,
data="BXD1,18,3,0,M",
csv_header="Strain Name,Value,SE,Count,Sex",
phenotype_id=10007,
)
calls = [
mocker.call(
"DELETE FROM PublishData WHERE " "StrainId = %s AND Id = %s",
(strain_id, data_id),
),
mocker.call(
"DELETE FROM PublishSE WHERE " "StrainId = %s AND DataId = %s",
(strain_id, data_id),
),
mocker.call(
"DELETE FROM NStrain WHERE " "StrainId = %s AND DataId = %s",
(strain_id, data_id),
),
mocker.call(
"DELETE FROM CaseAttributeXRefNew WHERE "
"StrainId = %s AND CaseAttributeId = "
"(SELECT CaseAttributeId FROM "
"CaseAttribute WHERE Name = %s) "
"AND InbredSetId = %s",
(strain_id, "Sex", inbredset_id),
),
]
cursor.execute.assert_has_calls(calls, any_order=False)
@pytest.mark.unit_test
def test_extract_actions():
"""Test that extracting the correct dict of 'actions' work properly"""
assert __extract_actions(
original_data="BXD1,18,x,0,x",
updated_data="BXD1,x,2,1,F",
csv_header="Strain Name,Value,SE,Count,Sex",
) == {
"delete": {"data": "BXD1,18", "csv_header": "Strain Name,Value"},
"insert": {"data": "BXD1,2,F", "csv_header": "Strain Name,SE,Sex"},
"update": {"data": "BXD1,1", "csv_header": "Strain Name,Count"},
}
assert __extract_actions(
original_data="BXD1,18,x,0,x",
updated_data="BXD1,19,2,1,F",
csv_header="Strain Name,Value,SE,Count,Sex",
) == {
"delete": None,
"insert": {"data": "BXD1,2,F", "csv_header": "Strain Name,SE,Sex"},
"update": {"data": "BXD1,19,1", "csv_header": "Strain Name,Value,Count"},
}
@pytest.mark.unit_test
def test_update_sample_data(mocker):
"""Test that updates work properly"""
mock_conn = mocker.MagicMock()
strain_id, data_id, inbredset_id = 1, 17373, 20
with mock_conn.cursor() as cursor:
# cursor.fetchone.side_effect = (0, [19, ], 0)
mocker.patch(
"gn3.db.sample_data.get_sample_data_ids",
return_value=(strain_id, data_id, inbredset_id),
)
mocker.patch("gn3.db.sample_data.insert_sample_data", return_value=1)
mocker.patch("gn3.db.sample_data.delete_sample_data", return_value=1)
update_sample_data(
conn=mock_conn,
trait_name=35,
original_data="BXD1,18,x,0,x",
updated_data="BXD1,x,2,1,F",
csv_header="Strain Name,Value,SE,Count,Sex",
phenotype_id=10007,
)
# pylint: disable=[E1101]
gn3.db.sample_data.insert_sample_data.assert_called_once_with(
conn=mock_conn,
trait_name=35,
data="BXD1,2,F",
csv_header="Strain Name,SE,Sex",
phenotype_id=10007,
)
# pylint: disable=[E1101]
gn3.db.sample_data.delete_sample_data.assert_called_once_with(
conn=mock_conn,
trait_name=35,
data="BXD1,18",
csv_header="Strain Name,Value",
phenotype_id=10007,
)
cursor.execute.assert_has_calls(
[
mocker.call(
"UPDATE NStrain SET count = %s "
"WHERE StrainId = %s AND DataId = %s",
("1", strain_id, data_id),
)
],
any_order=False,
)