mirror of
https://github.com/latinogino/dolibarr-mcp.git
synced 2026-04-20 17:22:40 +02:00
248 lines
7.6 KiB
Python
248 lines
7.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script for Dolibarr MCP Server
|
|
Tests all CRUD operations and API connectivity
|
|
"""
|
|
|
|
import asyncio
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add parent directory to path for imports
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from src.dolibarr_mcp.config import Config
|
|
from src.dolibarr_mcp.dolibarr_client import DolibarrClient, DolibarrAPIError
|
|
|
|
|
|
async def test_connection(client):
|
|
"""Test basic API connection."""
|
|
print("\n1. Testing API Connection...")
|
|
try:
|
|
result = await client.get_status()
|
|
print("✅ API Connection successful")
|
|
print(f" Response: {json.dumps(result, indent=2)[:200]}...")
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ Connection failed: {e}")
|
|
return False
|
|
|
|
|
|
async def test_customer_crud(client):
|
|
"""Test Customer CRUD operations."""
|
|
print("\n2. Testing Customer CRUD Operations...")
|
|
|
|
try:
|
|
# CREATE
|
|
print(" Creating customer...")
|
|
customer = await client.create_customer(
|
|
name="Test Company MCP",
|
|
email="test@mcp-example.com",
|
|
phone="+1234567890",
|
|
address="123 Test Street",
|
|
town="Test City",
|
|
zip="12345"
|
|
)
|
|
customer_id = customer.get('id') or customer.get('rowid')
|
|
print(f" ✅ Created customer ID: {customer_id}")
|
|
|
|
# READ
|
|
print(" Reading customer...")
|
|
retrieved = await client.get_customer_by_id(customer_id)
|
|
print(f" ✅ Retrieved customer: {retrieved.get('name')}")
|
|
|
|
# UPDATE
|
|
print(" Updating customer...")
|
|
updated = await client.update_customer(
|
|
customer_id,
|
|
email="updated@mcp-example.com"
|
|
)
|
|
print(f" ✅ Updated customer")
|
|
|
|
# DELETE
|
|
print(" Deleting customer...")
|
|
await client.delete_customer(customer_id)
|
|
print(f" ✅ Deleted customer")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Customer CRUD failed: {e}")
|
|
return False
|
|
|
|
|
|
async def test_product_crud(client):
|
|
"""Test Product CRUD operations."""
|
|
print("\n3. Testing Product CRUD Operations...")
|
|
|
|
try:
|
|
# CREATE
|
|
print(" Creating product...")
|
|
product = await client.create_product(
|
|
label="Test Product MCP",
|
|
price=99.99,
|
|
description="A test product created via MCP",
|
|
stock=100
|
|
)
|
|
product_id = product.get('id') or product.get('rowid')
|
|
print(f" ✅ Created product ID: {product_id}")
|
|
|
|
# READ
|
|
print(" Reading product...")
|
|
retrieved = await client.get_product_by_id(product_id)
|
|
print(f" ✅ Retrieved product: {retrieved.get('label')}")
|
|
|
|
# UPDATE
|
|
print(" Updating product...")
|
|
updated = await client.update_product(
|
|
product_id,
|
|
price=149.99
|
|
)
|
|
print(f" ✅ Updated product price")
|
|
|
|
# DELETE
|
|
print(" Deleting product...")
|
|
await client.delete_product(product_id)
|
|
print(f" ✅ Deleted product")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Product CRUD failed: {e}")
|
|
return False
|
|
|
|
|
|
async def test_list_operations(client):
|
|
"""Test listing operations."""
|
|
print("\n4. Testing List Operations...")
|
|
|
|
try:
|
|
# List users
|
|
print(" Listing users...")
|
|
users = await client.get_users(limit=5)
|
|
print(f" ✅ Found {len(users)} users")
|
|
|
|
# List customers
|
|
print(" Listing customers...")
|
|
customers = await client.get_customers(limit=5)
|
|
print(f" ✅ Found {len(customers)} customers")
|
|
|
|
# List products
|
|
print(" Listing products...")
|
|
products = await client.get_products(limit=5)
|
|
print(f" ✅ Found {len(products)} products")
|
|
|
|
# List invoices
|
|
print(" Listing invoices...")
|
|
invoices = await client.get_invoices(limit=5)
|
|
print(f" ✅ Found {len(invoices)} invoices")
|
|
|
|
# List orders
|
|
print(" Listing orders...")
|
|
orders = await client.get_orders(limit=5)
|
|
print(f" ✅ Found {len(orders)} orders")
|
|
|
|
# List contacts
|
|
print(" Listing contacts...")
|
|
contacts = await client.get_contacts(limit=5)
|
|
print(f" ✅ Found {len(contacts)} contacts")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f" ❌ List operations failed: {e}")
|
|
return False
|
|
|
|
|
|
async def test_raw_api(client):
|
|
"""Test raw API access."""
|
|
print("\n5. Testing Raw API Access...")
|
|
|
|
try:
|
|
# Make a raw API call
|
|
print(" Making raw API call to /users endpoint...")
|
|
result = await client.dolibarr_raw_api(
|
|
method="GET",
|
|
endpoint="/users",
|
|
params={"limit": 2}
|
|
)
|
|
print(f" ✅ Raw API call successful")
|
|
print(f" Response type: {type(result)}")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Raw API call failed: {e}")
|
|
return False
|
|
|
|
|
|
async def main():
|
|
"""Run all tests."""
|
|
print("=" * 60)
|
|
print("🧪 DOLIBARR MCP SERVER TEST SUITE")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
# Load configuration
|
|
print("\n📋 Loading configuration...")
|
|
config = Config()
|
|
print(f" API URL: {config.dolibarr_url}")
|
|
print(f" API Key: {'*' * 10 if config.api_key else 'NOT SET'}")
|
|
|
|
if not config.api_key or config.api_key == "your_api_key_here":
|
|
print("\n❌ ERROR: Please configure your Dolibarr API credentials in .env file")
|
|
print(" Required variables:")
|
|
print(" - DOLIBARR_URL: Your Dolibarr instance URL")
|
|
print(" - DOLIBARR_API_KEY: Your API key")
|
|
return
|
|
|
|
# Create client and run tests
|
|
async with DolibarrClient(config) as client:
|
|
tests_passed = 0
|
|
tests_total = 5
|
|
|
|
# Run test suite
|
|
if await test_connection(client):
|
|
tests_passed += 1
|
|
|
|
if await test_customer_crud(client):
|
|
tests_passed += 1
|
|
|
|
if await test_product_crud(client):
|
|
tests_passed += 1
|
|
|
|
if await test_list_operations(client):
|
|
tests_passed += 1
|
|
|
|
if await test_raw_api(client):
|
|
tests_passed += 1
|
|
|
|
# Summary
|
|
print("\n" + "=" * 60)
|
|
print("📊 TEST SUMMARY")
|
|
print("=" * 60)
|
|
print(f"Tests Passed: {tests_passed}/{tests_total}")
|
|
|
|
if tests_passed == tests_total:
|
|
print("✅ ALL TESTS PASSED! The Dolibarr MCP Server is fully operational.")
|
|
elif tests_passed > 0:
|
|
print(f"⚠️ PARTIAL SUCCESS: {tests_passed} tests passed, {tests_total - tests_passed} failed.")
|
|
else:
|
|
print("❌ ALL TESTS FAILED. Please check your configuration and API access.")
|
|
|
|
print("\n📌 Next Steps:")
|
|
print("1. If all tests passed, your MCP server is ready for production use")
|
|
print("2. Run the server: python -m dolibarr_mcp.dolibarr_mcp_server")
|
|
print("3. Or use Docker: docker-compose up")
|
|
print("4. Connect your AI assistant to the MCP server")
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ FATAL ERROR: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|