Skip to content
Snippets Groups Projects
test_ims.py 5.72 KiB
from requests import HTTPError

import inventory_provider


class MockResponse:
    def __init__(self, json_data, status_code):
        self.json_data = json_data
        self.status_code = status_code
        self.text = '' if json_data else 'No records found for Entity:XXXXX'

    def json(self):
        return self.json_data

    def raise_for_status(self):
        pass


def test_ims_class_login(mocker):
    mock_post = mocker.patch('inventory_provider.db.ims.requests.post')
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    mock_post.return_value = MockResponse("my_bearer_token", 200)
    mock_post.return_value.text = "my_bearer_token"

    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password')
    ds.get_entity_by_id('Node', 1234)
    mock_post.assert_called_once_with(
        'dummy_base/login', auth=('dummy_username', 'dummy_password'))
    mock_get.assert_called_once_with(
        'dummy_base/ims/Node/1234',
        headers={'Authorization': 'Bearer my_bearer_token'},
        params=None)


def test_ims_class_entity_by_id(mocker):
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password', 'dummy_bt')

    ds.get_entity_by_id('Node', 1234)
    mock_get.assert_called_once_with(
        'dummy_base/ims/Node/1234',
        headers={'Authorization': 'Bearer dummy_bt'},
        params=None)


def test_ims_class_entity_by_name(mocker):
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password', 'dummy_bt')

    ds.get_entity_by_name('Node', 'dummy_name')
    mock_get.assert_called_once_with(
        'dummy_base/ims/Node/byname/"dummy_name"',
        headers={'Authorization': 'Bearer dummy_bt'},
        params=None)


def test_ims_class_filtered_entities(mocker):
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password', 'dummy_bt')

    list(ds.get_filtered_entities(
        'Node', 'dummy_param=dummy value', step_count=50))
    mock_get.assert_called_once_with(
        'dummy_base/ims/Node/filtered/dummy_param=dummy value',
        headers={'Authorization': 'Bearer dummy_bt'},
        params={
            'paginatorStartElement': 0,
            'paginatorNumberOfElements': 50
        })

    def side_effect(*args, **kargs):
        if kargs['params']['paginatorStartElement'] == 0:
            return MockResponse([1, 2], 200)
        return MockResponse([3], 200)

    mock_multi_get = mocker.patch(
        'inventory_provider.db.ims.requests.get', side_effect=side_effect)

    res = list(ds.get_filtered_entities(
        'Node', 'dummy_param=dummy value', step_count=2))
    mock_multi_get.assert_any_call(
        'dummy_base/ims/Node/filtered/dummy_param=dummy value',
        headers={'Authorization': 'Bearer dummy_bt'},
        params={
            'paginatorStartElement': 0,
            'paginatorNumberOfElements': 2
        })
    mock_multi_get.assert_any_call(
        'dummy_base/ims/Node/filtered/dummy_param=dummy value',
        headers={'Authorization': 'Bearer dummy_bt'},
        params={
            'paginatorStartElement': 2,
            'paginatorNumberOfElements': 2
        })
    assert mock_multi_get.call_count == 2
    assert res == [1, 2, 3]

    def side_effect_no_recs(*args, **kargs):
        if kargs['params']['paginatorStartElement'] == 0:
            return MockResponse([1, 2], 200)
        e = HTTPError()
        e.response = MockResponse('', 404)
        raise e

    mocker.patch('inventory_provider.db.ims.requests.get',
                 side_effect=side_effect_no_recs)

    res = list(ds.get_filtered_entities(
        'Node', 'dummy_param=dummy value', step_count=2))
    assert res == [1, 2]


def test_ims_class_get_all_entities(mocker):
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password', 'dummy_bt')

    list(ds.get_all_entities('Node', step_count=10))
    mock_get.assert_called_once_with(
        'dummy_base/ims/Node/filtered/Id <> 0',
        headers={'Authorization': 'Bearer dummy_bt'},
        params={
            'paginatorStartElement': 0,
            'paginatorNumberOfElements': 10
        })


def test_ims_class_navigation_properties(mocker):
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password', 'dummy_bt')

    ds.get_entity_by_id('Node', 1234, navigation_properties=[1, 2, 3])
    mock_get.assert_called_with(
        'dummy_base/ims/Node/1234',
        headers={'Authorization': 'Bearer dummy_bt'},
        params={'navigationproperty': 6})


def test_ims_class_cache(mocker):
    mock_get = mocker.patch('inventory_provider.db.ims.requests.get')
    ds = inventory_provider.db.ims.IMS(
        'dummy_base', 'dummy_username', 'dummy_password', 'dummy_bt')

    ds.get_entity_by_id(
        'Node', 4567, navigation_properties=[1, 2, 3, 4], use_cache=True)
    assert mock_get.call_count == 1
    ds.get_entity_by_id(
        'Node', 4567, navigation_properties=[1, 2, 3, 4], use_cache=True)
    assert mock_get.call_count == 1
    ds.get_entity_by_id(
        'Node', 4567, navigation_properties=[1, 2, 3, 4], use_cache=False)
    assert mock_get.call_count == 2
    ds.get_entity_by_id(
        'Node', 4567, navigation_properties=[1, 2, 3, 4])
    assert mock_get.call_count == 3
    ds.get_entity_by_id(
        'Node', 4567, navigation_properties=[1, 2, 3, 4, 5], use_cache=True)
    assert mock_get.call_count == 4