from unittest import mock
from aioupnp.fault import UPnPError
from aioupnp.upnp import UPnP
from tests import AsyncioTestCase


class mock_netifaces:
    @staticmethod
    def gateways():
        return {
            "default": {
                2: [
                    "192.168.1.1",
                    "test0"
                ]
            },
            2: [
                [
                    "192.168.1.1",
                    "test0",
                    True
                ]
            ]
        }
    @staticmethod
    def interfaces():
        return ['test0']

    @staticmethod
    def ifaddresses(interface):
        return {
            "test0": {
                17: [
                    {
                        "addr": "01:02:03:04:05:06",
                        "broadcast": "ff:ff:ff:ff:ff:ff"
                    }
                ],
                2: [
                    {
                        "addr": "192.168.1.2",
                        "netmask": "255.255.255.0",
                        "broadcast": "192.168.1.255"
                    }
                ],
            },
        }[interface]


class TestParseInterfaces(AsyncioTestCase):
    def test_parse_interfaces(self):
        with mock.patch('aioupnp.interfaces.get_netifaces') as patch:
            patch.return_value = mock_netifaces

            lan, gateway = UPnP.get_lan_and_gateway(interface_name='test0')
            self.assertEqual(gateway, '192.168.1.1')
            self.assertEqual(lan, '192.168.1.2')

    async def test_netifaces_fail(self):
        checked = []
        with mock.patch('aioupnp.interfaces.get_netifaces') as patch:
            patch.return_value = mock_netifaces
            try:
                await UPnP.discover(interface_name='test1')
            except UPnPError as err:
                self.assertEqual(str(err), 'failed to get lan and gateway addresses for test1')
                checked.append(True)
            else:
                self.assertTrue(False)
        self.assertEqual(len(checked), 1)