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,48 +15,25 @@ 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()
# Stub out update_config or else Travis CI raises an exception
@patch('homeassistant.components.device_tracker.update_config')
class TestLocative(unittest.TestCase):
"""Test Locative platform."""
def tearDown(self):
"""Stop everything that was started."""
hass.block_till_done()
def test_missing_data(self, update_config):
"""Test missing data.""" """Test missing data."""
data = { data = {
'latitude': 1.0, 'latitude': 1.0,
@ -75,53 +44,55 @@ class TestLocative(unittest.TestCase):
} }
# No data # No data
req = requests.get(_url({})) req = yield from locative_client.get(_url({}))
self.assertEqual(422, req.status_code) assert req.status == 422
# No latitude # No latitude
copy = data.copy() copy = data.copy()
del copy['latitude'] del copy['latitude']
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(422, req.status_code) assert req.status == 422
# No device # No device
copy = data.copy() copy = data.copy()
del copy['device'] del copy['device']
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(422, req.status_code) assert req.status == 422
# No location # No location
copy = data.copy() copy = data.copy()
del copy['id'] del copy['id']
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(422, req.status_code) assert req.status == 422
# No trigger # No trigger
copy = data.copy() copy = data.copy()
del copy['trigger'] del copy['trigger']
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(422, req.status_code) assert req.status == 422
# Test message # Test message
copy = data.copy() copy = data.copy()
copy['trigger'] = 'test' copy['trigger'] = 'test'
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(200, req.status_code) assert req.status == 200
# Test message, no location # Test message, no location
copy = data.copy() copy = data.copy()
copy['trigger'] = 'test' copy['trigger'] = 'test'
del copy['id'] del copy['id']
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(200, req.status_code) assert req.status == 200
# Unknown trigger # Unknown trigger
copy = data.copy() copy = data.copy()
copy['trigger'] = 'foobar' copy['trigger'] = 'foobar'
req = requests.get(_url(copy)) req = yield from locative_client.get(_url(copy))
self.assertEqual(422, req.status_code) assert req.status == 422
def test_enter_and_exit(self, update_config):
@asyncio.coroutine
def test_enter_and_exit(hass, locative_client):
"""Test when there is a known zone.""" """Test when there is a known zone."""
data = { data = {
'latitude': 40.7855, 'latitude': 40.7855,
@ -132,52 +103,54 @@ class TestLocative(unittest.TestCase):
} }
# Enter the Home # Enter the 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', state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state data['device'])).state
self.assertEqual(state_name, 'home') assert 'home' == state_name
data['id'] = 'HOME' data['id'] = 'HOME'
data['trigger'] = 'exit' 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', state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state data['device'])).state
self.assertEqual(state_name, 'not_home') assert 'not_home' == state_name
data['id'] = 'hOmE' data['id'] = 'hOmE'
data['trigger'] = 'enter' data['trigger'] = 'enter'
# Enter Home again # Enter Home again
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', state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state data['device'])).state
self.assertEqual(state_name, 'home') assert 'home' == state_name
data['trigger'] = 'exit' 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', state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state data['device'])).state
self.assertEqual(state_name, 'not_home') assert 'not_home' == state_name
data['id'] = 'work' data['id'] = 'work'
data['trigger'] = 'enter' data['trigger'] = 'enter'
# Enter Work # Enter Work
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', state_name = hass.states.get('{}.{}'.format('device_tracker',
data['device'])).state data['device'])).state
self.assertEqual(state_name, 'work') assert 'work' == state_name
def test_exit_after_enter(self, update_config):
@asyncio.coroutine
def test_exit_after_enter(hass, locative_client):
"""Test when an exit message comes after an enter message.""" """Test when an exit message comes after an enter message."""
data = { data = {
'latitude': 40.7855, 'latitude': 40.7855,
@ -188,35 +161,37 @@ class TestLocative(unittest.TestCase):
} }
# Enter 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 = 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 == 'home'
data['id'] = 'Work' data['id'] = 'Work'
# Enter Work # Enter Work
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, 'work') assert state.state == 'work'
data['id'] = 'Home' data['id'] = 'Home'
data['trigger'] = 'exit' 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 = hass.states.get('{}.{}'.format('device_tracker', state = hass.states.get('{}.{}'.format('device_tracker',
data['device'])) data['device']))
self.assertEqual(state.state, 'work') assert state.state == 'work'
def test_exit_first(self, update_config):
@asyncio.coroutine
def test_exit_first(hass, locative_client):
"""Test when an exit message is sent first on a new device.""" """Test when an exit message is sent first on a new device."""
data = { data = {
'latitude': 40.7855, 'latitude': 40.7855,
@ -227,9 +202,9 @@ class TestLocative(unittest.TestCase):
} }
# 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 = hass.states.get('{}.{}'.format('device_tracker', state = hass.states.get('{}.{}'.format('device_tracker',
data['device'])) data['device']))
self.assertEqual(state.state, 'not_home') assert state.state == 'not_home'