From a4a5057b0bdcd106fd122aa97adcfc1b3ed97764 Mon Sep 17 00:00:00 2001 From: G Johansson Date: Tue, 22 Feb 2022 14:59:59 +0100 Subject: [PATCH] Improve code quality moon (#66461) * Code quality moon * Fix review comments --- homeassistant/components/moon/sensor.py | 71 +++++++++++-------------- tests/components/moon/test_sensor.py | 70 +++++++++++++----------- 2 files changed, 70 insertions(+), 71 deletions(-) diff --git a/homeassistant/components/moon/sensor.py b/homeassistant/components/moon/sensor.py index 97bc7ec4673..cd10d9168d9 100644 --- a/homeassistant/components/moon/sensor.py +++ b/homeassistant/components/moon/sensor.py @@ -4,7 +4,10 @@ from __future__ import annotations from astral import moon import voluptuous as vol -from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity +from homeassistant.components.sensor import ( + PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA, + SensorEntity, +) from homeassistant.const import CONF_NAME from homeassistant.core import HomeAssistant import homeassistant.helpers.config_validation as cv @@ -34,7 +37,7 @@ MOON_ICONS = { STATE_WAXING_GIBBOUS: "mdi:moon-waxing-gibbous", } -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( +PLATFORM_SCHEMA = PARENT_PLATFORM_SCHEMA.extend( {vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string} ) @@ -46,7 +49,7 @@ async def async_setup_platform( discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up the Moon sensor.""" - name = config.get(CONF_NAME) + name: str = config[CONF_NAME] async_add_entities([MoonSensor(name)], True) @@ -54,46 +57,32 @@ async def async_setup_platform( class MoonSensor(SensorEntity): """Representation of a Moon sensor.""" - def __init__(self, name): + _attr_device_class = "moon__phase" + + def __init__(self, name: str) -> None: """Initialize the moon sensor.""" - self._name = name - self._state = None - - @property - def name(self): - """Return the name of the entity.""" - return self._name - - @property - def device_class(self): - """Return the device class of the entity.""" - return "moon__phase" - - @property - def native_value(self): - """Return the state of the device.""" - if self._state < 0.5 or self._state > 27.5: - return STATE_NEW_MOON - if self._state < 6.5: - return STATE_WAXING_CRESCENT - if self._state < 7.5: - return STATE_FIRST_QUARTER - if self._state < 13.5: - return STATE_WAXING_GIBBOUS - if self._state < 14.5: - return STATE_FULL_MOON - if self._state < 20.5: - return STATE_WANING_GIBBOUS - if self._state < 21.5: - return STATE_LAST_QUARTER - return STATE_WANING_CRESCENT - - @property - def icon(self): - """Icon to use in the frontend, if any.""" - return MOON_ICONS.get(self.state) + self._attr_name = name async def async_update(self): """Get the time and updates the states.""" today = dt_util.as_local(dt_util.utcnow()).date() - self._state = moon.phase(today) + state = moon.phase(today) + + if state < 0.5 or state > 27.5: + self._attr_native_value = STATE_NEW_MOON + elif state < 6.5: + self._attr_native_value = STATE_WAXING_CRESCENT + elif state < 7.5: + self._attr_native_value = STATE_FIRST_QUARTER + elif state < 13.5: + self._attr_native_value = STATE_WAXING_GIBBOUS + elif state < 14.5: + self._attr_native_value = STATE_FULL_MOON + elif state < 20.5: + self._attr_native_value = STATE_WANING_GIBBOUS + elif state < 21.5: + self._attr_native_value = STATE_LAST_QUARTER + else: + self._attr_native_value = STATE_WANING_CRESCENT + + self._attr_icon = MOON_ICONS.get(self._attr_native_value) diff --git a/tests/components/moon/test_sensor.py b/tests/components/moon/test_sensor.py index 8a0269ba9fe..066620b1051 100644 --- a/tests/components/moon/test_sensor.py +++ b/tests/components/moon/test_sensor.py @@ -1,56 +1,66 @@ """The test for the moon sensor platform.""" -from datetime import datetime +from __future__ import annotations + from unittest.mock import patch +import pytest + from homeassistant.components.homeassistant import ( DOMAIN as HA_DOMAIN, SERVICE_UPDATE_ENTITY, ) +from homeassistant.components.moon.sensor import ( + MOON_ICONS, + STATE_FIRST_QUARTER, + STATE_FULL_MOON, + STATE_LAST_QUARTER, + STATE_NEW_MOON, + STATE_WANING_CRESCENT, + STATE_WANING_GIBBOUS, + STATE_WAXING_CRESCENT, + STATE_WAXING_GIBBOUS, +) from homeassistant.const import ATTR_ENTITY_ID +from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component -import homeassistant.util.dt as dt_util - -DAY1 = datetime(2017, 1, 1, 1, tzinfo=dt_util.UTC) -DAY2 = datetime(2017, 1, 18, 1, tzinfo=dt_util.UTC) -async def test_moon_day1(hass): +@pytest.mark.parametrize( + "moon_value,native_value,icon", + [ + (0, STATE_NEW_MOON, MOON_ICONS[STATE_NEW_MOON]), + (5, STATE_WAXING_CRESCENT, MOON_ICONS[STATE_WAXING_CRESCENT]), + (7, STATE_FIRST_QUARTER, MOON_ICONS[STATE_FIRST_QUARTER]), + (12, STATE_WAXING_GIBBOUS, MOON_ICONS[STATE_WAXING_GIBBOUS]), + (14.3, STATE_FULL_MOON, MOON_ICONS[STATE_FULL_MOON]), + (20.1, STATE_WANING_GIBBOUS, MOON_ICONS[STATE_WANING_GIBBOUS]), + (20.8, STATE_LAST_QUARTER, MOON_ICONS[STATE_LAST_QUARTER]), + (23, STATE_WANING_CRESCENT, MOON_ICONS[STATE_WANING_CRESCENT]), + ], +) +async def test_moon_day( + hass: HomeAssistant, moon_value: float, native_value: str, icon: str +) -> None: """Test the Moon sensor.""" - config = {"sensor": {"platform": "moon", "name": "moon_day1"}} + config = {"sensor": {"platform": "moon"}} await async_setup_component(hass, HA_DOMAIN, {}) assert await async_setup_component(hass, "sensor", config) await hass.async_block_till_done() - assert hass.states.get("sensor.moon_day1") + assert hass.states.get("sensor.moon") with patch( - "homeassistant.components.moon.sensor.dt_util.utcnow", return_value=DAY1 + "homeassistant.components.moon.sensor.moon.phase", return_value=moon_value ): - await async_update_entity(hass, "sensor.moon_day1") + await async_update_entity(hass, "sensor.moon") - assert hass.states.get("sensor.moon_day1").state == "waxing_crescent" + state = hass.states.get("sensor.moon") + assert state.state == native_value + assert state.attributes["icon"] == icon -async def test_moon_day2(hass): - """Test the Moon sensor.""" - config = {"sensor": {"platform": "moon", "name": "moon_day2"}} - - await async_setup_component(hass, HA_DOMAIN, {}) - assert await async_setup_component(hass, "sensor", config) - await hass.async_block_till_done() - - assert hass.states.get("sensor.moon_day2") - - with patch( - "homeassistant.components.moon.sensor.dt_util.utcnow", return_value=DAY2 - ): - await async_update_entity(hass, "sensor.moon_day2") - - assert hass.states.get("sensor.moon_day2").state == "waning_gibbous" - - -async def async_update_entity(hass, entity_id): +async def async_update_entity(hass: HomeAssistant, entity_id: str) -> None: """Run an update action for an entity.""" await hass.services.async_call( HA_DOMAIN,