"""Test the DuckDNS component.""" import asyncio from datetime import timedelta import pytest from homeassistant.setup import async_setup_component from homeassistant.components import duckdns from homeassistant.util.dt import utcnow from tests.common import async_fire_time_changed DOMAIN = 'bla' TOKEN = 'abcdefgh' @pytest.fixture def setup_duckdns(hass, aioclient_mock): """Fixture that sets up DuckDNS.""" aioclient_mock.get(duckdns.UPDATE_URL, params={ 'domains': DOMAIN, 'token': TOKEN }, text='OK') hass.loop.run_until_complete(async_setup_component( hass, duckdns.DOMAIN, { 'duckdns': { 'domain': DOMAIN, 'access_token': TOKEN } })) @asyncio.coroutine def test_setup(hass, aioclient_mock): """Test setup works if update passes.""" aioclient_mock.get(duckdns.UPDATE_URL, params={ 'domains': DOMAIN, 'token': TOKEN }, text='OK') result = yield from async_setup_component(hass, duckdns.DOMAIN, { 'duckdns': { 'domain': DOMAIN, 'access_token': TOKEN } }) assert result assert aioclient_mock.call_count == 1 async_fire_time_changed(hass, utcnow() + timedelta(minutes=5)) yield from hass.async_block_till_done() assert aioclient_mock.call_count == 2 @asyncio.coroutine def test_setup_fails_if_update_fails(hass, aioclient_mock): """Test setup fails if first update fails.""" aioclient_mock.get(duckdns.UPDATE_URL, params={ 'domains': DOMAIN, 'token': TOKEN }, text='KO') result = yield from async_setup_component(hass, duckdns.DOMAIN, { 'duckdns': { 'domain': DOMAIN, 'access_token': TOKEN } }) assert not result assert aioclient_mock.call_count == 1 @asyncio.coroutine def test_service_set_txt(hass, aioclient_mock, setup_duckdns): """Test set txt service call.""" # Empty the fixture mock requests aioclient_mock.clear_requests() aioclient_mock.get(duckdns.UPDATE_URL, params={ 'domains': DOMAIN, 'token': TOKEN, 'txt': 'some-txt', }, text='OK') assert aioclient_mock.call_count == 0 yield from hass.components.duckdns.async_set_txt('some-txt') assert aioclient_mock.call_count == 1 @asyncio.coroutine def test_service_clear_txt(hass, aioclient_mock, setup_duckdns): """Test clear txt service call.""" # Empty the fixture mock requests aioclient_mock.clear_requests() aioclient_mock.get(duckdns.UPDATE_URL, params={ 'domains': DOMAIN, 'token': TOKEN, 'txt': '', 'clear': 'true', }, text='OK') assert aioclient_mock.call_count == 0 yield from hass.components.duckdns.async_set_txt(None) assert aioclient_mock.call_count == 1