|
|
import pytest |
|
|
from unittest.mock import patch, MagicMock |
|
|
import requests |
|
|
from openfda_client import get_top_adverse_events, get_drug_event_pair_frequency, cache |
|
|
|
|
|
@pytest.fixture(autouse=True) |
|
|
def clear_cache(): |
|
|
"""Fixture to clear the cache before each test.""" |
|
|
cache.clear() |
|
|
|
|
|
def mock_response(status_code=200, json_data=None, raise_for_status=None): |
|
|
"""Helper function to create a mock response object.""" |
|
|
mock_resp = MagicMock() |
|
|
mock_resp.status_code = status_code |
|
|
mock_resp.json.return_value = json_data |
|
|
if raise_for_status: |
|
|
mock_resp.raise_for_status.side_effect = raise_for_status |
|
|
return mock_resp |
|
|
|
|
|
@patch('requests.get') |
|
|
def test_get_top_adverse_events_success(mock_get): |
|
|
"""Test successful API call for top adverse events.""" |
|
|
mock_json = {"results": [{"term": "Nausea", "count": 100}]} |
|
|
mock_get.return_value = mock_response(json_data=mock_json) |
|
|
|
|
|
result = get_top_adverse_events("testdrug") |
|
|
|
|
|
assert result == mock_json |
|
|
mock_get.assert_called_once() |
|
|
|
|
|
@patch('requests.get') |
|
|
def test_get_top_adverse_events_404(mock_get): |
|
|
"""Test 404 Not Found error for top adverse events.""" |
|
|
http_error = requests.exceptions.HTTPError("404 Client Error") |
|
|
mock_get.return_value = mock_response(status_code=404, raise_for_status=http_error) |
|
|
|
|
|
result = get_top_adverse_events("nonexistentdrug") |
|
|
|
|
|
assert "error" in result |
|
|
assert "No data found" in result["error"] |
|
|
|
|
|
@patch('requests.get') |
|
|
def test_get_drug_event_pair_frequency_success(mock_get): |
|
|
"""Test successful API call for drug-event pair frequency.""" |
|
|
mock_json = {"meta": {"results": {"total": 50}}} |
|
|
mock_get.return_value = mock_response(json_data=mock_json) |
|
|
|
|
|
result = get_drug_event_pair_frequency("testdrug", "testevent") |
|
|
|
|
|
assert result == mock_json |
|
|
mock_get.assert_called_once() |
|
|
|
|
|
def test_empty_drug_name_returns_error(): |
|
|
"""Test that empty inputs are handled correctly without calling the API.""" |
|
|
result = get_top_adverse_events("") |
|
|
assert "error" in result |
|
|
|
|
|
result2 = get_drug_event_pair_frequency("", "testevent") |
|
|
assert "error" in result2 |
|
|
|
|
|
@patch('requests.get') |
|
|
def test_caching_works(mock_get): |
|
|
"""Test that results are cached to avoid repeated API calls.""" |
|
|
mock_json = {"results": [{"term": "Headache", "count": 200}]} |
|
|
mock_get.return_value = mock_response(json_data=mock_json) |
|
|
|
|
|
|
|
|
get_top_adverse_events("cacheddrug") |
|
|
assert mock_get.call_count == 1 |
|
|
|
|
|
|
|
|
get_top_adverse_events("cacheddrug") |
|
|
assert mock_get.call_count == 1 |
|
|
|
|
|
|
|
|
get_top_adverse_events("cacheddrug", limit=20) |
|
|
assert mock_get.call_count == 2 |
|
|
|