Skip to main content
Glama

Bluetooth MCP Server

test_bluetooth_utils.py8.11 kB
import pytest from app.utils.bluetooth_utils import ( format_manufacturer_data, format_service_data, normalize_mac_address, bytes_to_hex_string, get_friendly_device_name, merge_device_info ) def test_format_manufacturer_data(): """Test pour vérifier que format_manufacturer_data fonctionne correctement""" # Test avec des données nulles assert format_manufacturer_data(None) == {} # Test avec un dictionnaire vide assert format_manufacturer_data({}) == {} # Test avec des données valides (bytes) mfr_data = {76: b'\x01\x02\x03'} result = format_manufacturer_data(mfr_data) assert result == {76: [1, 2, 3]} # Test avec des données déjà sous forme de liste mfr_data = {76: [1, 2, 3]} result = format_manufacturer_data(mfr_data) assert result == {76: [1, 2, 3]} def test_format_service_data(): """Test pour vérifier que format_service_data fonctionne correctement""" # Test avec des données nulles assert format_service_data(None) == {} # Test avec un dictionnaire vide assert format_service_data({}) == {} # Test avec des données valides (bytes) svc_data = {"uuid1": b'\x01\x02\x03'} result = format_service_data(svc_data) assert result == {"uuid1": [1, 2, 3]} # Test avec des données déjà sous forme de liste svc_data = {"uuid1": [1, 2, 3]} result = format_service_data(svc_data) assert result == {"uuid1": [1, 2, 3]} def test_normalize_mac_address(): """Test pour vérifier que normalize_mac_address fonctionne correctement""" # Test avec une adresse nulle assert normalize_mac_address(None) == "" # Test avec une adresse vide assert normalize_mac_address("") == "" # Test avec une adresse au format 00:11:22:33:44:55 assert normalize_mac_address("00:11:22:33:44:55") == "00:11:22:33:44:55" # Test avec une adresse au format 001122334455 assert normalize_mac_address("001122334455") == "00:11:22:33:44:55" # Test avec une adresse au format 00-11-22-33-44-55 assert normalize_mac_address("00-11-22-33-44-55") == "00:11:22:33:44:55" # Test avec une adresse au format aléatoire (ne respectant pas le format MAC) assert normalize_mac_address("not-a-mac-address") == "not-a-mac-address" # Test avec une adresse en minuscules assert normalize_mac_address("aa:bb:cc:dd:ee:ff") == "AA:BB:CC:DD:EE:FF" def test_bytes_to_hex_string(): """Test pour vérifier que bytes_to_hex_string fonctionne correctement""" # Test avec des données nulles assert bytes_to_hex_string(None) == "" # Test avec des données vides assert bytes_to_hex_string(b'') == "" # Test avec des données valides assert bytes_to_hex_string(b'\x01\x02\x03') == "01 02 03" def test_get_friendly_device_name(): """Test pour vérifier que get_friendly_device_name fonctionne correctement""" # Test avec un nom déjà significatif assert get_friendly_device_name("My Device", "00:11:22:33:44:55") == "My Device" # Test avec un nom inconnu, pas de données de fabricant (devrait utiliser l'adresse MAC) assert get_friendly_device_name("Unknown", "00:11:22:33:44:55") == "BT Device 33:44:55" # Test avec un nom inconnu mais des données de fabricant Apple assert get_friendly_device_name("Unknown", "00:11:22:33:44:55", {76: [1, 2, 3]}) == "Apple, Inc. Device (33:44:55)" def test_merge_device_info(): """Test pour vérifier que la fonction merge_device_info fusionne correctement les informations de deux appareils""" # Cas 1: Appareil BLE avec plus d'informations et appareil classique avec un nom différent ble_device = { "id": "00:11:22:33:44:55", "address": "00:11:22:33:44:55", "name": "Unknown", "rssi": -75, "manufacturer_data": {76: [0, 22, 1, 1]}, "service_uuids": ["0000180f-0000-1000-8000-00805f9b34fb"], "service_data": {"0000180f-0000-1000-8000-00805f9b34fb": [0, 1]}, "tx_power": -59, "device_type": "BLE", "company_name": "Apple, Inc.", "friendly_name": "Apple Device", "detected_by": "ble_scanner" } classic_device = { "id": "00:11:22:33:44:55", "address": "00:11:22:33:44:55", "name": "iPhone 13", "rssi": -60, "manufacturer_data": {}, "service_uuids": [], "service_data": {}, "device_type": "Classic", "detected_by": "classic_scanner" } merged = merge_device_info(ble_device, classic_device) # Vérification des informations fusionnées assert merged["id"] == "00:11:22:33:44:55" assert merged["name"] == "iPhone 13" # Le nom du classique est prioritaire car plus informatif assert merged["rssi"] == -60 # Le RSSI du classique est prioritaire car plus fort assert 76 in merged["manufacturer_data"] # Les données du fabricant sont conservées assert "0000180f-0000-1000-8000-00805f9b34fb" in merged["service_uuids"] # Les UUIDs de service sont conservés assert "detection_sources" in merged assert "ble_scanner" in merged["detection_sources"] assert "classic_scanner" in merged["detection_sources"] # Cas 2: Fusion de deux appareils Windows avec des informations complémentaires windows_device1 = { "id": "WIN-PNP-BTHLE-DEV_123456", "address": "WIN-PNP-BTHLE-DEV", "name": "DaVinci Keyboard", "rssi": -65, "manufacturer_data": {}, "service_uuids": [], "device_type": "Windows-PnP", "company_name": "Unknown (Windows)", "friendly_name": "DaVinci Keyboard", "detected_by": "windows_pnp", "raw_info": "ID: BTHLE\\DEV_123456, Status: OK" } windows_device2 = { "id": "WIN-WMI-BTHLE-DEV_123456", "address": "WIN-WMI-BTHLE-DEV", "name": "DaVinci Keyboard BLE", "rssi": -70, "manufacturer_data": {}, "service_uuids": ["0000180a-0000-1000-8000-00805f9b34fb"], "device_type": "Windows-WMI", "company_name": "Unknown (Windows)", "friendly_name": "DaVinci Keyboard", "detected_by": "windows_wmi", "raw_info": "Registry ID: 123456" } merged_windows = merge_device_info(windows_device1, windows_device2) # Vérification des informations fusionnées pour les appareils Windows assert merged_windows["name"] == "DaVinci Keyboard" # Le nom le plus court mais plus significatif est conservé assert merged_windows["rssi"] == -65 # Le RSSI du premier appareil est plus fort assert "0000180a-0000-1000-8000-00805f9b34fb" in merged_windows["service_uuids"] # Les UUIDs sont ajoutés assert "Windows-PnP+Windows-WMI" in merged_windows["device_type"] assert "detection_sources" in merged_windows assert "windows_pnp" in merged_windows["detection_sources"] assert "windows_wmi" in merged_windows["detection_sources"] # Cas 3: Priorité sur les données avec informations plus riches (sans RSSI disponible) device_complete = { "id": "00:11:22:33:44:55", "address": "00:11:22:33:44:55", "name": "Complete Device", "rssi": None, "device_type": "BLE", "company_name": "Complete Company", "friendly_name": "Complete Friendly Name", "is_connectable": True, "detected_by": "scanner1" } device_partial = { "id": "00:11:22:33:44:55", "address": "00:11:22:33:44:55", "name": "Unknown", "rssi": -80, "device_type": "Classic", "detected_by": "scanner2" } merged_complete = merge_device_info(device_complete, device_partial, prioritize_high_rssi=False) assert merged_complete["name"] == "Complete Device" # Le nom plus informatif est conservé assert merged_complete["rssi"] == -80 # Le RSSI disponible est utilisé assert merged_complete["company_name"] == "Complete Company" assert merged_complete["friendly_name"] == "Complete Friendly Name"

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/Hypijump31/bluetooth-mcp-server'

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