Update litejet automation tests to async (#18287)

This commit is contained in:
Adam Mills 2018-11-07 03:56:10 -05:00 committed by Paulus Schoutsen
parent 6935b62487
commit 0d7cb54872

View File

@ -1,15 +1,15 @@
"""The tests for the litejet component.""" """The tests for the litejet component."""
import logging import logging
import unittest
from unittest import mock from unittest import mock
from datetime import timedelta from datetime import timedelta
import pytest
from homeassistant import setup from homeassistant import setup
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from homeassistant.components import litejet from homeassistant.components import litejet
import homeassistant.components.automation as automation import homeassistant.components.automation as automation
from tests.common import (fire_time_changed, get_test_home_assistant) from tests.common import (async_fire_time_changed, async_mock_service)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -19,95 +19,93 @@ ENTITY_OTHER_SWITCH = 'switch.mock_switch_2'
ENTITY_OTHER_SWITCH_NUMBER = 2 ENTITY_OTHER_SWITCH_NUMBER = 2
class TestLiteJetTrigger(unittest.TestCase): @pytest.fixture
"""Test the litejet component.""" def calls(hass):
"""Track calls to a mock serivce."""
return async_mock_service(hass, 'test', 'automation')
@mock.patch('pylitejet.LiteJet')
def setup_method(self, method, mock_pylitejet):
"""Set up things to be run when tests are started."""
self.hass = get_test_home_assistant()
self.hass.start()
self.switch_pressed_callbacks = {} def get_switch_name(number):
self.switch_released_callbacks = {} """Get a mock switch name."""
self.calls = []
def get_switch_name(number):
return "Mock Switch #"+str(number) return "Mock Switch #"+str(number)
@pytest.fixture
def mock_lj(hass):
"""Initialize components."""
with mock.patch('pylitejet.LiteJet') as mock_pylitejet:
mock_lj = mock_pylitejet.return_value
mock_lj.switch_pressed_callbacks = {}
mock_lj.switch_released_callbacks = {}
def on_switch_pressed(number, callback): def on_switch_pressed(number, callback):
self.switch_pressed_callbacks[number] = callback mock_lj.switch_pressed_callbacks[number] = callback
def on_switch_released(number, callback): def on_switch_released(number, callback):
self.switch_released_callbacks[number] = callback mock_lj.switch_released_callbacks[number] = callback
def record_call(service): mock_lj.loads.return_value = range(0)
self.calls.append(service) mock_lj.button_switches.return_value = range(1, 3)
mock_lj.all_switches.return_value = range(1, 6)
self.mock_lj = mock_pylitejet.return_value mock_lj.scenes.return_value = range(0)
self.mock_lj.loads.return_value = range(0) mock_lj.get_switch_name.side_effect = get_switch_name
self.mock_lj.button_switches.return_value = range(1, 3) mock_lj.on_switch_pressed.side_effect = on_switch_pressed
self.mock_lj.all_switches.return_value = range(1, 6) mock_lj.on_switch_released.side_effect = on_switch_released
self.mock_lj.scenes.return_value = range(0)
self.mock_lj.get_switch_name.side_effect = get_switch_name
self.mock_lj.on_switch_pressed.side_effect = on_switch_pressed
self.mock_lj.on_switch_released.side_effect = on_switch_released
config = { config = {
'litejet': { 'litejet': {
'port': '/tmp/this_will_be_mocked' 'port': '/tmp/this_will_be_mocked'
} }
} }
assert setup.setup_component(self.hass, litejet.DOMAIN, config) assert hass.loop.run_until_complete(setup.async_setup_component(
hass, litejet.DOMAIN, config))
self.hass.services.register('test', 'automation', record_call) mock_lj.start_time = dt_util.utcnow()
mock_lj.last_delta = timedelta(0)
return mock_lj
self.hass.block_till_done()
self.start_time = dt_util.utcnow() async def simulate_press(hass, mock_lj, number):
self.last_delta = timedelta(0)
def teardown_method(self, method):
"""Stop everything that was started."""
self.hass.stop()
def simulate_press(self, number):
"""Test to simulate a press.""" """Test to simulate a press."""
_LOGGER.info('*** simulate press of %d', number) _LOGGER.info('*** simulate press of %d', number)
callback = self.switch_pressed_callbacks.get(number) callback = mock_lj.switch_pressed_callbacks.get(number)
with mock.patch('homeassistant.helpers.condition.dt_util.utcnow', with mock.patch('homeassistant.helpers.condition.dt_util.utcnow',
return_value=self.start_time + self.last_delta): return_value=mock_lj.start_time + mock_lj.last_delta):
if callback is not None: if callback is not None:
callback() await hass.async_add_job(callback)
self.hass.block_till_done() await hass.async_block_till_done()
def simulate_release(self, number):
async def simulate_release(hass, mock_lj, number):
"""Test to simulate releasing.""" """Test to simulate releasing."""
_LOGGER.info('*** simulate release of %d', number) _LOGGER.info('*** simulate release of %d', number)
callback = self.switch_released_callbacks.get(number) callback = mock_lj.switch_released_callbacks.get(number)
with mock.patch('homeassistant.helpers.condition.dt_util.utcnow', with mock.patch('homeassistant.helpers.condition.dt_util.utcnow',
return_value=self.start_time + self.last_delta): return_value=mock_lj.start_time + mock_lj.last_delta):
if callback is not None: if callback is not None:
callback() await hass.async_add_job(callback)
self.hass.block_till_done() await hass.async_block_till_done()
def simulate_time(self, delta):
async def simulate_time(hass, mock_lj, delta):
"""Test to simulate time.""" """Test to simulate time."""
_LOGGER.info( _LOGGER.info(
'*** simulate time change by %s: %s', '*** simulate time change by %s: %s',
delta, delta,
self.start_time + delta) mock_lj.start_time + delta)
self.last_delta = delta mock_lj.last_delta = delta
with mock.patch('homeassistant.helpers.condition.dt_util.utcnow', with mock.patch('homeassistant.helpers.condition.dt_util.utcnow',
return_value=self.start_time + delta): return_value=mock_lj.start_time + delta):
_LOGGER.info('now=%s', dt_util.utcnow()) _LOGGER.info('now=%s', dt_util.utcnow())
fire_time_changed(self.hass, self.start_time + delta) async_fire_time_changed(hass, mock_lj.start_time + delta)
self.hass.block_till_done() await hass.async_block_till_done()
_LOGGER.info('done with now=%s', dt_util.utcnow()) _LOGGER.info('done with now=%s', dt_util.utcnow())
def setup_automation(self, trigger):
async def setup_automation(hass, trigger):
"""Test setting up the automation.""" """Test setting up the automation."""
assert setup.setup_component(self.hass, automation.DOMAIN, { assert await setup.async_setup_component(hass, automation.DOMAIN, {
automation.DOMAIN: [ automation.DOMAIN: [
{ {
'alias': 'My Test', 'alias': 'My Test',
@ -118,23 +116,25 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
] ]
}) })
self.hass.block_till_done() await hass.async_block_till_done()
def test_simple(self):
async def test_simple(hass, calls, mock_lj):
"""Test the simplest form of a LiteJet trigger.""" """Test the simplest form of a LiteJet trigger."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER 'number': ENTITY_OTHER_SWITCH_NUMBER
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 1 assert len(calls) == 1
def test_held_more_than_short(self):
async def test_held_more_than_short(hass, calls, mock_lj):
"""Test a too short hold.""" """Test a too short hold."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_more_than': { 'held_more_than': {
@ -142,14 +142,15 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
self.simulate_time(timedelta(seconds=0.1)) await simulate_time(hass, mock_lj, timedelta(seconds=0.1))
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
def test_held_more_than_long(self):
async def test_held_more_than_long(hass, calls, mock_lj):
"""Test a hold that is long enough.""" """Test a hold that is long enough."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_more_than': { 'held_more_than': {
@ -157,16 +158,17 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_time(timedelta(seconds=0.3)) await simulate_time(hass, mock_lj, timedelta(seconds=0.3))
assert len(self.calls) == 1 assert len(calls) == 1
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 1 assert len(calls) == 1
def test_held_less_than_short(self):
async def test_held_less_than_short(hass, calls, mock_lj):
"""Test a hold that is short enough.""" """Test a hold that is short enough."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_less_than': { 'held_less_than': {
@ -174,15 +176,16 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
self.simulate_time(timedelta(seconds=0.1)) await simulate_time(hass, mock_lj, timedelta(seconds=0.1))
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 1 assert len(calls) == 1
def test_held_less_than_long(self):
async def test_held_less_than_long(hass, calls, mock_lj):
"""Test a hold that is too long.""" """Test a hold that is too long."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_less_than': { 'held_less_than': {
@ -190,16 +193,17 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_time(timedelta(seconds=0.3)) await simulate_time(hass, mock_lj, timedelta(seconds=0.3))
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
def test_held_in_range_short(self):
async def test_held_in_range_short(hass, calls, mock_lj):
"""Test an in-range trigger with a too short hold.""" """Test an in-range trigger with a too short hold."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_more_than': { 'held_more_than': {
@ -210,14 +214,15 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
self.simulate_time(timedelta(seconds=0.05)) await simulate_time(hass, mock_lj, timedelta(seconds=0.05))
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
def test_held_in_range_just_right(self):
async def test_held_in_range_just_right(hass, calls, mock_lj):
"""Test an in-range trigger with a just right hold.""" """Test an in-range trigger with a just right hold."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_more_than': { 'held_more_than': {
@ -228,16 +233,17 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_time(timedelta(seconds=0.2)) await simulate_time(hass, mock_lj, timedelta(seconds=0.2))
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 1 assert len(calls) == 1
def test_held_in_range_long(self):
async def test_held_in_range_long(hass, calls, mock_lj):
"""Test an in-range trigger with a too long hold.""" """Test an in-range trigger with a too long hold."""
self.setup_automation({ await setup_automation(hass, {
'platform': 'litejet', 'platform': 'litejet',
'number': ENTITY_OTHER_SWITCH_NUMBER, 'number': ENTITY_OTHER_SWITCH_NUMBER,
'held_more_than': { 'held_more_than': {
@ -248,9 +254,9 @@ class TestLiteJetTrigger(unittest.TestCase):
} }
}) })
self.simulate_press(ENTITY_OTHER_SWITCH_NUMBER) await simulate_press(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_time(timedelta(seconds=0.4)) await simulate_time(hass, mock_lj, timedelta(seconds=0.4))
assert len(self.calls) == 0 assert len(calls) == 0
self.simulate_release(ENTITY_OTHER_SWITCH_NUMBER) await simulate_release(hass, mock_lj, ENTITY_OTHER_SWITCH_NUMBER)
assert len(self.calls) == 0 assert len(calls) == 0