test_celery_worker.py 4.29 KiB
"""
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 os
import re
from lxml import etree
import pytest
from inventory_provider.tasks import worker
import inventory_provider
TEST_DATA_DIRNAME = os.path.realpath(os.path.join(
inventory_provider.__path__[0],
'..',
'test',
'data'))
# class MockedRedis(object):
#
# db = {}
#
# def __init__(self, *args, **kwargs):
# pass
#
# def set(self, name, value):
# assert isinstance(value, str)
# if name.startswith('netconf:'):
# etree.fromstring(value)
# elif name.startswith('snmp-interfaces:'):
# obj = json.loads(value)
# assert isinstance(obj, list)
# MockedRedis.db[name] = value
#
# def get(self, key):
# return MockedRedis.db[key].encode('utf-8')
class MockedRedis(object):
db = None
def __init__(self, *args, **kwargs):
if MockedRedis.db is None:
test_data_filename = os.path.join(
TEST_DATA_DIRNAME,
"router-info.json")
with open(test_data_filename) as f:
MockedRedis.db = json.loads(f.read())
def set(self, name, value):
MockedRedis.db[name] = value
def get(self, name):
value = MockedRedis.db.get(name, None)
if value is None:
return None
return value.encode('utf-8')
def keys(self, glob=None):
if not glob:
return list([k.encode("utf-8") for k in MockedRedis.db.keys()])
m = re.match(r'^([^*]+)\*$', glob)
assert m # all expected global are like this
return list([
k.encode("utf-8") for k in MockedRedis.db.keys()
if k.startswith(m.group(1))])
def delete(self, key):
if isinstance(key, bytes):
key = key.decode('utf-8')
del MockedRedis.db[key]
@pytest.fixture
def mocked_worker_module(
mocker, data_config, cached_test_data, mocked_netifaces):
worker.InventoryTask.config = data_config
mocker.patch(
'inventory_provider.tasks.common.redis.StrictRedis',
MockedRedis)
def _mocked_snmp_interfaces(hostname, community, _):
return json.loads(cached_test_data['snmp-interfaces:' + hostname])
mocker.patch(
'inventory_provider.snmp.get_router_interfaces',
_mocked_snmp_interfaces)
def _mocked_load_juniper_netconf_config(hostname, _):
return etree.XML(cached_test_data['netconf:' + hostname])
mocker.patch(
'inventory_provider.juniper.load_config',
_mocked_load_juniper_netconf_config)
MockedRedis() # create an instances so db is initialized
def test_netconf_refresh_config(mocked_worker_module, router):
del MockedRedis.db['netconf:' + router]
worker.netconf_refresh_config(router)
assert MockedRedis.db['netconf:' + router]
def test_snmp_refresh_interfaces(mocked_worker_module, router):
del MockedRedis.db['snmp-interfaces:' + router]
worker.snmp_refresh_interfaces(router, 'fake-community')
assert MockedRedis.db['snmp-interfaces:' + router]
def test_reload_router_config(mocked_worker_module, router, mocker):
saved_data = {}
for key in ('netconf:' + router, 'snmp-interfaces:' + router):
saved_data[key] = MockedRedis.db.pop(key)
assert 'netconf:' + router not in MockedRedis.db
assert 'snmp-interfaces:' + router not in MockedRedis.db
def _mocked_netconf_refresh_config_apply(args):
key = 'netconf:' + args[0]
MockedRedis.db[key] = saved_data[key]
mocker.patch(
'inventory_provider.tasks.worker.netconf_refresh_config.apply',
_mocked_netconf_refresh_config_apply)
def _mocked_snmp_refresh_interfaces_apply(args):
assert len(args) == 2
key = 'snmp-interfaces:' + args[0]
MockedRedis.db[key] = saved_data[key]
mocker.patch(
'inventory_provider.tasks.worker.snmp_refresh_interfaces.apply',
_mocked_snmp_refresh_interfaces_apply)
mocker.patch(
'inventory_provider.tasks.worker.snmp_refresh_interfaces.apply',
_mocked_snmp_refresh_interfaces_apply)
worker.reload_router_config(router)
assert 'netconf:' + router in MockedRedis.db
assert 'snmp-interfaces:' + router in MockedRedis.db