@@ -174,3 +174,69 @@ async def test_fix_invalid_tclk_all_versions(
174174 ]
175175 else :
176176 assert "NV3 interface not available in this firmware" in caplog .text
177+
178+
179+ async def test_update_tx_power (ezsp_f : EZSP , caplog ) -> None :
180+ """Test update_tx_power behavior in various scenarios."""
181+ token_data = t .NV3StackNodeData (
182+ panId = t .EmberPanId (0x1234 ),
183+ radioTxPower = t .int8s (5 ),
184+ radioFreqChannel = t .uint8_t (15 ),
185+ stackProfile = t .uint8_t (0x02 ),
186+ nodeType = t .EmberNodeType .COORDINATOR ,
187+ zigbeeNodeId = t .EmberNodeId (0x0000 ),
188+ extendedPanId = t .ExtendedPanId .convert ("AA:BB:CC:DD:EE:FF:00:11" ),
189+ )
190+
191+ # Test 1: NV3 interface unavailable
192+ ezsp_f .getTokenData = AsyncMock (side_effect = InvalidCommandError ())
193+ with caplog .at_level (logging .WARNING ):
194+ assert await repairs .update_tx_power (ezsp_f , tx_power = 10 ) is False
195+ assert "NV3 interface not available in this firmware" in caplog .text
196+
197+ # Test 2: TX power already correct (no write needed)
198+ ezsp_f .getTokenData = AsyncMock (
199+ return_value = GetTokenDataRsp (
200+ status = t .EmberStatus .SUCCESS ,
201+ value = token_data .replace (radioTxPower = t .int8s (10 )).serialize (),
202+ )
203+ )
204+ ezsp_f .setTokenData = AsyncMock ()
205+ ezsp_f .getNetworkParameters = AsyncMock ()
206+ assert await repairs .update_tx_power (ezsp_f , tx_power = 10 ) is False
207+ assert len (ezsp_f .setTokenData .mock_calls ) == 0
208+ assert len (ezsp_f .getNetworkParameters .mock_calls ) == 0
209+
210+ # Test 3: Successful TX power update
211+ ezsp_f .getTokenData = AsyncMock (
212+ return_value = GetTokenDataRsp (
213+ status = t .EmberStatus .SUCCESS ,
214+ value = token_data .serialize (),
215+ )
216+ )
217+ ezsp_f .getNetworkParameters = AsyncMock (
218+ return_value = [
219+ t .EmberStatus .SUCCESS ,
220+ t .EmberNodeType .COORDINATOR ,
221+ t .EmberNetworkParameters (
222+ panId = t .EmberPanId (0x1234 ),
223+ extendedPanId = t .ExtendedPanId .convert ("AA:BB:CC:DD:EE:FF:00:11" ),
224+ radioChannel = t .uint8_t (15 ),
225+ radioTxPower = t .int8s (5 ),
226+ joinMethod = t .EmberJoinMethod .USE_MAC_ASSOCIATION ,
227+ nwkManagerId = t .EmberNodeId (0x0000 ),
228+ nwkUpdateId = t .uint8_t (0 ),
229+ channels = t .Channels .ALL_CHANNELS ,
230+ ),
231+ ]
232+ )
233+ ezsp_f .setTokenData = AsyncMock (return_value = [t .EmberStatus .SUCCESS ])
234+
235+ assert await repairs .update_tx_power (ezsp_f , tx_power = 15 ) is True
236+ assert ezsp_f .setTokenData .mock_calls == [
237+ call (
238+ token = t .NV3KeyId .NVM3KEY_STACK_NODE_DATA ,
239+ index = 0 ,
240+ token_data = token_data .replace (radioTxPower = t .int8s (15 )).serialize (),
241+ )
242+ ]
0 commit comments