<gh_stars>10-100
"""Tests for Glances config flow."""
from unittest.mock import patch

from glances_api import Glances

from homeassistant.components.glances import config_flow
from homeassistant.components.glances.const import DOMAIN
from homeassistant.const import CONF_SCAN_INTERVAL

from tests.common import MockConfigEntry, mock_coro

NAME = "Glances"
HOST = "0.0.0.0"
USERNAME = "username"
PASSWORD = "password"
PORT = 61208
VERSION = 3
SCAN_INTERVAL = 10

DEMO_USER_INPUT = {
    "name": NAME,
    "host": HOST,
    "username": USERNAME,
    "password": PASSWORD,
    "version": VERSION,
    "port": PORT,
    "ssl": False,
    "verify_ssl": True,
}


def init_config_flow(hass):
    """Init a configuration flow."""
    flow = config_flow.GlancesFlowHandler()
    flow.hass = hass
    return flow


async def test_form(hass):
    """Test config entry configured successfully."""
    flow = init_config_flow(hass)

    with patch("glances_api.Glances"), patch.object(
        Glances, "get_data", return_value=mock_coro()
    ):

        result = await flow.async_step_user(DEMO_USER_INPUT)

    assert result["type"] == "create_entry"
    assert result["title"] == NAME
    assert result["data"] == DEMO_USER_INPUT


async def test_form_cannot_connect(hass):
    """Test to return error if we cannot connect."""
    flow = init_config_flow(hass)

    with patch("glances_api.Glances"):
        result = await flow.async_step_user(DEMO_USER_INPUT)

    assert result["type"] == "form"
    assert result["errors"] == {"base": "cannot_connect"}


async def test_form_wrong_version(hass):
    """Test to check if wrong version is entered."""
    flow = init_config_flow(hass)

    user_input = DEMO_USER_INPUT.copy()
    user_input.update(version=1)
    result = await flow.async_step_user(user_input)

    assert result["type"] == "form"
    assert result["errors"] == {"version": "wrong_version"}


async def test_form_already_configured(hass):
    """Test host is already configured."""
    entry = MockConfigEntry(
        domain=DOMAIN, data=DEMO_USER_INPUT, options={CONF_SCAN_INTERVAL: 60}
    )
    entry.add_to_hass(hass)

    flow = init_config_flow(hass)
    result = await flow.async_step_user(DEMO_USER_INPUT)

    assert result["type"] == "abort"
    assert result["reason"] == "already_configured"


async def test_options(hass):
    """Test options for Glances."""
    entry = MockConfigEntry(
        domain=DOMAIN, data=DEMO_USER_INPUT, options={CONF_SCAN_INTERVAL: 60}
    )
    entry.add_to_hass(hass)
    flow = init_config_flow(hass)
    options_flow = flow.async_get_options_flow(entry)

    result = await options_flow.async_step_init({CONF_SCAN_INTERVAL: 10})
    assert result["type"] == "create_entry"
    assert result["data"][CONF_SCAN_INTERVAL] == 10

"""Tests for Glances config flow."""
from unittest.mock import patch

from glances_api import Glances

from homeassistant.components.glances import config_flow
from homeassistant.components.glances.const import DOMAIN
from homeassistant.const import CONF_SCAN_INTERVAL

from tests.common import MockConfigEntry, mock_coro

NAME = "Glances"
HOST = "0.0.0.0"
USERNAME = "username"
PASSWORD = "password"
PORT = 61208
VERSION = 3
SCAN_INTERVAL = 10

DEMO_USER_INPUT = {
    "name": NAME,
    "host": HOST,
    "username": USERNAME,
    "password": PASSWORD,
    "version": VERSION,
    "port": PORT,
    "ssl": False,
    "verify_ssl": True,
}


def init_config_flow(hass):
    """Init a configuration flow."""
    flow = config_flow.GlancesFlowHandler()
    flow.hass = hass
    return flow


async def test_form(hass):
    """Test config entry configured successfully."""
    flow = init_config_flow(hass)

    with patch("glances_api.Glances"), patch.object(
        Glances, "get_data", return_value=mock_coro()
    ):

        result = await flow.async_step_user(DEMO_USER_INPUT)

    assert result["type"] == "create_entry"
    assert result["title"] == NAME
    assert result["data"] == DEMO_USER_INPUT


async def test_form_cannot_connect(hass):
    """Test to return error if we cannot connect."""
    flow = init_config_flow(hass)

    with patch("glances_api.Glances"):
        result = await flow.async_step_user(DEMO_USER_INPUT)

    assert result["type"] == "form"
    assert result["errors"] == {"base": "cannot_connect"}


async def test_form_wrong_version(hass):
    """Test to check if wrong version is entered."""
    flow = init_config_flow(hass)

    user_input = DEMO_USER_INPUT.copy()
    user_input.update(version=1)
    result = await flow.async_step_user(user_input)

    assert result["type"] == "form"
    assert result["errors"] == {"version": "wrong_version"}


async def test_form_already_configured(hass):
    """Test host is already configured."""
    entry = MockConfigEntry(
        domain=DOMAIN, data=DEMO_USER_INPUT, options={CONF_SCAN_INTERVAL: 60}
    )
    entry.add_to_hass(hass)

    flow = init_config_flow(hass)
    result = await flow.async_step_user(DEMO_USER_INPUT)

    assert result["type"] == "abort"
    assert result["reason"] == "already_configured"


async def test_options(hass):
    """Test options for Glances."""
    entry = MockConfigEntry(
        domain=DOMAIN, data=DEMO_USER_INPUT, options={CONF_SCAN_INTERVAL: 60}
    )
    entry.add_to_hass(hass)
    flow = init_config_flow(hass)
    options_flow = flow.async_get_options_flow(entry)

    result = await options_flow.async_step_init({CONF_SCAN_INTERVAL: 10})
    assert result["type"] == "create_entry"
    assert result["data"][CONF_SCAN_INTERVAL] == 10
Tests for Glances config flow. Init a configuration flow. Test config entry configured successfully. Test to return error if we cannot connect. Test to check if wrong version is entered. Test host is already configured. Test options for Glances.