diff --git a/test/per_router/conftest.py b/test/per_router/conftest.py index 9fc9ac4790cefd26df008c72cfc2a61539ca482e..bb581421d103815471fa6229ac4ab6073a382d83 100644 --- a/test/per_router/conftest.py +++ b/test/per_router/conftest.py @@ -2,9 +2,13 @@ import glob import json import os import re +from unittest.mock import patch from lxml import etree import pytest +from ncclient.manager import make_device_handler, Manager +from ncclient.transport import SSHSession +from ncclient.xml_ import NCElement import inventory_provider from inventory_provider import juniper @@ -64,3 +68,41 @@ def netconf_doc(mocker, router, data_config): 'inventory_provider.juniper.Device', MockedJunosDevice) return juniper.load_config(router, data_config['ssh']) + + +# different library requires different mocking + +@pytest.fixture +def interface_info_response(router): + filename = os.path.join(TEST_DATA_DIRNAME, 'interface_info', f'{router}.xml') + try: + with open(filename, 'r') as file: + data = file.read() + return data + except FileNotFoundError: + pytest.skip(f'no corresponding interface_info doc for {router}, skipping') + + +@pytest.fixture +def mocked_router(interface_info_response): + def _mocked_manager_connect(*args, **kwargs): + assert kwargs + device_params = kwargs["device_params"] + device_handler = make_device_handler(device_params) + session = SSHSession(device_handler) + return Manager(session, device_handler) + + def _mocked_rpc_reply(*args, **kwargs): + device_handler = make_device_handler({'name': 'junos'}) + rpc_reply = NCElement( + interface_info_response, + device_handler.transform_reply() + ) + return rpc_reply + + with patch('ncclient.manager.connect') as manager: + manager.side_effect = _mocked_manager_connect + with patch('ncclient.operations.third_party.juniper.rpc.ExecuteRpc._request') as rpc: + rpc.side_effect = _mocked_rpc_reply + with patch('ncclient.operations.session.CloseSession.request'): + yield diff --git a/test/per_router/test_juniper_data.py b/test/per_router/test_juniper_data.py index 329af1c89c2027e43f51f63144b16d0cb6fbbd9e..b0664f5f89d5635f18f8017ea640beff7346b5bb 100644 --- a/test/per_router/test_juniper_data.py +++ b/test/per_router/test_juniper_data.py @@ -2,6 +2,8 @@ import copy import ipaddress import jsonschema import pytest +from lxml import etree + from inventory_provider import juniper from inventory_provider.routes import msr @@ -143,3 +145,11 @@ def test_interface_addresses_list(netconf_doc): addresses = list(juniper.interface_addresses(netconf_doc)) jsonschema.validate(addresses, schema) + + +def test_interface_speeds(mocked_router, router, data_config): + interface_info = juniper.get_interface_info_for_router(router, data_config['ssh']) + speeds = juniper.get_interface_speeds(etree.fromstring(interface_info)) + assert len(speeds) > 0 # should have any speeds at all + for speed in speeds: + assert len(speed) > 0 # no empty strings, every found speed should have a value