We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/finizi-app/finizi-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
"""Comprehensive tests for vendor management functionality."""
import json
import pytest
from unittest.mock import Mock, AsyncMock, patch
import httpx
from src.finizi_b4b_mcp.tools.vendors import list_vendors, get_vendor
# Load mock responses
with open("tests/fixtures/mock_responses.json") as f:
MOCK_RESPONSES = json.load(f)
# Tests for list_vendors function
@pytest.mark.asyncio
async def test_list_vendors_success():
"""Test listing vendors with pagination."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = MOCK_RESPONSES["vendors"]["list_success"]
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(return_value=mock_response)
mock_client.return_value = mock_api
result = await list_vendors(
entity_id="123e4567-e89b-12d3-a456-426614174000",
page=1,
per_page=20,
ctx=ctx
)
assert result["success"] is True
assert "vendors" in result
assert len(result["vendors"]["data"]) == 2
assert result["vendors"]["total"] == 2
assert result["vendors"]["data"][0]["name"] == "Supplier Co. Ltd"
assert result["vendors"]["data"][0]["tax_id"] == "1111111111"
@pytest.mark.asyncio
async def test_list_vendors_with_search():
"""Test listing vendors with search functionality."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = {
"data": [MOCK_RESPONSES["vendors"]["list_success"]["data"][0]],
"total": 1,
"page": 1,
"per_page": 20
}
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(return_value=mock_response)
mock_client.return_value = mock_api
result = await list_vendors(
entity_id="123e4567-e89b-12d3-a456-426614174000",
page=1,
per_page=20,
search="Supplier Co",
ctx=ctx
)
assert result["success"] is True
assert len(result["vendors"]["data"]) == 1
assert result["vendors"]["data"][0]["name"] == "Supplier Co. Ltd"
@pytest.mark.asyncio
async def test_list_vendors_not_authenticated():
"""Test listing vendors without authentication."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {}
result = await list_vendors(
entity_id="123e4567-e89b-12d3-a456-426614174000",
page=1,
per_page=20,
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert ("authentication" in result["error"].lower() or "validation error" in result["error"].lower())
@pytest.mark.asyncio
async def test_list_vendors_forbidden():
"""Test 403 error when access is denied to entity vendors."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = Mock()
mock_response.status_code = 403
mock_response.json.return_value = MOCK_RESPONSES["errors"]["forbidden_403"]
mock_response.text = "Forbidden"
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(side_effect=httpx.HTTPStatusError(
"Forbidden",
request=Mock(),
response=mock_response
))
mock_client.return_value = mock_api
result = await list_vendors(
entity_id="123e4567-e89b-12d3-a456-426614174000",
page=1,
per_page=20,
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert ("access" in result["error"].lower() or "forbidden" in result["error"].lower())
@pytest.mark.asyncio
async def test_list_vendors_entity_not_found():
"""Test 404 error when entity doesn't exist."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = Mock()
mock_response.status_code = 404
mock_response.json.return_value = MOCK_RESPONSES["errors"]["not_found_404"]
mock_response.text = "Not Found"
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(side_effect=httpx.HTTPStatusError(
"Not Found",
request=Mock(),
response=mock_response
))
mock_client.return_value = mock_api
result = await list_vendors(
entity_id="nonexistent-entity-id",
page=1,
per_page=20,
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert "not found" in result["error"].lower()
@pytest.mark.asyncio
async def test_list_vendors_invalid_pagination():
"""Test validation error with invalid pagination parameters."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
result = await list_vendors(
entity_id="123e4567-e89b-12d3-a456-426614174000",
page=0,
per_page=20,
ctx=ctx
)
assert result["success"] is False
assert "Validation error" in result["error"]
# Tests for get_vendor function
@pytest.mark.asyncio
async def test_get_vendor_success():
"""Test retrieving detailed vendor information."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = MOCK_RESPONSES["vendors"]["get_success"]
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(return_value=mock_response)
mock_client.return_value = mock_api
result = await get_vendor(
entity_id="123e4567-e89b-12d3-a456-426614174000",
vendor_id="vendor-123e4567-e89b-12d3-a456-426614174000",
ctx=ctx
)
assert result["success"] is True
assert result["vendor"]["name"] == "Supplier Co. Ltd"
assert result["vendor"]["tax_id"] == "1111111111"
assert result["vendor"]["total_transactions"] == 50
assert result["vendor"]["total_amount"] == 200000000
assert result["vendor"]["email"] == "contact@supplier.vn"
@pytest.mark.asyncio
async def test_get_vendor_not_found():
"""Test 404 error when vendor doesn't exist."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = Mock()
mock_response.status_code = 404
mock_response.json.return_value = MOCK_RESPONSES["errors"]["not_found_404"]
mock_response.text = "Not Found"
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(side_effect=httpx.HTTPStatusError(
"Not Found",
request=Mock(),
response=mock_response
))
mock_client.return_value = mock_api
result = await get_vendor(
entity_id="123e4567-e89b-12d3-a456-426614174000",
vendor_id="nonexistent-vendor-id",
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert "not found" in result["error"].lower()
@pytest.mark.asyncio
async def test_get_vendor_forbidden():
"""Test 403 error when access is denied to vendor."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
mock_response = Mock()
mock_response.status_code = 403
mock_response.json.return_value = MOCK_RESPONSES["errors"]["forbidden_403"]
mock_response.text = "Forbidden"
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(side_effect=httpx.HTTPStatusError(
"Forbidden",
request=Mock(),
response=mock_response
))
mock_client.return_value = mock_api
result = await get_vendor(
entity_id="123e4567-e89b-12d3-a456-426614174000",
vendor_id="vendor-123e4567-e89b-12d3-a456-426614174000",
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert ("access" in result["error"].lower() or "forbidden" in result["error"].lower())
@pytest.mark.asyncio
async def test_get_vendor_invalid_uuid():
"""Test validation error with invalid UUID format."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
result = await get_vendor(
entity_id="invalid-uuid",
vendor_id="vendor-123",
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert ("validation" in result["error"].lower() or "uuid" in result["error"].lower())
@pytest.mark.asyncio
async def test_get_vendor_not_authenticated():
"""Test getting vendor without authentication."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {}
result = await get_vendor(
entity_id="123e4567-e89b-12d3-a456-426614174000",
vendor_id="vendor-123e4567-e89b-12d3-a456-426614174000",
ctx=ctx
)
# Updated to match actual error format from vendors.py
assert result["success"] is False
assert ("authentication" in result["error"].lower() or "validation error" in result["error"].lower())
@pytest.mark.asyncio
async def test_get_vendor_unexpected_error():
"""Test handling of unexpected errors."""
ctx = Mock()
ctx.session = Mock()
ctx.session.metadata = {"user_token": "fake_token"}
with patch('src.finizi_b4b_mcp.tools.vendors.get_api_client') as mock_client:
mock_api = Mock()
mock_api.get = AsyncMock(side_effect=Exception("Unexpected error"))
mock_client.return_value = mock_api
result = await get_vendor(
entity_id="123e4567-e89b-12d3-a456-426614174000",
vendor_id="vendor-123e4567-e89b-12d3-a456-426614174000",
ctx=ctx
)
assert result["success"] is False
assert "Unexpected error" in result["error"]