Skip to main content
Glama

Finizi B4B MCP Server

by hqtrung
test_vendors.py10.6 kB
"""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"]

Latest Blog Posts

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/hqtrung/finizi-mcp'

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