@@ -453,6 +453,28 @@ def test_siren_model_from_unifi_dict() -> None:
453453 )
454454 assert siren_expired .is_active is False
455455
456+ # Manual stop before the timer elapsed: server clears isActive but may
457+ # leave activatedAt/duration populated. The clock check would still say
458+ # "active"; the server flag must win.
459+ future_at_ms = int ((time .time () + 10 ) * 1000 )
460+ siren_stopped = Siren .from_unifi_dict (
461+ id = SIREN_ID ,
462+ modelKey = "siren" ,
463+ state = "CONNECTED" ,
464+ name = "Front Siren" ,
465+ mac = "AA:BB:CC:DD:EE:FF" ,
466+ volume = 80 ,
467+ ledSettings = {"isEnabled" : True },
468+ sirenStatus = {"isActive" : False , "activatedAt" : future_at_ms , "duration" : 5 },
469+ connectionType = "lora" ,
470+ wirelessConnectionState = {
471+ "signalState" : {"signalQuality" : 85 , "signalStrength" : - 45 },
472+ "batteryStatus" : {"percentage" : 90 , "isLow" : False },
473+ "bridge" : None ,
474+ },
475+ )
476+ assert siren_stopped .is_active is False
477+
456478
457479def test_relay_model_from_unifi_dict () -> None :
458480 relay = Relay .from_unifi_dict (
@@ -1682,22 +1704,16 @@ async def test_siren_device_action_helpers(
16821704 assert siren .siren_status .turn_off_at is None
16831705 assert siren .is_active is False
16841706
1685- # play() with no args: _normalize_siren_duration(None) → SirenDuration.FIVE
1707+ # play() forwards duration unchanged; play_siren_public is the single
1708+ # validation/normalization site (covered by test_play_siren_public_*).
16861709 await siren .play ()
1687- protect_client .play_siren_public .assert_awaited_with (
1688- SIREN_ID , duration = SirenDuration .FIVE
1689- )
1710+ protect_client .play_siren_public .assert_awaited_with (SIREN_ID , duration = None )
16901711
1691- # play() with a SirenDuration enum: returned as-is
16921712 await siren .play (duration = SirenDuration .TEN )
16931713 protect_client .play_siren_public .assert_awaited_with (
16941714 SIREN_ID , duration = SirenDuration .TEN
16951715 )
16961716
1697- # play() with an invalid int: _normalize_siren_duration raises BadRequest
1698- with pytest .raises (BadRequest ):
1699- await siren .play (duration = 99 )
1700-
17011717 protect_client .play_siren_public .reset_mock ()
17021718 await siren .play (duration = 5 )
17031719 protect_client .play_siren_public .assert_awaited_once_with (SIREN_ID , duration = 5 )
0 commit comments