diff options
| -rw-r--r-- | gn3/api/case_attributes.py | 2 | ||||
| -rw-r--r-- | gn3/db/case_attributes.py | 14 | ||||
| -rw-r--r-- | tests/unit/db/test_case_attributes.py | 61 |
3 files changed, 76 insertions, 1 deletions
diff --git a/gn3/api/case_attributes.py b/gn3/api/case_attributes.py index b7f50ad..2f01202 100644 --- a/gn3/api/case_attributes.py +++ b/gn3/api/case_attributes.py @@ -17,7 +17,7 @@ from MySQLdb.cursors import DictCursor from gn3.db.case_attributes import ( CaseAttributeEdit, EditStatus, - queue_edit) + view_change, from authlib.integrations.flask_oauth2.errors import _HTTPException from flask import ( jsonify, diff --git a/gn3/db/case_attributes.py b/gn3/db/case_attributes.py index 48d77c7..4bdb654 100644 --- a/gn3/db/case_attributes.py +++ b/gn3/db/case_attributes.py @@ -144,6 +144,20 @@ def __fetch_case_attrs_changes__(cursor, change_ids: tuple) -> list: return results +def view_change(cursor, change_id: int) -> dict: + cursor.execute( + "SELECT json_diff_data " + "FROM caseattributes_audit " + "WHERE id = %s", + (change_id,) + ) + json_diff_data, _ = cursor.fetchone() + if json_diff_data: + json_diff_data = json.loads(json_diff_data) + return json_diff_data + return {} + + def get_changes(cursor, inbredset_id: int, directory: Path) -> dict: directory = f"{directory}/case-attributes/{inbredset_id}" if not os.path.exists(directory): diff --git a/tests/unit/db/test_case_attributes.py b/tests/unit/db/test_case_attributes.py index 790dbe6..3580f93 100644 --- a/tests/unit/db/test_case_attributes.py +++ b/tests/unit/db/test_case_attributes.py @@ -4,12 +4,14 @@ import pytest import pickle import tempfile import os +import json from pathlib import Path from pytest_mock import MockFixture from gn3.db.case_attributes import queue_edit from gn3.db.case_attributes import ( CaseAttributeEdit, EditStatus, + view_change, update_case_attribute ) @@ -125,3 +127,62 @@ def test_update_case_attribute_no_modifications(mocker: MockFixture) -> None: ) change_id = 28 assert not update_case_attribute(mock_cursor, TMPDIR, change_id, edit) + + +@pytest.mark.unit_test +def test_view_change(mocker: MockFixture) -> None: + """Test view_change function.""" + sample_json_diff = { + "inbredset_id": 1, + "Modifications": { + "Original": { + "B6D2F1": {"Epoch": "10au"}, + "BXD100": {"Epoch": "3b"}, + "BXD101": {"SeqCvge": "29"}, + "BXD102": {"Epoch": "3b"}, + "BXD108": {"SeqCvge": ""} + }, + "Current": { + "B6D2F1": {"Epoch": "10"}, + "BXD100": {"Epoch": "3"}, + "BXD101": {"SeqCvge": "2"}, + "BXD102": {"Epoch": "3"}, + "BXD108": {"SeqCvge": "oo"} + } + } + } + CHANGE_ID = 28 + mock_cursor, mock_conn = mocker.MagicMock(), mocker.MagicMock() + mock_conn.cursor.return_value = mock_cursor + mock_cursor.fetchone.return_value = (json.dumps(sample_json_diff), None) + assert view_change(mock_cursor, CHANGE_ID) == sample_json_diff + mock_cursor.execute.assert_called_once_with( + "SELECT json_diff_data FROM caseattributes_audit WHERE id = %s", + (CHANGE_ID,)) + mock_cursor.fetchone.assert_called_once() + + +@pytest.mark.unit_test +def test_view_change_invalid_json(mocker: MockFixture) -> None: + """Test invalid json when view_change is called""" + CHANGE_ID = 28 + mock_cursor, mock_conn = mocker.MagicMock(), mocker.MagicMock() + mock_conn.cursor.return_value = mock_cursor + mock_cursor.fetchone.return_value = ("invalid_json_string", None) + with pytest.raises(json.JSONDecodeError): + view_change(mock_cursor, CHANGE_ID) + mock_cursor.execute.assert_called_once_with( + "SELECT json_diff_data FROM caseattributes_audit WHERE id = %s", + (CHANGE_ID,)) + + +@pytest.mark.unit_test +def test_view_change_no_data(mocker: MockFixture) -> None: + "Test no result when view_change is called" + CHANGE_ID = 28 + mock_cursor, mock_conn = mocker.MagicMock(), mocker.MagicMock() + mock_cursor.fetchone.return_value = (None, None) + assert view_change(mock_cursor, CHANGE_ID) == {} + mock_cursor.execute.assert_called_once_with( + "SELECT json_diff_data FROM caseattributes_audit WHERE id = %s", + (CHANGE_ID,)) |
