160 lines
4.1 KiB
Python
160 lines
4.1 KiB
Python
"""Tests for the IPP integration."""
|
|
import os
|
|
|
|
import aiohttp
|
|
from pyipp import IPPConnectionUpgradeRequired, IPPError
|
|
|
|
from homeassistant.components.ipp.const import CONF_BASE_PATH, CONF_UUID, DOMAIN
|
|
from homeassistant.const import (
|
|
CONF_HOST,
|
|
CONF_NAME,
|
|
CONF_PORT,
|
|
CONF_SSL,
|
|
CONF_TYPE,
|
|
CONF_VERIFY_SSL,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from tests.common import MockConfigEntry
|
|
from tests.test_util.aiohttp import AiohttpClientMocker
|
|
|
|
ATTR_HOSTNAME = "hostname"
|
|
ATTR_PROPERTIES = "properties"
|
|
|
|
HOST = "192.168.1.31"
|
|
PORT = 631
|
|
BASE_PATH = "/ipp/print"
|
|
|
|
IPP_ZEROCONF_SERVICE_TYPE = "_ipp._tcp.local."
|
|
IPPS_ZEROCONF_SERVICE_TYPE = "_ipps._tcp.local."
|
|
|
|
ZEROCONF_NAME = "EPSON XP-6000 Series"
|
|
ZEROCONF_HOST = HOST
|
|
ZEROCONF_HOSTNAME = "EPSON123456.local."
|
|
ZEROCONF_PORT = PORT
|
|
ZEROCONF_RP = "ipp/print"
|
|
|
|
MOCK_USER_INPUT = {
|
|
CONF_HOST: HOST,
|
|
CONF_PORT: PORT,
|
|
CONF_SSL: False,
|
|
CONF_VERIFY_SSL: False,
|
|
CONF_BASE_PATH: BASE_PATH,
|
|
}
|
|
|
|
MOCK_ZEROCONF_IPP_SERVICE_INFO = {
|
|
CONF_TYPE: IPP_ZEROCONF_SERVICE_TYPE,
|
|
CONF_NAME: f"{ZEROCONF_NAME}.{IPP_ZEROCONF_SERVICE_TYPE}",
|
|
CONF_HOST: ZEROCONF_HOST,
|
|
ATTR_HOSTNAME: ZEROCONF_HOSTNAME,
|
|
CONF_PORT: ZEROCONF_PORT,
|
|
ATTR_PROPERTIES: {"rp": ZEROCONF_RP},
|
|
}
|
|
|
|
MOCK_ZEROCONF_IPPS_SERVICE_INFO = {
|
|
CONF_TYPE: IPPS_ZEROCONF_SERVICE_TYPE,
|
|
CONF_NAME: f"{ZEROCONF_NAME}.{IPPS_ZEROCONF_SERVICE_TYPE}",
|
|
CONF_HOST: ZEROCONF_HOST,
|
|
ATTR_HOSTNAME: ZEROCONF_HOSTNAME,
|
|
CONF_PORT: ZEROCONF_PORT,
|
|
ATTR_PROPERTIES: {"rp": ZEROCONF_RP},
|
|
}
|
|
|
|
|
|
def load_fixture_binary(filename):
|
|
"""Load a binary fixture."""
|
|
path = os.path.join(os.path.dirname(__file__), "..", "..", "fixtures", filename)
|
|
with open(path, "rb") as fptr:
|
|
return fptr.read()
|
|
|
|
|
|
def mock_connection(
|
|
aioclient_mock: AiohttpClientMocker,
|
|
host: str = HOST,
|
|
port: int = PORT,
|
|
ssl: bool = False,
|
|
base_path: str = BASE_PATH,
|
|
conn_error: bool = False,
|
|
conn_upgrade_error: bool = False,
|
|
ipp_error: bool = False,
|
|
no_unique_id: bool = False,
|
|
parse_error: bool = False,
|
|
version_not_supported: bool = False,
|
|
):
|
|
"""Mock the IPP connection."""
|
|
scheme = "https" if ssl else "http"
|
|
ipp_url = f"{scheme}://{host}:{port}"
|
|
|
|
if ipp_error:
|
|
aioclient_mock.post(f"{ipp_url}{base_path}", exc=IPPError)
|
|
return
|
|
|
|
if conn_error:
|
|
aioclient_mock.post(f"{ipp_url}{base_path}", exc=aiohttp.ClientError)
|
|
return
|
|
|
|
if conn_upgrade_error:
|
|
aioclient_mock.post(f"{ipp_url}{base_path}", exc=IPPConnectionUpgradeRequired)
|
|
return
|
|
|
|
fixture = "ipp/get-printer-attributes.bin"
|
|
if no_unique_id:
|
|
fixture = "ipp/get-printer-attributes-success-nodata.bin"
|
|
elif version_not_supported:
|
|
fixture = "ipp/get-printer-attributes-error-0x0503.bin"
|
|
|
|
if parse_error:
|
|
content = "BAD"
|
|
else:
|
|
content = load_fixture_binary(fixture)
|
|
|
|
aioclient_mock.post(
|
|
f"{ipp_url}{base_path}",
|
|
content=content,
|
|
headers={"Content-Type": "application/ipp"},
|
|
)
|
|
|
|
|
|
async def init_integration(
|
|
hass: HomeAssistant,
|
|
aioclient_mock: AiohttpClientMocker,
|
|
skip_setup: bool = False,
|
|
host: str = HOST,
|
|
port: int = PORT,
|
|
ssl: bool = False,
|
|
base_path: str = BASE_PATH,
|
|
uuid: str = "cfe92100-67c4-11d4-a45f-f8d027761251",
|
|
unique_id: str = "cfe92100-67c4-11d4-a45f-f8d027761251",
|
|
conn_error: bool = False,
|
|
) -> MockConfigEntry:
|
|
"""Set up the IPP integration in Home Assistant."""
|
|
entry = MockConfigEntry(
|
|
domain=DOMAIN,
|
|
unique_id=unique_id,
|
|
data={
|
|
CONF_HOST: host,
|
|
CONF_PORT: port,
|
|
CONF_SSL: ssl,
|
|
CONF_VERIFY_SSL: True,
|
|
CONF_BASE_PATH: base_path,
|
|
CONF_UUID: uuid,
|
|
},
|
|
)
|
|
|
|
entry.add_to_hass(hass)
|
|
|
|
mock_connection(
|
|
aioclient_mock,
|
|
host=host,
|
|
port=port,
|
|
ssl=ssl,
|
|
base_path=base_path,
|
|
conn_error=conn_error,
|
|
)
|
|
|
|
if not skip_setup:
|
|
await hass.config_entries.async_setup(entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
return entry
|