1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
"""Test network supervisor client."""
from ipaddress import IPv4Address, IPv4Interface
from aioresponses import aioresponses
import pytest
from yarl import URL
from aiohasupervisor import SupervisorClient
from aiohasupervisor.models import (
InterfaceMethod,
IPv4Config,
MulticastDnsMode,
NetworkInterfaceConfig,
VlanConfig,
)
from . import load_fixture
from .const import SUPERVISOR_URL
async def test_network_info(
responses: aioresponses, supervisor_client: SupervisorClient
) -> None:
"""Test network info API."""
responses.get(
f"{SUPERVISOR_URL}/network/info",
status=200,
body=load_fixture("network_info.json"),
)
result = await supervisor_client.network.info()
assert result.interfaces[0].interface == "end0"
assert result.interfaces[0].type == "ethernet"
assert result.interfaces[0].enabled is True
assert result.interfaces[0].mac == "00:11:22:33:44:55"
assert result.interfaces[0].ipv4.method == "static"
assert result.interfaces[0].ipv4.address[0].with_prefixlen == "192.168.1.2/24"
assert result.interfaces[0].ipv4.nameservers[0].compressed == "192.168.1.1"
assert result.interfaces[0].ipv4.gateway.compressed == "192.168.1.1"
assert result.interfaces[0].ipv4.ready is True
assert result.interfaces[0].ipv6.method == "disabled"
assert (
result.interfaces[0].ipv6.address[0].with_prefixlen
== "fe80::819d:c479:d712:7a77/64"
)
assert result.interfaces[0].ipv6.gateway is None
assert result.interfaces[0].wifi is None
assert result.interfaces[0].vlan is None
assert result.interfaces[0].mdns is MulticastDnsMode.DEFAULT
assert result.interfaces[0].llmnr is MulticastDnsMode.DEFAULT
assert result.docker.interface == "hassio"
assert result.docker.address.compressed == "172.30.32.0/23"
assert result.docker.gateway.compressed == "172.30.32.1"
assert result.docker.dns.compressed == "172.30.32.3"
assert result.host_internet is True
assert result.supervisor_internet is True
async def test_network_reload(
responses: aioresponses, supervisor_client: SupervisorClient
) -> None:
"""Test network reload API."""
responses.post(f"{SUPERVISOR_URL}/network/reload", status=200)
assert await supervisor_client.network.reload() is None
assert responses.requests.keys() == {
("POST", URL(f"{SUPERVISOR_URL}/network/reload"))
}
async def test_network_interface_info(
responses: aioresponses, supervisor_client: SupervisorClient
) -> None:
"""Test network interface info API."""
responses.get(
f"{SUPERVISOR_URL}/network/interface/end0/info",
status=200,
body=load_fixture("network_interface_info.json"),
)
result = await supervisor_client.network.interface_info("end0")
assert result.interface == "end0"
assert result.type == "ethernet"
assert result.enabled is True
assert result.mac == "00:11:22:33:44:55"
assert result.ipv4.method == "static"
assert result.ipv4.address[0].with_prefixlen == "192.168.1.2/24"
assert result.ipv4.nameservers[0].compressed == "192.168.1.1"
assert result.ipv4.gateway.compressed == "192.168.1.1"
assert result.ipv4.ready is True
assert result.ipv6.method == "disabled"
assert result.ipv6.address[0].with_prefixlen == "fe80::819d:c479:d712:7a77/64"
assert result.ipv6.gateway is None
assert result.wifi is None
assert result.vlan is None
assert result.mdns is MulticastDnsMode.ANNOUNCE
assert result.llmnr is MulticastDnsMode.ANNOUNCE
async def test_network_update_interface(
responses: aioresponses, supervisor_client: SupervisorClient
) -> None:
"""Test network interface update API."""
responses.post(f"{SUPERVISOR_URL}/network/interface/end0/update", status=200)
config = NetworkInterfaceConfig(
ipv4=IPv4Config(
method=InterfaceMethod.STATIC,
address=[IPv4Interface("192.168.1.2/24")],
gateway=IPv4Address("192.168.1.1"),
nameservers=[IPv4Address("192.168.1.1")],
),
mdns=MulticastDnsMode.OFF,
)
assert (
await supervisor_client.network.update_interface("end0", config=config) is None
)
request_key = ("POST", URL(f"{SUPERVISOR_URL}/network/interface/end0/update"))
assert responses.requests.keys() == {request_key}
assert len(responses.requests[request_key]) == 1
assert responses.requests[request_key][0].kwargs["json"] == {
"ipv4": {
"address": ["192.168.1.2/24"],
"gateway": "192.168.1.1",
"method": "static",
"nameservers": ["192.168.1.1"],
},
"mdns": "off",
}
async def test_network_access_points(
responses: aioresponses, supervisor_client: SupervisorClient
) -> None:
"""Test network access points API."""
responses.get(
f"{SUPERVISOR_URL}/network/interface/end0/accesspoints",
status=200,
body=load_fixture("network_access_points.json"),
)
result = await supervisor_client.network.access_points("end0")
assert result[0].mode == "infrastructure"
assert result[0].ssid == "UPC4814466"
assert result[0].frequency == 2462
assert result[0].signal == 47
assert result[0].mac == "AA:BB:CC:DD:EE:FF"
assert result[1].ssid == "VQ@35(55720"
@pytest.mark.parametrize(
"config",
[
None,
NetworkInterfaceConfig(ipv4=IPv4Config(method=InterfaceMethod.AUTO)),
NetworkInterfaceConfig(mdns=MulticastDnsMode.OFF),
],
)
async def test_network_save_vlan(
responses: aioresponses,
supervisor_client: SupervisorClient,
config: NetworkInterfaceConfig | None,
) -> None:
"""Test network save vlan API."""
responses.post(f"{SUPERVISOR_URL}/network/interface/end0/vlan/1", status=200)
assert await supervisor_client.network.save_vlan("end0", 1, config=config) is None
assert responses.requests.keys() == {
("POST", URL(f"{SUPERVISOR_URL}/network/interface/end0/vlan/1"))
}
async def test_network_configs_cannot_be_empty() -> None:
"""Test network config instances require at least one field specified."""
# Network interface config for update calls
with pytest.raises(ValueError, match="At least one field must have a value"):
NetworkInterfaceConfig()
# Vlan config for save vlan calls
with pytest.raises(ValueError, match="At least one field must have a value"):
VlanConfig()
|