"""Test DNS API."""
from unittest.mock import PropertyMock, patch

from supervisor.coresys import CoreSys
from supervisor.dbus.const import MulticastProtocolEnabled


async def test_llmnr_mdns_info(api_client, coresys: CoreSys, dbus_is_connected):
    """Test llmnr and mdns in info api."""
    coresys.host.sys_dbus.resolved.is_connected = False

    resp = await api_client.get("/dns/info")
    result = await resp.json()
    assert result["data"]["llmnr"] is False
    assert result["data"]["mdns"] is False

    coresys.host.sys_dbus.resolved.is_connected = True
    with patch.object(
        type(coresys.host.sys_dbus.resolved),
        "llmnr",
        PropertyMock(return_value=MulticastProtocolEnabled.NO),
    ), patch.object(
        type(coresys.host.sys_dbus.resolved),
        "multicast_dns",
        PropertyMock(return_value=MulticastProtocolEnabled.NO),
    ):
        resp = await api_client.get("/dns/info")
        result = await resp.json()
        assert result["data"]["llmnr"] is False
        assert result["data"]["mdns"] is False

    await coresys.dbus.resolved.connect(coresys.dbus.bus)
    await coresys.dbus.resolved.update()

    resp = await api_client.get("/dns/info")
    result = await resp.json()
    assert result["data"]["llmnr"] is True
    assert result["data"]["mdns"] is True


async def test_options(api_client, coresys: CoreSys):
    """Test options api."""
    assert coresys.plugins.dns.servers == []
    assert coresys.plugins.dns.fallback is True

    with patch.object(type(coresys.plugins.dns), "restart") as restart:
        await api_client.post(
            "/dns/options", json={"servers": ["dns://8.8.8.8"], "fallback": False}
        )

        assert coresys.plugins.dns.servers == ["dns://8.8.8.8"]
        assert coresys.plugins.dns.fallback is False
        restart.assert_called_once()

        restart.reset_mock()
        await api_client.post("/dns/options", json={"fallback": True})

        assert coresys.plugins.dns.servers == ["dns://8.8.8.8"]
        assert coresys.plugins.dns.fallback is True
        restart.assert_called_once()
