npi_mcp / tests /test_npi_mcp_server.py
google-labs-jules[bot]
Implement NPI MCP server using FastMCP and Modal NPI API forwarding
f8c07f6
import pytest
from httpx import Response
import httpx
from npi_mcp_server.tools import search_providers, get_provider_by_npi
from npi_mcp_server.schemas import ProviderSummary, ProviderDetail
# Mock data matching the Modal NPI API contract
MOCK_SEARCH_RESPONSE = {
"results": [
{
"npi": "1234567890",
"full_name": "John Doe, MD",
"enumeration_type": "INDIVIDUAL",
"primary_taxonomy": "207RC0000X",
"primary_specialty": "Cardiology",
"primary_address": {
"line1": "123 Main St",
"city": "Anytown",
"state": "CA",
"postal_code": "90210",
"country": "US"
}
}
]
}
MOCK_PROVIDER_DETAIL = {
"npi": "1234567890",
"full_name": "John Doe, MD",
"enumeration_type": "INDIVIDUAL",
"addresses": [
{
"line1": "123 Main St",
"city": "Anytown",
"state": "CA",
"postal_code": "90210",
"country": "US"
}
],
"taxonomies": [
{
"code": "207RC0000X",
"description": "Cardiology",
"primary": True,
"state": "CA",
"license": "12345"
}
]
}
@pytest.mark.asyncio
async def test_search_providers(mocker):
# Mock httpx client post
resp = Response(200, json=MOCK_SEARCH_RESPONSE)
resp._request = httpx.Request("POST", "https://mock/search_providers")
mock_post = mocker.patch("httpx.AsyncClient.post", return_value=resp)
results = await search_providers(query="John Doe")
assert len(results) == 1
p = results[0]
assert p.npi == "1234567890"
assert p.full_name == "John Doe, MD"
# Check if correct URL and payload were sent
# We can check mock_post.call_args
call_args = mock_post.call_args
assert "search_providers" in call_args[0][0]
assert call_args[1]['json'] == {"query": "John Doe"}
@pytest.mark.asyncio
async def test_get_provider_by_npi(mocker):
# Mock httpx client get
resp = Response(200, json=MOCK_PROVIDER_DETAIL)
resp._request = httpx.Request("GET", "https://mock/provider/1234567890")
mock_get = mocker.patch("httpx.AsyncClient.get", return_value=resp)
result = await get_provider_by_npi("1234567890")
assert result is not None
assert result.npi == "1234567890"
assert result.full_name == "John Doe, MD"
assert len(result.taxonomies) == 1
@pytest.mark.asyncio
async def test_get_provider_by_npi_not_found(mocker):
resp = Response(404)
resp._request = httpx.Request("GET", "https://mock/provider/0000000000")
mock_get = mocker.patch("httpx.AsyncClient.get", return_value=resp)
result = await get_provider_by_npi("0000000000")
assert result is None