From bfe0aee468d8726ee008fbf4ba1c0364e11cd002 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Mar 2017 22:19:58 -0700 Subject: [PATCH] Locative tests to use aiohttp test utils (#6838) --- .../components/device_tracker/locative.py | 3 +- .../device_tracker/test_locative.py | 353 ++++++++---------- 2 files changed, 166 insertions(+), 190 deletions(-) diff --git a/homeassistant/components/device_tracker/locative.py b/homeassistant/components/device_tracker/locative.py index 75cebbd95e7..255440a18e1 100644 --- a/homeassistant/components/device_tracker/locative.py +++ b/homeassistant/components/device_tracker/locative.py @@ -18,6 +18,7 @@ from homeassistant.components.device_tracker import ( # NOQA _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['http'] +URL = '/api/locative' 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): """View to handle locative requests.""" - url = '/api/locative' + url = URL name = 'api:locative' def __init__(self, see): diff --git a/tests/components/device_tracker/test_locative.py b/tests/components/device_tracker/test_locative.py index 5f3f12ba82a..2476247e069 100644 --- a/tests/components/device_tracker/test_locative.py +++ b/tests/components/device_tracker/test_locative.py @@ -1,21 +1,13 @@ """The tests the for Locative device tracker platform.""" -import unittest +import asyncio 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.http as http from homeassistant.const import CONF_PLATFORM - -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 +from homeassistant.components.device_tracker.locative import URL def _url(data=None): @@ -23,213 +15,196 @@ def _url(data=None): data = data or {} data = "&".join(["{}={}".format(name, value) for name, value in data.items()]) - return "{}{}locative?{}".format(HTTP_BASE_URL, const.URL_API, data) + return "{}?{}".format(URL, data) -# pylint: disable=invalid-name -def setUpModule(): - """Initalize a Home Assistant server.""" - global hass - - 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, { +@pytest.fixture +def locative_client(loop, hass, test_client): + """Locative mock client.""" + assert loop.run_until_complete(async_setup_component( + hass, device_tracker.DOMAIN, { device_tracker.DOMAIN: { 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 - """Stop the Home Assistant server.""" - hass.stop() +@asyncio.coroutine +def test_missing_data(locative_client): + """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 -@patch('homeassistant.components.device_tracker.update_config') -class TestLocative(unittest.TestCase): - """Test Locative platform.""" +@asyncio.coroutine +def test_enter_and_exit(hass, locative_client): + """Test when there is a known zone.""" + data = { + 'latitude': 40.7855, + 'longitude': -111.7367, + 'device': '123', + 'id': 'Home', + 'trigger': 'enter' + } - def tearDown(self): - """Stop everything that was started.""" - hass.block_till_done() + # Enter the Home + req = yield from locative_client.get(_url(data)) + 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): - """Test missing data.""" - data = { - 'latitude': 1.0, - 'longitude': 1.1, - 'device': '123', - 'id': 'Home', - 'trigger': 'enter' - } + data['id'] = 'HOME' + data['trigger'] = 'exit' - # No data - req = requests.get(_url({})) - self.assertEqual(422, req.status_code) + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'not_home' == state_name - # No latitude - copy = data.copy() - del copy['latitude'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + data['id'] = 'hOmE' + data['trigger'] = 'enter' - # No device - copy = data.copy() - del copy['device'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + # Enter Home again + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'home' == state_name - # No location - copy = data.copy() - del copy['id'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + data['trigger'] = 'exit' - # No trigger - copy = data.copy() - del copy['trigger'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'not_home' == state_name - # Test message - copy = data.copy() - copy['trigger'] = 'test' - req = requests.get(_url(copy)) - self.assertEqual(200, req.status_code) + data['id'] = 'work' + data['trigger'] = 'enter' - # Test message, no location - copy = data.copy() - copy['trigger'] = 'test' - del copy['id'] - req = requests.get(_url(copy)) - self.assertEqual(200, req.status_code) + # Enter Work + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + 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): - """Test when there is a known zone.""" - data = { - 'latitude': 40.7855, - 'longitude': -111.7367, - 'device': '123', - 'id': 'Home', - 'trigger': 'enter' - } +@asyncio.coroutine +def test_exit_after_enter(hass, locative_client): + """Test when an exit message comes after an enter message.""" + data = { + 'latitude': 40.7855, + 'longitude': -111.7367, + 'device': '123', + 'id': 'Home', + 'trigger': 'enter' + } - # Enter the Home - 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, 'home') + # Enter Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - data['id'] = 'HOME' - data['trigger'] = 'exit' + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'home' - # Exit Home - 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'] = 'Work' - data['id'] = 'hOmE' - data['trigger'] = 'enter' + # Enter Work + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - # Enter Home again - 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, 'home') + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'work' - data['trigger'] = 'exit' + data['id'] = 'Home' + data['trigger'] = 'exit' - # Exit Home - 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') + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - data['id'] = 'work' - data['trigger'] = 'enter' + state = hass.states.get('{}.{}'.format('device_tracker', + 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): - """Test when an exit message comes after an enter message.""" - data = { - 'latitude': 40.7855, - 'longitude': -111.7367, - 'device': '123', - 'id': 'Home', - 'trigger': 'enter' - } +@asyncio.coroutine +def test_exit_first(hass, locative_client): + """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' + } - # Enter Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - state = hass.states.get('{}.{}'.format('device_tracker', - data['device'])) - self.assertEqual(state.state, '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') + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'not_home'