"""The tests for the litejet component."""
from unittest.mock import patch

from serial import SerialException

from homeassistant import config_entries
from homeassistant.components.litejet.const import DOMAIN
from homeassistant.const import CONF_PORT

from tests.common import MockConfigEntry


async def test_show_config_form(hass):
    """Test show configuration form."""
    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_USER}
    )

    assert result["type"] == "form"
    assert result["step_id"] == "user"


async def test_create_entry(hass, mock_litejet):
    """Test create entry from user input."""
    test_data = {CONF_PORT: "/dev/test"}

    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_USER}, data=test_data
    )

    assert result["type"] == "create_entry"
    assert result["title"] == "/dev/test"
    assert result["data"] == test_data


async def test_flow_entry_already_exists(hass):
    """Test user input when a config entry already exists."""
    first_entry = MockConfigEntry(
        domain=DOMAIN,
        data={CONF_PORT: "/dev/first"},
    )
    first_entry.add_to_hass(hass)

    test_data = {CONF_PORT: "/dev/test"}

    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_USER}, data=test_data
    )

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


async def test_flow_open_failed(hass):
    """Test user input when serial port open fails."""
    test_data = {CONF_PORT: "/dev/test"}

    with patch("pylitejet.LiteJet") as mock_pylitejet:
        mock_pylitejet.side_effect = SerialException

        result = await hass.config_entries.flow.async_init(
            DOMAIN, context={"source": config_entries.SOURCE_USER}, data=test_data
        )

    assert result["type"] == "form"
    assert result["errors"][CONF_PORT] == "open_failed"


async def test_import_step(hass):
    """Test initializing via import step."""
    test_data = {CONF_PORT: "/dev/imported"}
    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=test_data
    )

    assert result["type"] == "create_entry"
    assert result["title"] == test_data[CONF_PORT]
    assert result["data"] == test_data

"""The tests for the litejet component."""
from unittest.mock import patch

from serial import SerialException

from homeassistant import config_entries
from homeassistant.components.litejet.const import DOMAIN
from homeassistant.const import CONF_PORT

from tests.common import MockConfigEntry


async def test_show_config_form(hass):
    """Test show configuration form."""
    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_USER}
    )

    assert result["type"] == "form"
    assert result["step_id"] == "user"


async def test_create_entry(hass, mock_litejet):
    """Test create entry from user input."""
    test_data = {CONF_PORT: "/dev/test"}

    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_USER}, data=test_data
    )

    assert result["type"] == "create_entry"
    assert result["title"] == "/dev/test"
    assert result["data"] == test_data


async def test_flow_entry_already_exists(hass):
    """Test user input when a config entry already exists."""
    first_entry = MockConfigEntry(
        domain=DOMAIN,
        data={CONF_PORT: "/dev/first"},
    )
    first_entry.add_to_hass(hass)

    test_data = {CONF_PORT: "/dev/test"}

    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_USER}, data=test_data
    )

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


async def test_flow_open_failed(hass):
    """Test user input when serial port open fails."""
    test_data = {CONF_PORT: "/dev/test"}

    with patch("pylitejet.LiteJet") as mock_pylitejet:
        mock_pylitejet.side_effect = SerialException

        result = await hass.config_entries.flow.async_init(
            DOMAIN, context={"source": config_entries.SOURCE_USER}, data=test_data
        )

    assert result["type"] == "form"
    assert result["errors"][CONF_PORT] == "open_failed"


async def test_import_step(hass):
    """Test initializing via import step."""
    test_data = {CONF_PORT: "/dev/imported"}
    result = await hass.config_entries.flow.async_init(
        DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=test_data
    )

    assert result["type"] == "create_entry"
    assert result["title"] == test_data[CONF_PORT]
    assert result["data"] == test_data

The tests for the litejet component. Test show configuration form. Test create entry from user input. Test user input when a config entry already exists. Test user input when serial port open fails. Test initializing via import step.