Files
Dashboard-CAS/backend/tests/test_network_scanner.py

71 lines
2.2 KiB
Python

import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from modules.network_scanner import NetworkScanner
@pytest.fixture
def scanner():
return NetworkScanner(subnet="192.168.1.0/24")
def test_parse_scan_results(scanner):
mock_scan_result = {
"scan": {
"192.168.1.1": {
"status": {"state": "up"},
"hostnames": [{"name": "router.local", "type": "PTR"}],
"vendor": {"AA:BB:CC:DD:EE:FF": "Cisco"},
},
"192.168.1.10": {
"status": {"state": "up"},
"hostnames": [{"name": "", "type": ""}],
"vendor": {},
},
}
}
nodes = scanner.parse_scan_results(mock_scan_result)
assert len(nodes) == 2
assert nodes[0]["ip"] == "192.168.1.1"
assert nodes[0]["hostname"] == "router.local"
assert nodes[0]["status"] == "up"
assert nodes[1]["ip"] == "192.168.1.10"
def test_merge_with_config(scanner):
discovered = [
{"ip": "192.168.1.1", "hostname": "router.local", "status": "up", "vendor": "Cisco"},
{"ip": "192.168.1.50", "hostname": "", "status": "up", "vendor": ""},
]
configured = [
{
"name": "Router Principal",
"ip": "192.168.1.1",
"username": "admin",
"password": "pass",
"icon": "router",
"connections": [],
},
]
merged = scanner.merge_with_config(discovered, configured)
# Router should have config data merged in
router = next(n for n in merged if n["ip"] == "192.168.1.1")
assert router["name"] == "Router Principal"
assert router["username"] == "admin"
assert router["status"] == "up"
# Unknown device keeps discovered data
unknown = next(n for n in merged if n["ip"] == "192.168.1.50")
assert unknown["name"] == "192.168.1.50"
assert unknown.get("username") is None
@pytest.mark.asyncio
async def test_ping_host(scanner):
with patch("asyncio.create_subprocess_exec", new_callable=AsyncMock) as mock_exec:
mock_proc = MagicMock()
mock_proc.wait = AsyncMock(return_value=0)
mock_exec.return_value = mock_proc
result = await scanner.ping_host("192.168.1.1")
assert result is True