aboutsummaryrefslogtreecommitdiff
"""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)