"""
just checks that the worker methods call the right functions
and some data ends up in the right place ... otherwise not very detailed
"""
import json
import logging

from lxml import etree
import pytest
from inventory_provider.tasks import worker


class MockedRedis(object):

    db = {}

    def __init__(self, *args, **kwargs):
        pass

    def hset(self, name, key, value):
        assert isinstance(value, str)
        if key == 'netconf':
            etree.fromstring(value)
        elif key == 'snmp-interfaces':
            obj = json.loads(value)
            assert isinstance(obj, list)
        MockedRedis.db.setdefault(name, {})[key] = value


@pytest.fixture
def mocked_worker_module(mocker, data_config):

    worker.InventoryTask.config = data_config
    worker.InventoryTask.logger = logging.getLogger()

    MockedRedis.db = {}

    mocker.patch(
        'inventory_provider.tasks.worker.redis.StrictRedis',
        MockedRedis)


def test_netconf_refresh_config(
        mocked_worker_module, mocker, cached_test_data):

    def _mocked_load_juniper_netconf_config(hostname, _):
        return etree.XML(cached_test_data[hostname]["netconf"])

    mocker.patch(
        'inventory_provider.tasks.worker.juniper.load_config',
        _mocked_load_juniper_netconf_config)

    for hostname in cached_test_data.keys():
        assert 'hostname' not in MockedRedis.db
        worker.netconf_refresh_config(hostname)
        assert MockedRedis.db[hostname]['netconf']


def test_snmp_refresh_interfaces(
        mocked_worker_module, mocker, cached_test_data):

    def _mocked_snmp_interfaces(hostname, community, _):
        return json.loads(cached_test_data[hostname]["snmp-interfaces"])

    mocker.patch(
        'inventory_provider.tasks.worker.snmp.get_router_interfaces',
        _mocked_snmp_interfaces)

    for hostname in cached_test_data.keys():
        assert 'hostname' not in MockedRedis.db
        worker.snmp_refresh_interfaces(hostname, 'fake-community')
        assert MockedRedis.db[hostname]['snmp-interfaces']