diff --git a/ring_doorbell/doorbot.py b/ring_doorbell/doorbot.py index 35be013..697cb7c 100644 --- a/ring_doorbell/doorbot.py +++ b/ring_doorbell/doorbot.py @@ -221,11 +221,14 @@ async def async_set_existing_doorbell_type_enabled(self, value: bool) -> None: raise RingError(MSG_BOOLEAN_REQUIRED) if self.existing_doorbell_type == DOORBELL_EXISTING_TYPE[2]: - return + msg = "In-Home chime is not present." + raise RingError(msg) + + int_value = int(value) params = { "doorbot[description]": self.name, - "doorbot[settings][chime_settings][enable]": value, + "doorbot[settings][chime_settings][enable]": int_value, } url = DOORBELLS_ENDPOINT.format(self.device_api_id) await self._ring.async_query(url, extra_params=params, method="PUT") diff --git a/tests/test_ring.py b/tests/test_ring.py index 6ff48a3..26afaac 100644 --- a/tests/test_ring.py +++ b/tests/test_ring.py @@ -6,7 +6,7 @@ import pytest from freezegun.api import FrozenDateTimeFactory from ring_doorbell import Auth, Ring, RingError -from ring_doorbell.const import USER_AGENT +from ring_doorbell.const import MSG_EXISTING_TYPE, USER_AGENT from ring_doorbell.util import parse_datetime from .conftest import json_request_kwargs, load_fixture_as_dict, nojson_request_kwargs @@ -289,3 +289,62 @@ def test_sync_queries_with_no_event_loop(): with pytest.deprecated_call(): auth.close() + + +async def test_set_existing_doorbell_type(ring, aioresponses_mock): + data = ring.devices() + dev = data["doorbots"][0] + assert dev.existing_doorbell_type == "Mechanical" + + kwargs = nojson_request_kwargs() + + aioresponses_mock.requests.clear() + # Attempting to turn off the in-home chime + await dev.async_set_existing_doorbell_type_enabled(value=False) + kwargs["params"] = { + "doorbot[description]": dev.name, + "doorbot[settings][chime_settings][enable]": 0, + } + aioresponses_mock.assert_called_with( + url="https://api.ring.com/clients_api/doorbots/987652", + method="PUT", + **kwargs, + ) + + aioresponses_mock.requests.clear() + # Attempting to turn on the in-home chime + await dev.async_set_existing_doorbell_type_enabled(value=True) + kwargs["params"] = { + "doorbot[description]": dev.name, + "doorbot[settings][chime_settings][enable]": 1, + } + aioresponses_mock.assert_called_with( + url="https://api.ring.com/clients_api/doorbots/987652", + method="PUT", + **kwargs, + ) + + aioresponses_mock.requests.clear() + # Attempting to set the doorbell type + await dev.async_set_existing_doorbell_type(2) + kwargs["params"] = { + "doorbot[description]": dev.name, + "doorbot[settings][chime_settings][type]": 2, + } + aioresponses_mock.assert_called_with( + url="https://api.ring.com/clients_api/doorbots/987652", + method="PUT", + **kwargs, + ) + + # Attempting to enable when no chime present + settings = dev._attrs["settings"]["chime_settings"] + settings["type"] = 2 + assert dev.existing_doorbell_type == "Not Present" + + with pytest.raises(RingError, match="In-Home chime is not present."): + await dev.async_set_existing_doorbell_type_enabled(value=True) + + # Attempting to set the doorbell type to an invalid value + with pytest.raises(RingError, match=f"value must be in {MSG_EXISTING_TYPE}"): + await dev.async_set_existing_doorbell_type(4)