File size: 2,809 Bytes
dd19932
 
 
d8e24c3
dd19932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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)

    # First call - should call the API
    get_top_adverse_events("cacheddrug")
    assert mock_get.call_count == 1

    # Second call - should hit the cache
    get_top_adverse_events("cacheddrug")
    assert mock_get.call_count == 1 # Still 1, not 2

    # Call with different params - should trigger a new API call
    get_top_adverse_events("cacheddrug", limit=20)
    assert mock_get.call_count == 2