Bluetooth MCP Server
by Hypijump31
Verified
import pytest
from fastapi.testclient import TestClient
from unittest.mock import patch, MagicMock
import json
# Import de l'application FastAPI
from app.main import app
# Création d'un client de test
client = TestClient(app)
def test_bluetooth_scan_endpoint():
"""Test pour vérifier que l'endpoint /mcp/v1/tools/bluetooth-scan fonctionne correctement"""
# Import des modèles pour créer nos données de test
from app.models.bluetooth import BluetoothDevice
# Création de mock devices pour le test
mock_devices = [
BluetoothDevice(
id="00:11:22:33:44:55",
address="00:11:22:33:44:55",
name="Device 1",
rssi=-65
),
BluetoothDevice(
id="AA:BB:CC:DD:EE:FF",
address="AA:BB:CC:DD:EE:FF",
name="Device 2",
rssi=-80
)
]
# Patch du service Bluetooth pour éviter d'effectuer un vrai scan
with patch('app.api.bluetooth.bluetooth_service.scan_for_devices') as mock_scan:
# Configuration du mock pour renvoyer nos appareils de test
mock_scan.return_value = mock_devices
# Appel de l'endpoint
response = client.post(
"/mcp/v1/tools/bluetooth-scan",
json={"duration": 3.0, "filter_name": None}
)
# Vérifications
assert response.status_code == 200
data = response.json()
assert "devices" in data
assert len(data["devices"]) == 2
assert data["devices"][0]["name"] == "Device 1"
assert data["devices"][1]["name"] == "Device 2"
# Vérification que le service a été appelé avec les bons paramètres
mock_scan.assert_called_once_with(duration=3.0, filter_name=None)
def test_bluetooth_scan_with_filter():
"""Test de l'endpoint de scan avec un filtre sur le nom"""
# Import des modèles pour créer nos données de test
from app.models.bluetooth import BluetoothDevice
# Création d'un seul appareil qui correspond au filtre
mock_devices = [
BluetoothDevice(
id="00:11:22:33:44:55",
address="00:11:22:33:44:55",
name="Device 1",
rssi=-65
)
]
# Patch du service Bluetooth
with patch('app.api.bluetooth.bluetooth_service.scan_for_devices') as mock_scan:
# Configuration du mock
mock_scan.return_value = mock_devices
# Appel de l'endpoint avec un filtre
response = client.post(
"/mcp/v1/tools/bluetooth-scan",
json={"duration": 5.0, "filter_name": "Device 1"}
)
# Vérifications
assert response.status_code == 200
data = response.json()
assert len(data["devices"]) == 1
assert data["devices"][0]["name"] == "Device 1"
# Vérification que le service a été appelé avec les bons paramètres
mock_scan.assert_called_once_with(duration=5.0, filter_name="Device 1")
def test_bluetooth_scan_error():
"""Test de la gestion des erreurs dans l'endpoint de scan"""
# Import de l'exception personnalisée
from app.services.bluetooth_service import BluetoothScanError
# Patch du service Bluetooth pour simuler une erreur
with patch('app.api.bluetooth.bluetooth_service.scan_for_devices') as mock_scan:
# Configuration du mock pour lever une exception
mock_scan.side_effect = BluetoothScanError("Test error")
# Appel de l'endpoint
response = client.post(
"/mcp/v1/tools/bluetooth-scan",
json={"duration": 5.0}
)
# Vérification que l'erreur est bien gérée
assert response.status_code == 500
data = response.json()
assert "detail" in data
assert "Test error" in data["detail"]