diff --git a/homeassistant/components/zwave_js/api.py b/homeassistant/components/zwave_js/api.py index 2612d2d4f68..091de1949eb 100644 --- a/homeassistant/components/zwave_js/api.py +++ b/homeassistant/components/zwave_js/api.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections.abc import Callable import dataclasses from functools import partial, wraps -from typing import Any, Literal +from typing import Any, Literal, cast from aiohttp import web, web_exceptions, web_request import voluptuous as vol @@ -2186,6 +2186,9 @@ class FirmwareUploadView(HomeAssistantView): additional_user_agent_components=USER_AGENT, ) else: + firmware_target: int | None = None + if "target" in data: + firmware_target = int(cast(str, data["target"])) await update_firmware( node.client.ws_server_url, node, @@ -2193,6 +2196,7 @@ class FirmwareUploadView(HomeAssistantView): NodeFirmwareUpdateData( uploaded_file.filename, await hass.async_add_executor_job(uploaded_file.file.read), + firmware_target=firmware_target, ) ], async_get_clientsession(hass), diff --git a/tests/components/zwave_js/test_api.py b/tests/components/zwave_js/test_api.py index f988e72e70b..4e99d19261b 100644 --- a/tests/components/zwave_js/test_api.py +++ b/tests/components/zwave_js/test_api.py @@ -2,6 +2,7 @@ from copy import deepcopy from http import HTTPStatus import json +from typing import Any from unittest.mock import patch import pytest @@ -2983,12 +2984,18 @@ async def test_get_config_parameters( assert msg["error"]["code"] == ERR_NOT_LOADED +@pytest.mark.parametrize( + ("firmware_data", "expected_data"), + [({"target": "1"}, {"firmware_target": 1}), ({}, {})], +) async def test_firmware_upload_view( hass: HomeAssistant, multisensor_6, integration, hass_client: ClientSessionGenerator, firmware_file, + firmware_data: dict[str, Any], + expected_data: dict[str, Any], ) -> None: """Test the HTTP firmware upload view.""" client = await hass_client() @@ -3001,15 +3008,19 @@ async def test_firmware_upload_view( "homeassistant.components.zwave_js.api.USER_AGENT", {"HomeAssistant": "0.0.0"}, ): + data = {"file": firmware_file} + data.update(firmware_data) + resp = await client.post( - f"/api/zwave_js/firmware/upload/{device.id}", - data={"file": firmware_file}, + f"/api/zwave_js/firmware/upload/{device.id}", data=data ) + + update_data = NodeFirmwareUpdateData("file", bytes(10)) + for attr, value in expected_data.items(): + setattr(update_data, attr, value) + mock_controller_cmd.assert_not_called() - assert mock_node_cmd.call_args[0][1:3] == ( - multisensor_6, - [NodeFirmwareUpdateData("file", bytes(10))], - ) + assert mock_node_cmd.call_args[0][1:3] == (multisensor_6, [update_data]) assert mock_node_cmd.call_args[1] == { "additional_user_agent_components": {"HomeAssistant": "0.0.0"}, } @@ -3017,7 +3028,11 @@ async def test_firmware_upload_view( async def test_firmware_upload_view_controller( - hass, client, integration, hass_client: ClientSessionGenerator, firmware_file + hass: HomeAssistant, + client, + integration, + hass_client: ClientSessionGenerator, + firmware_file, ) -> None: """Test the HTTP firmware upload view for a controller.""" hass_client = await hass_client()