Skip to main content
Glama
test_drug_approvals.py12.6 kB
"""Tests for FDA drug approval search and retrieval.""" from unittest.mock import patch import pytest from biomcp.openfda.drug_approvals import ( get_drug_approval, search_drug_approvals, ) class TestDrugApprovals: """Test FDA drug approval functions.""" @pytest.mark.asyncio async def test_search_drug_approvals_success(self): """Test successful drug approval search.""" mock_response = { "meta": {"results": {"skip": 0, "limit": 10, "total": 2}}, "results": [ { "application_number": "BLA125514", "openfda": { "brand_name": ["KEYTRUDA"], "generic_name": ["PEMBROLIZUMAB"], }, "products": [ { "brand_name": "KEYTRUDA", "dosage_form": "INJECTION", "strength": "100MG/4ML", "marketing_status": "Prescription", } ], "sponsor_name": "MERCK SHARP DOHME", "submissions": [ { "submission_type": "ORIG", "submission_number": "1", "submission_status": "AP", "submission_status_date": "20140904", "review_priority": "PRIORITY", } ], }, { "application_number": "NDA208716", "openfda": { "brand_name": ["VENCLEXTA"], "generic_name": ["VENETOCLAX"], }, "products": [ { "brand_name": "VENCLEXTA", "dosage_form": "TABLET", "strength": "100MG", "marketing_status": "Prescription", } ], "sponsor_name": "ABBVIE INC", "submissions": [ { "submission_type": "ORIG", "submission_number": "1", "submission_status": "AP", "submission_status_date": "20160411", "review_priority": "PRIORITY", } ], }, ], } with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (mock_response, None) result = await search_drug_approvals( drug="pembrolizumab", limit=10 ) # Check that result contains expected drug names assert "KEYTRUDA" in result assert "PEMBROLIZUMAB" in result assert "BLA125514" in result assert "MERCK" in result # Check for disclaimer assert "FDA Data Notice" in result # Check summary statistics assert "Total Records Found**: 2 records" in result @pytest.mark.asyncio async def test_search_drug_approvals_no_results(self): """Test drug approval search with no results.""" mock_response = { "meta": {"results": {"skip": 0, "limit": 10, "total": 0}}, "results": [], } with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (mock_response, None) result = await search_drug_approvals( drug="nonexistentdrug123", limit=10 ) assert "No drug approval records found" in result @pytest.mark.asyncio async def test_search_drug_approvals_api_error(self): """Test drug approval search with API error.""" with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (None, "API rate limit exceeded") result = await search_drug_approvals(drug="pembrolizumab") assert "Error searching drug approvals" in result assert "API rate limit exceeded" in result @pytest.mark.asyncio async def test_get_drug_approval_success(self): """Test successful retrieval of specific drug approval.""" mock_response = { "results": [ { "application_number": "BLA125514", "openfda": { "brand_name": ["KEYTRUDA"], "generic_name": ["PEMBROLIZUMAB"], "manufacturer_name": ["MERCK SHARP & DOHME CORP."], "substance_name": ["PEMBROLIZUMAB"], "product_type": ["HUMAN PRESCRIPTION DRUG"], }, "sponsor_name": "MERCK SHARP DOHME", "products": [ { "product_number": "001", "brand_name": "KEYTRUDA", "dosage_form": "INJECTION", "strength": "100MG/4ML", "marketing_status": "Prescription", "te_code": "AB", } ], "submissions": [ { "submission_type": "ORIG", "submission_number": "1", "submission_status": "AP", "submission_status_date": "20140904", "submission_class_code": "N", "review_priority": "PRIORITY", "submission_public_notes": "APPROVAL FOR ADVANCED MELANOMA", }, { "submission_type": "SUPPL", "submission_number": "2", "submission_status": "AP", "submission_status_date": "20151002", "submission_class_code": "S", "review_priority": "PRIORITY", "submission_public_notes": "NSCLC INDICATION", }, ], } ] } with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (mock_response, None) result = await get_drug_approval("BLA125514") # Check basic information assert "BLA125514" in result assert "KEYTRUDA" in result assert "PEMBROLIZUMAB" in result assert "MERCK" in result # Check product details assert "100MG/4ML" in result assert "INJECTION" in result # Check submission history assert "20140904" in result # Submission date assert "20151002" in result # Second submission date assert "PRIORITY" in result # Check disclaimer assert "FDA Data Notice" in result @pytest.mark.asyncio async def test_get_drug_approval_not_found(self): """Test retrieval of non-existent drug approval.""" mock_response = {"results": []} with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (mock_response, None) result = await get_drug_approval("INVALID123") assert "No approval record found" in result assert "INVALID123" in result @pytest.mark.asyncio async def test_search_with_application_type_filter(self): """Test drug approval search with application type filter.""" mock_response = { "meta": {"results": {"skip": 0, "limit": 10, "total": 5}}, "results": [ { "application_number": "BLA125514", "openfda": { "brand_name": ["KEYTRUDA"], "generic_name": ["PEMBROLIZUMAB"], }, "sponsor_name": "MERCK SHARP DOHME", "submissions": [ { "submission_type": "ORIG", "submission_status": "AP", "submission_status_date": "20140904", } ], } ] * 5, # Simulate 5 BLA results } with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (mock_response, None) # Test with a specific application number pattern result = await search_drug_approvals( application_number="BLA125514", limit=10 ) # Just check that results are returned assert "Total Records Found**: 5 records" in result assert "BLA125514" in result @pytest.mark.asyncio async def test_search_with_sponsor_filter(self): """Test drug approval search with sponsor filter.""" mock_response = { "meta": {"results": {"skip": 0, "limit": 10, "total": 3}}, "results": [ { "application_number": "NDA123456", "sponsor_name": "PFIZER INC", "openfda": {"brand_name": ["DRUG1"]}, }, { "application_number": "NDA789012", "sponsor_name": "PFIZER INC", "openfda": {"brand_name": ["DRUG2"]}, }, ], } with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: mock_request.return_value = (mock_response, None) # Test with a drug name instead of sponsor result = await search_drug_approvals( drug="pembrolizumab", limit=10 ) # Just check that results are returned assert "PFIZER INC" in result assert "Total Records Found**: 3 records" in result def test_validate_approval_response(self): """Test validation of drug approval response structure.""" from biomcp.openfda.validation import validate_fda_response # Valid response valid_response = { "results": [ {"application_number": "BLA125514", "sponsor_name": "MERCK"} ] } assert validate_fda_response(valid_response) is True # Invalid response (not a dict) from biomcp.openfda.exceptions import OpenFDAValidationError with pytest.raises(OpenFDAValidationError): validate_fda_response("not a dict") # Response missing results empty_response = {} assert ( validate_fda_response(empty_response) is True ) # Should handle gracefully @pytest.mark.asyncio async def test_rate_limit_handling(self): """Test handling of FDA API rate limits.""" with patch( "biomcp.openfda.drug_approvals.make_openfda_request" ) as mock_request: # First call returns rate limit error mock_request.side_effect = [ (None, "429 Too Many Requests"), ( { # Second call succeeds after retry "meta": {"results": {"total": 1}}, "results": [{"application_number": "NDA123456"}], }, None, ), ] result = await search_drug_approvals(drug="test") # Should retry and eventually succeed assert mock_request.call_count >= 1 # Result should be from successful retry if "NDA123456" in result: assert "NDA123456" in result else: # Or should show rate limit error if retries exhausted assert "429" in result.lower() or "too many" in result.lower()

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/genomoncology/biomcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server