diff --git a/homeassistant/components/sensor/jewish_calendar.py b/homeassistant/components/sensor/jewish_calendar.py index e1225b8f25d..6c867f02fce 100644 --- a/homeassistant/components/sensor/jewish_calendar.py +++ b/homeassistant/components/sensor/jewish_calendar.py @@ -13,6 +13,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity +from homeassistant.helpers.sun import get_astral_event_date import homeassistant.util.dt as dt_util REQUIREMENTS = ['hdate==0.6.5'] @@ -107,8 +108,18 @@ class JewishCalSensor(Entity): """Update the state of the sensor.""" import hdate - today = dt_util.now().date() + now = dt_util.as_local(dt_util.now()) + _LOGGER.debug("Now: %s Timezone = %s", now, now.tzinfo) + + today = now.date() upcoming_saturday = today + timedelta((12 - today.weekday()) % 7) + sunset = dt_util.as_local(get_astral_event_date( + self.hass, 'sunset', today)) + + _LOGGER.debug("Now: %s Sunset: %s", now, sunset) + + if now > sunset: + today += timedelta(1) date = hdate.HDate( today, diaspora=self.diaspora, hebrew=self._hebrew) diff --git a/tests/components/sensor/test_jewish_calendar.py b/tests/components/sensor/test_jewish_calendar.py index 9274ab678a9..02539f8503e 100644 --- a/tests/components/sensor/test_jewish_calendar.py +++ b/tests/components/sensor/test_jewish_calendar.py @@ -5,7 +5,7 @@ from datetime import datetime as dt from unittest.mock import patch from homeassistant.util.async_ import run_coroutine_threadsafe -from homeassistant.util.dt import get_time_zone +from homeassistant.util.dt import get_time_zone, set_default_time_zone from homeassistant.setup import setup_component from homeassistant.components.sensor.jewish_calendar import JewishCalSensor from tests.common import get_test_home_assistant @@ -24,6 +24,8 @@ class TestJewishCalenderSensor(unittest.TestCase): def tearDown(self): """Stop everything that was started.""" self.hass.stop() + # Reset the default timezone, so we don't affect other tests + set_default_time_zone(get_time_zone('UTC')) def test_jewish_calendar_min_config(self): """Test minimum jewish calendar configuration.""" @@ -63,10 +65,14 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_date_output(self): """Test Jewish calendar sensor date output.""" test_time = dt(2018, 9, 3) + set_default_time_zone(get_time_zone('UTC')) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='english', sensor_type='date', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="UTC", diaspora=False) + timezone=get_time_zone("UTC"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), @@ -76,10 +82,14 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_date_output_hebrew(self): """Test Jewish calendar sensor date output in hebrew.""" test_time = dt(2018, 9, 3) + set_default_time_zone(get_time_zone('UTC')) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='date', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="UTC", diaspora=False) + timezone=get_time_zone("UTC"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -88,10 +98,14 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_holiday_name(self): """Test Jewish calendar sensor holiday name output in hebrew.""" test_time = dt(2018, 9, 10) + set_default_time_zone(get_time_zone('UTC')) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='holiday_name', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="UTC", diaspora=False) + timezone=get_time_zone("UTC"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -100,10 +114,14 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_holiday_name_english(self): """Test Jewish calendar sensor holiday name output in english.""" test_time = dt(2018, 9, 10) + set_default_time_zone(get_time_zone('UTC')) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='english', sensor_type='holiday_name', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="UTC", diaspora=False) + timezone=get_time_zone("UTC"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -112,10 +130,14 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_holyness(self): """Test Jewish calendar sensor holyness value.""" test_time = dt(2018, 9, 10) + set_default_time_zone(get_time_zone('UTC')) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='holyness', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="UTC", diaspora=False) + timezone=get_time_zone("UTC"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -124,10 +146,14 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_torah_reading(self): """Test Jewish calendar sensor torah reading in hebrew.""" test_time = dt(2018, 9, 8) + set_default_time_zone(get_time_zone('UTC')) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='weekly_portion', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="UTC", diaspora=False) + timezone=get_time_zone("UTC"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -136,10 +162,15 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_first_stars_ny(self): """Test Jewish calendar sensor first stars time in NY, US.""" test_time = dt(2018, 9, 8) + set_default_time_zone(get_time_zone('America/New_York')) + self.hass.config.latitude = 40.7128 + self.hass.config.longitude = -74.0060 + # self.hass.config.time_zone = get_time_zone("America/New_York") sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='first_stars', latitude=40.7128, longitude=-74.0060, timezone=get_time_zone("America/New_York"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -147,11 +178,15 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_first_stars_jerusalem(self): """Test Jewish calendar sensor first stars time in Jerusalem, IL.""" + set_default_time_zone(get_time_zone('Asia/Jerusalem')) test_time = dt(2018, 9, 8) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='first_stars', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="Asia/Jerusalem", diaspora=False) + timezone=get_time_zone("Asia/Jerusalem"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() @@ -159,12 +194,50 @@ class TestJewishCalenderSensor(unittest.TestCase): def test_jewish_calendar_sensor_torah_reading_weekday(self): """Test the sensor showing torah reading also on weekdays.""" + set_default_time_zone(get_time_zone('Asia/Jerusalem')) test_time = dt(2018, 10, 14) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE sensor = JewishCalSensor( name='test', language='hebrew', sensor_type='weekly_portion', latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, - timezone="Asia/Jerusalem", diaspora=False) + timezone=get_time_zone("Asia/Jerusalem"), diaspora=False) + sensor.hass = self.hass with patch('homeassistant.util.dt.now', return_value=test_time): run_coroutine_threadsafe( sensor.async_update(), self.hass.loop).result() assert sensor.state == "פרשת לך לך" + + def test_jewish_calendar_sensor_date_before_sunset(self): + """Test the sensor showing the correct date before sunset.""" + tz = get_time_zone('Asia/Jerusalem') + set_default_time_zone(tz) + test_time = tz.localize(dt(2018, 10, 14, 17, 0, 0)) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE + sensor = JewishCalSensor( + name='test', language='hebrew', sensor_type='date', + latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, + timezone=get_time_zone("Asia/Jerusalem"), diaspora=False) + sensor.hass = self.hass + with patch('homeassistant.util.dt.now', return_value=test_time): + run_coroutine_threadsafe( + sensor.async_update(), self.hass.loop).result() + assert sensor.state == "ה\' בחשון ה\' תשע\"ט" + + def test_jewish_calendar_sensor_date_after_sunset(self): + """Test the sensor showing the correct date after sunset.""" + tz = get_time_zone('Asia/Jerusalem') + set_default_time_zone(tz) + test_time = tz.localize(dt(2018, 10, 14, 19, 0, 0)) + self.hass.config.latitude = self.TEST_LATITUDE + self.hass.config.longitude = self.TEST_LONGITUDE + sensor = JewishCalSensor( + name='test', language='hebrew', sensor_type='date', + latitude=self.TEST_LATITUDE, longitude=self.TEST_LONGITUDE, + timezone=get_time_zone("Asia/Jerusalem"), diaspora=False) + sensor.hass = self.hass + with patch('homeassistant.util.dt.now', return_value=test_time): + run_coroutine_threadsafe( + sensor.async_update(), self.hass.loop).result() + assert sensor.state == "ו\' בחשון ה\' תשע\"ט"