fix(k1): harden BLE discovery and bridge recovery
This commit is contained in:
@@ -20,6 +20,7 @@ from pydantic import ValidationError
|
||||
|
||||
import k1link.web.device_plugin_composition as plugin_composition
|
||||
from k1link.device_plugins.xgrids_k1.facade import (
|
||||
ACTION_CONNECTION_VERIFY,
|
||||
ACTION_DEVICE_CALIBRATION_SNAPSHOT_READ,
|
||||
ACTION_DISCOVERY_SCAN,
|
||||
ACTION_NETWORK_PROVISION,
|
||||
@@ -30,6 +31,7 @@ from k1link.device_plugins.xgrids_k1.facade import (
|
||||
XGRIDS_K1_PLUGIN_ID,
|
||||
XGRIDS_K1_PLUGIN_VERSION,
|
||||
CompatibilityAttestationRequest,
|
||||
ConnectionVerifyRequest,
|
||||
ConnectRequest,
|
||||
ViewerSettingsRequest,
|
||||
XgridsK1PluginFacade,
|
||||
@@ -72,6 +74,13 @@ class FakeXgridsService:
|
||||
self.calls.append(("connect", request))
|
||||
return {"phase": "connected", "k1_ip": "192.168.1.20"}
|
||||
|
||||
def verify_connection(
|
||||
self,
|
||||
request: ConnectionVerifyRequest | None = None,
|
||||
) -> dict[str, Any]:
|
||||
self.calls.append(("verify", request))
|
||||
return {"phase": "connected", "k1_ip": "192.168.1.20"}
|
||||
|
||||
def start_live(
|
||||
self,
|
||||
project_name: str,
|
||||
@@ -158,6 +167,58 @@ def test_calibration_snapshot_action_calls_the_read_only_service_method() -> Non
|
||||
assert service.calls == [("calibration", None)]
|
||||
|
||||
|
||||
def test_connection_verify_action_accepts_read_only_adoption_request() -> None:
|
||||
service = FakeXgridsService()
|
||||
dispatcher = DevicePluginDispatcher(
|
||||
[_in_process_runtime(XgridsK1PluginFacade(service))]
|
||||
)
|
||||
|
||||
result = asyncio.run(
|
||||
dispatcher.invoke(
|
||||
XGRIDS_K1_PLUGIN_ID,
|
||||
ACTION_CONNECTION_VERIFY,
|
||||
{
|
||||
"device_id": "test-ble-transport",
|
||||
"compatibility_attestation": {
|
||||
"firmware_version": "3.0.2",
|
||||
"topology": "direct-lan",
|
||||
"verification": "live-device-info",
|
||||
},
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
assert result == {"phase": "connected", "k1_ip": "192.168.1.20"}
|
||||
assert len(service.calls) == 1
|
||||
action, request = service.calls[0]
|
||||
assert action == "verify"
|
||||
assert isinstance(request, ConnectionVerifyRequest)
|
||||
assert request.device_id == "test-ble-transport"
|
||||
assert request.compatibility_attestation is not None
|
||||
assert request.compatibility_attestation.topology == "direct-lan"
|
||||
|
||||
|
||||
def test_connection_verify_action_keeps_empty_refresh_request_compatible() -> None:
|
||||
service = FakeXgridsService()
|
||||
dispatcher = DevicePluginDispatcher(
|
||||
[_in_process_runtime(XgridsK1PluginFacade(service))]
|
||||
)
|
||||
|
||||
asyncio.run(
|
||||
dispatcher.invoke(
|
||||
XGRIDS_K1_PLUGIN_ID,
|
||||
ACTION_CONNECTION_VERIFY,
|
||||
{},
|
||||
)
|
||||
)
|
||||
|
||||
action, request = service.calls[0]
|
||||
assert action == "verify"
|
||||
assert isinstance(request, ConnectionVerifyRequest)
|
||||
assert request.device_id is None
|
||||
assert request.compatibility_attestation is None
|
||||
|
||||
|
||||
def test_repository_runtime_composition_exactly_matches_catalog() -> None:
|
||||
repository_root = Path(__file__).resolve().parents[1]
|
||||
environment = load_installed_device_plugins(repository_root)
|
||||
|
||||
Reference in New Issue
Block a user