"""Test the FreeDNS component."""
import asyncio
import pytest

from homeassistant.setup import async_setup_component
from homeassistant.components import freedns
from homeassistant.util.dt import utcnow

from tests.common import async_fire_time_changed

ACCESS_TOKEN = 'test_token'
UPDATE_INTERVAL = freedns.DEFAULT_INTERVAL
UPDATE_URL = freedns.UPDATE_URL


@pytest.fixture
def setup_freedns(hass, aioclient_mock):
    """Fixture that sets up FreeDNS."""
    params = {}
    params[ACCESS_TOKEN] = ""
    aioclient_mock.get(
        UPDATE_URL, params=params, text='Successfully updated 1 domains.')

    hass.loop.run_until_complete(async_setup_component(hass, freedns.DOMAIN, {
            freedns.DOMAIN: {
                'access_token': ACCESS_TOKEN,
                'update_interval': UPDATE_INTERVAL,
            }
        }))


@asyncio.coroutine
def test_setup(hass, aioclient_mock):
    """Test setup works if update passes."""
    params = {}
    params[ACCESS_TOKEN] = ""
    aioclient_mock.get(
        UPDATE_URL, params=params, text='ERROR: Address has not changed.')

    result = yield from async_setup_component(hass, freedns.DOMAIN, {
        freedns.DOMAIN: {
            'access_token': ACCESS_TOKEN,
            'update_interval': UPDATE_INTERVAL,
        }
    })
    assert result
    assert aioclient_mock.call_count == 1

    async_fire_time_changed(hass, utcnow() + UPDATE_INTERVAL)
    yield from hass.async_block_till_done()
    assert aioclient_mock.call_count == 2


@asyncio.coroutine
def test_setup_fails_if_wrong_token(hass, aioclient_mock):
    """Test setup fails if first update fails through wrong token."""
    params = {}
    params[ACCESS_TOKEN] = ""
    aioclient_mock.get(
        UPDATE_URL, params=params, text='ERROR: Invalid update URL (2)')

    result = yield from async_setup_component(hass, freedns.DOMAIN, {
        freedns.DOMAIN: {
            'access_token': ACCESS_TOKEN,
            'update_interval': UPDATE_INTERVAL,
        }
    })
    assert not result
    assert aioclient_mock.call_count == 1