|
import unittest |
|
from unittest.mock import patch, Mock |
|
import json |
|
from io import StringIO |
|
from contextlib import redirect_stdout |
|
from utils.meldrx import MeldRxAPI |
|
|
|
class TestMeldRxAPI(unittest.TestCase): |
|
def setUp(self): |
|
"""Set up test fixtures before each test.""" |
|
self.client_id = "test_client_id" |
|
self.client_secret = "test_client_secret" |
|
self.workspace_id = "test_workspace_id" |
|
self.patient_id = "test_patient_id" |
|
self.api = MeldRxAPI(self.client_id, self.client_secret, self.workspace_id) |
|
|
|
def tearDown(self): |
|
"""Clean up after each test.""" |
|
self.api.close() |
|
|
|
@patch('meldrx.requests.Session.post') |
|
def test_authenticate_success(self, mock_post): |
|
"""Test successful authentication.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_response.json.return_value = {"access_token": "test_token"} |
|
mock_post.return_value = mock_response |
|
|
|
result = self.api.authenticate() |
|
self.assertTrue(result) |
|
self.assertEqual(self.api.access_token, "test_token") |
|
|
|
@patch('meldrx.requests.Session.post') |
|
def test_authenticate_failure(self, mock_post): |
|
"""Test authentication failure.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 401 |
|
mock_response.raise_for_status.side_effect = requests.exceptions.HTTPError("Unauthorized") |
|
mock_post.return_value = mock_response |
|
|
|
with redirect_stdout(StringIO()) as output: |
|
result = self.api.authenticate() |
|
self.assertFalse(result) |
|
self.assertIsNone(self.api.access_token) |
|
self.assertIn("Authentication failed: Unauthorized", output.getvalue()) |
|
|
|
@patch('meldrx.requests.Session.get') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_get_patients_success(self, mock_auth, mock_get): |
|
"""Test successful retrieval of patients from FHIR API.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_response.text = json.dumps({"resourceType": "Bundle", "entry": [{"resource": {"id": self.patient_id}}]}) |
|
mock_response.json.return_value = json.loads(mock_response.text) |
|
mock_get.return_value = mock_response |
|
|
|
result = self.api.get_patients() |
|
self.assertIsNotNone(result) |
|
self.assertEqual(result["entry"][0]["resource"]["id"], self.patient_id) |
|
|
|
@patch('meldrx.requests.Session.get') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=False) |
|
def test_get_patients_auth_failure(self, mock_auth, mock_get): |
|
"""Test patient retrieval fails due to authentication.""" |
|
with redirect_stdout(StringIO()) as output: |
|
result = self.api.get_patients() |
|
self.assertIsNone(result) |
|
mock_get.assert_not_called() |
|
self.assertIn("Cannot proceed without authentication", output.getvalue()) |
|
|
|
@patch('meldrx.requests.Session.post') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_create_virtual_workspace_success(self, mock_auth, mock_post): |
|
"""Test successful creation of a virtual workspace.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 201 |
|
mock_post.return_value = mock_response |
|
|
|
result = self.api.create_virtual_workspace() |
|
self.assertTrue(result) |
|
|
|
@patch('meldrx.requests.Session.get') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_get_mips_patients_success(self, mock_auth, mock_get): |
|
"""Test successful retrieval of patients from MIPS API.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_response.text = json.dumps({"resourceType": "Bundle", "entry": [{"resource": {"id": self.patient_id}}]}) |
|
mock_response.json.return_value = json.loads(mock_response.text) |
|
mock_get.return_value = mock_response |
|
|
|
result = self.api.get_mips_patients() |
|
self.assertIsNotNone(result) |
|
self.assertEqual(result["entry"][0]["resource"]["id"], self.patient_id) |
|
|
|
@patch('meldrx.requests.Session.get') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_get_mips_patient_by_id_success(self, mock_auth, mock_get): |
|
"""Test successful retrieval of a patient by ID from MIPS API.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_response.text = json.dumps({"resourceType": "Patient", "id": self.patient_id}) |
|
mock_response.json.return_value = json.loads(mock_response.text) |
|
mock_get.return_value = mock_response |
|
|
|
result = self.api.get_mips_patient_by_id(self.patient_id) |
|
self.assertIsNotNone(result) |
|
self.assertEqual(result["id"], self.patient_id) |
|
|
|
@patch('meldrx.requests.Session.get') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_get_mips_encounters_success(self, mock_auth, mock_get): |
|
"""Test successful retrieval of encounters from MIPS API.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_response.text = json.dumps({"resourceType": "Bundle", "entry": [{"resource": {"id": "enc1"}}]}) |
|
mock_response.json.return_value = json.loads(mock_response.text) |
|
mock_get.return_value = mock_response |
|
|
|
result = self.api.get_mips_encounters(self.patient_id) |
|
self.assertIsNotNone(result) |
|
self.assertEqual(result["entry"][0]["resource"]["id"], "enc1") |
|
|
|
@patch('meldrx.requests.Session.put') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_update_fhir_patient_success(self, mock_auth, mock_put): |
|
"""Test successful update of patient data in FHIR API.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_put.return_value = mock_response |
|
|
|
patient_data = {"resourceType": "Patient", "id": self.patient_id, "name": [{"family": "Doe"}]} |
|
result = self.api.update_fhir_patient(self.patient_id, patient_data) |
|
self.assertTrue(result) |
|
|
|
@patch('meldrx.requests.Session.put') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=True) |
|
def test_update_mips_patient_success(self, mock_auth, mock_put): |
|
"""Test successful update of patient data in MIPS API.""" |
|
mock_response = Mock() |
|
mock_response.status_code = 200 |
|
mock_put.return_value = mock_response |
|
|
|
patient_data = {"resourceType": "Patient", "id": self.patient_id, "name": [{"family": "Doe"}]} |
|
result = self.api.update_mips_patient(self.patient_id, patient_data) |
|
self.assertTrue(result) |
|
|
|
@patch('meldrx.requests.Session.put') |
|
@patch('meldrx.MeldRxAPI.authenticate', return_value=False) |
|
def test_update_fhir_patient_auth_failure(self, mock_auth, mock_put): |
|
"""Test patient update fails due to authentication in FHIR API.""" |
|
patient_data = {"resourceType": "Patient", "id": self.patient_id} |
|
with redirect_stdout(StringIO()) as output: |
|
result = self.api.update_fhir_patient(self.patient_id, patient_data) |
|
self.assertFalse(result) |
|
mock_put.assert_not_called() |
|
self.assertIn("Cannot proceed without authentication", output.getvalue()) |
|
|
|
if __name__ == "__main__": |
|
unittest.main(verbosity=2) |