Locative tests to use aiohttp test utils (#6838)

This commit is contained in:
Paulus Schoutsen 2017-03-29 22:19:58 -07:00 committed by GitHub
parent 9de4c2b056
commit bfe0aee468
2 changed files with 166 additions and 190 deletions

View File

@ -18,6 +18,7 @@ from homeassistant.components.device_tracker import ( # NOQA
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DEPENDENCIES = ['http'] DEPENDENCIES = ['http']
URL = '/api/locative'
def setup_scanner(hass, config, see, discovery_info=None): def setup_scanner(hass, config, see, discovery_info=None):
@ -30,7 +31,7 @@ def setup_scanner(hass, config, see, discovery_info=None):
class LocativeView(HomeAssistantView): class LocativeView(HomeAssistantView):
"""View to handle locative requests.""" """View to handle locative requests."""
url = '/api/locative' url = URL
name = 'api:locative' name = 'api:locative'
def __init__(self, see): def __init__(self, see):

View File

@ -1,21 +1,13 @@
"""The tests the for Locative device tracker platform.""" """The tests the for Locative device tracker platform."""
import unittest import asyncio
from unittest.mock import patch from unittest.mock import patch
import requests import pytest
from homeassistant import setup, const from homeassistant.setup import async_setup_component
import homeassistant.components.device_tracker as device_tracker import homeassistant.components.device_tracker as device_tracker
import homeassistant.components.http as http
from homeassistant.const import CONF_PLATFORM from homeassistant.const import CONF_PLATFORM
from homeassistant.components.device_tracker.locative import URL
from tests.common import (
assert_setup_component, get_test_home_assistant, get_test_instance_port)
SERVER_PORT = get_test_instance_port()
HTTP_BASE_URL = "http://127.0.0.1:{}".format(SERVER_PORT)
hass = None # pylint: disable=invalid-name
def _url(data=None): def _url(data=None):
@ -23,213 +15,196 @@ def _url(data=None):
data = data or {} data = data or {}
data = "&".join(["{}={}".format(name, value) for data = "&".join(["{}={}".format(name, value) for
name, value in data.items()]) name, value in data.items()])
return "{}{}locative?{}".format(HTTP_BASE_URL, const.URL_API, data) return "{}?{}".format(URL, data)
# pylint: disable=invalid-name @pytest.fixture
def setUpModule(): def locative_client(loop, hass, test_client):
"""Initalize a Home Assistant server.""" """Locative mock client."""
global hass assert loop.run_until_complete(async_setup_component(
hass, device_tracker.DOMAIN, {
hass = get_test_home_assistant()
# http is not platform based, assert_setup_component not applicable
setup.setup_component(hass, http.DOMAIN, {
http.DOMAIN: {
http.CONF_SERVER_PORT: SERVER_PORT
},
})
# Set up device tracker
with assert_setup_component(1, device_tracker.DOMAIN):
setup.setup_component(hass, device_tracker.DOMAIN, {
device_tracker.DOMAIN: { device_tracker.DOMAIN: {
CONF_PLATFORM: 'locative' CONF_PLATFORM: 'locative'
} }
}) }))
hass.start() with patch('homeassistant.components.device_tracker.update_config'):
yield loop.run_until_complete(test_client(hass.http.app))
def tearDownModule(): # pylint: disable=invalid-name @asyncio.coroutine
"""Stop the Home Assistant server.""" def test_missing_data(locative_client):
hass.stop() """Test missing data."""
data = {
'latitude': 1.0,
'longitude': 1.1,
'device': '123',
'id': 'Home',
'trigger': 'enter'
}
# No data
req = yield from locative_client.get(_url({}))
assert req.status == 422
# No latitude
copy = data.copy()
del copy['latitude']
req = yield from locative_client.get(_url(copy))
assert req.status == 422
# No device
copy = data.copy()
del copy['device']
req = yield from locative_client.get(_url(copy))
assert req.status == 422
# No location
copy = data.copy()
del copy['id']
req = yield from locative_client.get(_url(copy))
assert req.status == 422
# No trigger
copy = data.copy()
del copy['trigger']
req = yield from locative_client.get(_url(copy))
assert req.status == 422
# Test message
copy = data.copy()
copy['trigger'] = 'test'
req = yield from locative_client.get(_url(copy))
assert req.status == 200
# Test message, no location
copy = data.copy()
copy['trigger'] = 'test'
del copy['id']
req = yield from locative_client.get(_url(copy))
assert req.status == 200
# Unknown trigger
copy = data.copy()
copy['trigger'] = 'foobar'
req = yield from locative_client.get(_url(copy))
assert req.status == 422
# Stub out update_config or else Travis CI raises an exception @asyncio.coroutine
@patch('homeassistant.components.device_tracker.update_config') def test_enter_and_exit(hass, locative_client):
class TestLocative(unittest.TestCase): """Test when there is a known zone."""
"""Test Locative platform.""" data = {
'latitude': 40.7855,
'longitude': -111.7367,
'device': '123',
'id': 'Home',
'trigger': 'enter'
}
def tearDown(self): # Enter the Home
"""Stop everything that was started.""" req = yield from locative_client.get(_url(data))
hass.block_till_done() assert req.status == 200
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
assert 'home' == state_name
def test_missing_data(self, update_config): data['id'] = 'HOME'
"""Test missing data.""" data['trigger'] = 'exit'
data = {
'latitude': 1.0,
'longitude': 1.1,
'device': '123',
'id': 'Home',
'trigger': 'enter'
}
# No data # Exit Home
req = requests.get(_url({})) req = yield from locative_client.get(_url(data))
self.assertEqual(422, req.status_code) assert req.status == 200
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
assert 'not_home' == state_name
# No latitude data['id'] = 'hOmE'
copy = data.copy() data['trigger'] = 'enter'
del copy['latitude']
req = requests.get(_url(copy))
self.assertEqual(422, req.status_code)
# No device # Enter Home again
copy = data.copy() req = yield from locative_client.get(_url(data))
del copy['device'] assert req.status == 200
req = requests.get(_url(copy)) state_name = hass.states.get('{}.{}'.format('device_tracker',
self.assertEqual(422, req.status_code) data['device'])).state
assert 'home' == state_name
# No location data['trigger'] = 'exit'
copy = data.copy()
del copy['id']
req = requests.get(_url(copy))
self.assertEqual(422, req.status_code)
# No trigger # Exit Home
copy = data.copy() req = yield from locative_client.get(_url(data))
del copy['trigger'] assert req.status == 200
req = requests.get(_url(copy)) state_name = hass.states.get('{}.{}'.format('device_tracker',
self.assertEqual(422, req.status_code) data['device'])).state
assert 'not_home' == state_name
# Test message data['id'] = 'work'
copy = data.copy() data['trigger'] = 'enter'
copy['trigger'] = 'test'
req = requests.get(_url(copy))
self.assertEqual(200, req.status_code)
# Test message, no location # Enter Work
copy = data.copy() req = yield from locative_client.get(_url(data))
copy['trigger'] = 'test' assert req.status == 200
del copy['id'] state_name = hass.states.get('{}.{}'.format('device_tracker',
req = requests.get(_url(copy)) data['device'])).state
self.assertEqual(200, req.status_code) assert 'work' == state_name
# Unknown trigger
copy = data.copy()
copy['trigger'] = 'foobar'
req = requests.get(_url(copy))
self.assertEqual(422, req.status_code)
def test_enter_and_exit(self, update_config): @asyncio.coroutine
"""Test when there is a known zone.""" def test_exit_after_enter(hass, locative_client):
data = { """Test when an exit message comes after an enter message."""
'latitude': 40.7855, data = {
'longitude': -111.7367, 'latitude': 40.7855,
'device': '123', 'longitude': -111.7367,
'id': 'Home', 'device': '123',
'trigger': 'enter' 'id': 'Home',
} 'trigger': 'enter'
}
# Enter the Home # Enter Home
req = requests.get(_url(data)) req = yield from locative_client.get(_url(data))
self.assertEqual(200, req.status_code) assert req.status == 200
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
self.assertEqual(state_name, 'home')
data['id'] = 'HOME' state = hass.states.get('{}.{}'.format('device_tracker',
data['trigger'] = 'exit' data['device']))
assert state.state == 'home'
# Exit Home data['id'] = 'Work'
req = requests.get(_url(data))
self.assertEqual(200, req.status_code)
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
self.assertEqual(state_name, 'not_home')
data['id'] = 'hOmE' # Enter Work
data['trigger'] = 'enter' req = yield from locative_client.get(_url(data))
assert req.status == 200
# Enter Home again state = hass.states.get('{}.{}'.format('device_tracker',
req = requests.get(_url(data)) data['device']))
self.assertEqual(200, req.status_code) assert state.state == 'work'
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
self.assertEqual(state_name, 'home')
data['trigger'] = 'exit' data['id'] = 'Home'
data['trigger'] = 'exit'
# Exit Home # Exit Home
req = requests.get(_url(data)) req = yield from locative_client.get(_url(data))
self.assertEqual(200, req.status_code) assert req.status == 200
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
self.assertEqual(state_name, 'not_home')
data['id'] = 'work' state = hass.states.get('{}.{}'.format('device_tracker',
data['trigger'] = 'enter' data['device']))
assert state.state == 'work'
# Enter Work
req = requests.get(_url(data))
self.assertEqual(200, req.status_code)
state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state
self.assertEqual(state_name, 'work')
def test_exit_after_enter(self, update_config): @asyncio.coroutine
"""Test when an exit message comes after an enter message.""" def test_exit_first(hass, locative_client):
data = { """Test when an exit message is sent first on a new device."""
'latitude': 40.7855, data = {
'longitude': -111.7367, 'latitude': 40.7855,
'device': '123', 'longitude': -111.7367,
'id': 'Home', 'device': 'new_device',
'trigger': 'enter' 'id': 'Home',
} 'trigger': 'exit'
}
# Enter Home # Exit Home
req = requests.get(_url(data)) req = yield from locative_client.get(_url(data))
self.assertEqual(200, req.status_code) assert req.status == 200
state = hass.states.get('{}.{}'.format('device_tracker', state = hass.states.get('{}.{}'.format('device_tracker',
data['device'])) data['device']))
self.assertEqual(state.state, 'home') assert state.state == 'not_home'
data['id'] = 'Work'
# Enter Work
req = requests.get(_url(data))
self.assertEqual(200, req.status_code)
state = hass.states.get('{}.{}'.format('device_tracker',
data['device']))
self.assertEqual(state.state, 'work')
data['id'] = 'Home'
data['trigger'] = 'exit'
# Exit Home
req = requests.get(_url(data))
self.assertEqual(200, req.status_code)
state = hass.states.get('{}.{}'.format('device_tracker',
data['device']))
self.assertEqual(state.state, 'work')
def test_exit_first(self, update_config):
"""Test when an exit message is sent first on a new device."""
data = {
'latitude': 40.7855,
'longitude': -111.7367,
'device': 'new_device',
'id': 'Home',
'trigger': 'exit'
}
# Exit Home
req = requests.get(_url(data))
self.assertEqual(200, req.status_code)
state = hass.states.get('{}.{}'.format('device_tracker',
data['device']))
self.assertEqual(state.state, 'not_home')