def state_message_received(msg): """Handle new MQTT state messages.""" payload = self._value_template(msg.payload) if not payload or payload == PAYLOAD_EMPTY_JSON: _LOGGER.debug( "Ignoring empty payload '%s' after rendering for topic %s", payload, msg.topic, ) return json_payload = {} if payload in [self._state_on, self._state_off, PAYLOAD_NONE]: json_payload = {STATE: payload} else: try: json_payload = json_loads(payload) _LOGGER.debug( "JSON payload detected after processing payload '%s' on topic %s", json_payload, msg.topic, ) except JSON_DECODE_EXCEPTIONS: _LOGGER.warning( "No valid (JSON) payload detected after processing payload '%s' on topic %s", json_payload, msg.topic, ) return if STATE in json_payload: if json_payload[STATE] == self._state_on: self._attr_is_on = True if json_payload[STATE] == self._state_off: self._attr_is_on = False if json_payload[STATE] == PAYLOAD_NONE: self._attr_is_on = None del json_payload[STATE] if json_payload: # process attributes try: vol.All(TURN_ON_SCHEMA)(json_payload) except vol.MultipleInvalid as invalid_siren_parameters: _LOGGER.warning( "Unable to update siren state attributes from payload '%s': %s", json_payload, invalid_siren_parameters, ) return self._update(process_turn_on_params(self, json_payload)) self.async_write_ha_state()
async def test_missing_tones_dict(hass): """Test ValueError when setting a tone that is missing from available_tones dict.""" siren = MockSirenEntity(SUPPORT_TONES, {1: "a", 2: "b"}) siren.hass = hass with pytest.raises(ValueError): process_turn_on_params(siren, {"tone": 3})
async def test_available_tones_dict(hass): """Test that valid tones from available_tones dict will get passed in.""" siren = MockSirenEntity(SUPPORT_TONES, {1: "a", 2: "b"}) siren.hass = hass assert process_turn_on_params(siren, {"tone": "a"}) == {"tone": 1} assert process_turn_on_params(siren, {"tone": 1}) == {"tone": 1}
async def test_available_tones_list(hass): """Test that valid tones from tone list will get passed in.""" siren = MockSirenEntity(SUPPORT_TONES, ["a", "b"]) siren.hass = hass assert process_turn_on_params(siren, {"tone": "a"}) == {"tone": "a"}
async def test_no_available_tones(hass): """Test ValueError when siren advertises tones but has no available_tones.""" siren = MockSirenEntity(SUPPORT_TONES) siren.hass = hass with pytest.raises(ValueError): process_turn_on_params(siren, {"tone": "test"})
async def test_missing_tones_list(hass): """Test ValueError when setting a tone that is missing from available_tones list.""" siren = MockSirenEntity(SirenEntityFeature.TONES, ["a", "b"]) siren.hass = hass with pytest.raises(ValueError): process_turn_on_params(siren, {"tone": "test"})