Change hebrew date at sunset (#17449)

* Change date at sunset

* Fix tests to actually run and add fix to component

* Make tests pass

* Use get_astral_event_next instead of get_astral_event_date

* Revert to using get_astral_event_date

* Make tox happy: reset state on tearDown
This commit is contained in:
Tsvi Mostovicz 2018-10-30 16:21:58 +02:00 committed by Paulus Schoutsen
parent f0693f6f91
commit 87bd2a32e4
2 changed files with 94 additions and 10 deletions

View File

@ -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)

View File

@ -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 == "ו\' בחשון ה\' תשע\"ט"