"""
just checks that the worker methods call the right functions
and some data ends up in the right place ... otherwise not very detailed
"""
import re
from inventory_provider.tasks import worker
from inventory_provider.tasks.common import _get_redis


def backend_db():
    return _get_redis({
        'redis': {
            'hostname': None,
            'port': None
        },
        'redis-databases': [0, 7]
    }).db


def test_netconf_refresh_config(mocked_worker_module, router):
    del backend_db()['netconf:' + router]
    worker.netconf_refresh_config(router)
    assert backend_db()['netconf:' + router]


def test_snmp_refresh_interfaces(mocked_worker_module, router):

    def _wanted(s):
        return s.startswith(f'snmp-interfaces-single:{router}')

    def _ifc_keys():
        return filter(_wanted, backend_db().keys())

    del backend_db()[f'snmp-interfaces:{router}']
    for k in list(_ifc_keys()):
        del backend_db()[k]

    worker.snmp_refresh_interfaces(router, 'fake-community', [])
    assert backend_db()['snmp-interfaces:' + router]
    assert list(_ifc_keys())


def test_snmp_refresh_peerings(mocked_worker_module, router):

    def _wanted(s):
        return s.startswith('snmp-peerings:')

    def _ifc_keys():
        return filter(_wanted, backend_db().keys())

    for k in list(_ifc_keys()):
        del backend_db()[k]

    worker.snmp_refresh_peerings(router, 'fake-community', [])
    assert list(_ifc_keys())


def test_reload_router_config(mocked_worker_module, router, mocker):
    saved_data = {}
    for key in ('netconf:' + router, 'snmp-interfaces:' + router):
        saved_data[key] = backend_db().pop(key)

    saved_peerings = {}
    for key in backend_db().keys():
        if re.match(r'^snmp-peerings:\d.*', key):
            saved_peerings[key] = backend_db()[key]
    for key in saved_peerings.keys():
        del backend_db()[key]

    assert 'netconf:' + router not in backend_db()
    assert 'snmp-interfaces:' + router not in backend_db()

    def _mocked_netconf_refresh_config_apply(args):
        key = 'netconf:' + args[0]
        backend_db()[key] = saved_data[key]
    mocker.patch(
        'inventory_provider.tasks.worker.netconf_refresh_config.apply',
        _mocked_netconf_refresh_config_apply)

    def _mocked_snmp_refresh_peerings_apply(args):
        assert len(args) == 3
        backend_db().update(saved_peerings)
    mocker.patch(
        'inventory_provider.tasks.worker.snmp_refresh_peerings.apply',
        _mocked_snmp_refresh_peerings_apply)

    def _mocked_snmp_refresh_interfaces_apply(args):
        assert len(args) == 3
        key = 'snmp-interfaces:' + args[0]
        backend_db()[key] = saved_data[key]

    mocker.patch(
        'inventory_provider.tasks.worker.snmp_refresh_interfaces.apply',
        _mocked_snmp_refresh_interfaces_apply)

    def _mocked_update_status(self, **kwargs):
        pass
    mocker.patch(
        'inventory_provider.tasks.worker.InventoryTask.update_state',
        _mocked_update_status)

    worker.reload_router_config(router)
    assert 'netconf:' + router in backend_db()
    assert 'snmp-interfaces:' + router in backend_db()