"""Test cases for gn3.db.case_attributes.py"""
import pytest
from pytest_mock import MockFixture
from gn3.db.case_attributes import get_unreviewed_diffs
from gn3.db.case_attributes import get_case_attributes
from gn3.db.case_attributes import insert_case_attribute_audit
from gn3.db.case_attributes import approve_case_attribute
from gn3.db.case_attributes import reject_case_attribute
@pytest.mark.unit_test
def test_get_case_attributes(mocker: MockFixture) -> None:
"""Test that all the case attributes are fetched correctly"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
cursor.fetchall.return_value = (
(1, "Condition", None),
(2, "Tissue", None),
(3, "Age", "Cum sociis natoque penatibus et magnis dis"),
(4, "Condition", "Description A"),
(5, "Condition", "Description B"),
)
results = get_case_attributes(mock_conn)
cursor.execute.assert_called_once_with(
"SELECT Id, Name, Description FROM CaseAttribute"
)
assert results == (
(1, "Condition", None),
(2, "Tissue", None),
(3, "Age", "Cum sociis natoque penatibus et magnis dis"),
(4, "Condition", "Description A"),
(5, "Condition", "Description B"),
)
@pytest.mark.unit_test
def test_get_unreviewed_diffs(mocker: MockFixture) -> None:
"""Test that the correct query is called when fetching unreviewed
case-attributes diff"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
_ = get_unreviewed_diffs(mock_conn)
cursor.fetchall.return_value = ((1, "editor", "diff_data_1"),)
cursor.execute.assert_called_once_with(
"SELECT id, editor, json_diff_data FROM "
"caseattributes_audit WHERE status = 'review'"
)
@pytest.mark.unit_test
def test_insert_case_attribute_audit(mocker: MockFixture) -> None:
"""Test that the updating case attributes uses the correct query"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
_ = insert_case_attribute_audit(
mock_conn, status="review", author="Author", data="diff_data"
)
cursor.execute.assert_called_once_with(
"INSERT INTO caseattributes_audit "
"(status, editor, json_diff_data) "
"VALUES (%s, %s, %s)",
("review", "Author", "diff_data"),
)
@pytest.mark.unit_test
def test_reject_case_attribute(mocker: MockFixture) -> None:
"""Test rejecting a case-attribute"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
_ = reject_case_attribute(
mock_conn,
case_attr_audit_id=1,
)
cursor.execute.assert_called_once_with(
"UPDATE caseattributes_audit SET "
"status = 'rejected' WHERE id = %s",
(1,),
)
@pytest.mark.unit_test
def test_approve_inserting_case_attribute(mocker: MockFixture) -> None:
"""Test approving inserting a case-attribute"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
type(cursor).rowcount = 1
cursor.fetchone.return_value = (
"""
{"Insert": {"name": "test", "description": "Random Description"}}
""",
)
_ = approve_case_attribute(
mock_conn,
case_attr_audit_id=3,
)
calls = [
mocker.call(
"SELECT json_diff_data FROM caseattributes_audit "
"WHERE id = %s",
(3,),
),
mocker.call(
"INSERT INTO CaseAttribute "
"(Name, Description) VALUES "
"(%s, %s)",
(
"test",
"Random Description",
),
),
mocker.call(
"UPDATE caseattributes_audit SET "
"status = 'approved' WHERE id = %s",
(3,),
),
]
cursor.execute.assert_has_calls(calls, any_order=False)
@pytest.mark.unit_test
def test_approve_deleting_case_attribute(mocker: MockFixture) -> None:
"""Test deleting a case-attribute"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
type(cursor).rowcount = 1
cursor.fetchone.return_value = (
"""
{"Deletion": {"id": "12", "name": "test", "description": ""}}
""",
)
_ = approve_case_attribute(
mock_conn,
case_attr_audit_id=3,
)
calls = [
mocker.call(
"SELECT json_diff_data FROM caseattributes_audit "
"WHERE id = %s",
(3,),
),
mocker.call("DELETE FROM CaseAttribute WHERE Id = %s", ("12",)),
mocker.call(
"UPDATE caseattributes_audit SET "
"status = 'approved' WHERE id = %s",
(3,),
),
]
cursor.execute.assert_has_calls(calls, any_order=False)
@pytest.mark.unit_test
def test_approve_modifying_case_attribute(mocker: MockFixture) -> None:
"""Test modifying a case-attribute"""
mock_conn = mocker.MagicMock()
with mock_conn.cursor() as cursor:
type(cursor).rowcount = 1
cursor.fetchone.return_value = (
"""
{
"id": "12",
"Modification": {
"description": {
"Current": "Test",
"Original": "A"
},
"name": {
"Current": "Height (A)",
"Original": "Height"
}
}
}""",
)
_ = approve_case_attribute(
mock_conn,
case_attr_audit_id=3,
)
calls = [
mocker.call(
"SELECT json_diff_data FROM caseattributes_audit "
"WHERE id = %s",
(3,),
),
mocker.call(
"UPDATE CaseAttribute SET "
"Description = %s WHERE Id = %s",
(
"Test",
"12",
),
),
mocker.call(
"UPDATE CaseAttribute SET "
"Name = %s WHERE Id = %s",
(
"Height (A)",
"12",
),
),
mocker.call(
"UPDATE caseattributes_audit SET "
"status = 'approved' WHERE id = %s",
(3,),
),
]
cursor.execute.assert_has_calls(calls, any_order=False)