from unittest.mock import MagicMock

from inventory_provider import gap


def test_get_token_endpoint(mocker):
    mock_response = MagicMock()
    mock_response.json.return_value = {'token_endpoint': 'http://example.com/token'}
    mock_response.raise_for_status = MagicMock()
    mocker.patch('inventory_provider.gap.requests.get', return_value=mock_response)

    discovery_endpoint_url = 'http://example.com/aai'
    token_endpoint = gap.get_token_endpoint(discovery_endpoint_url)
    assert token_endpoint == 'http://example.com/token'


def test_get_token(mocker):
    mocker.patch('inventory_provider.gap.get_token_endpoint', return_value='http://example.com/token')
    mock_response = MagicMock()
    mock_response.json.return_value = {'access_token': 'test_token'}
    mock_response.raise_for_status = MagicMock()
    mocker.patch('inventory_provider.gap.requests.post', return_value=mock_response)

    aai_config = {
        'discovery_endpoint_url': 'http://example.com/aai',
        'inventory_provider': {'client_id': 'test_id', 'secret': 'test_secret'}
    }
    token = gap.get_token(aai_config)
    assert token == 'test_token'


def test_extract_router_info(mocker):
    device = {
        'product': {'tag': 'RTR'},
        'subscriptionId': 'test_subscription_id'
    }
    mocker.patch('inventory_provider.gap.make_request', return_value={
        'data': {
            'subscriptions': {
                'page': [{
                    'productBlockInstances': [{
                        'productBlockInstanceValues': [
                            {'field': 'routerFqdn', 'value': 'test_fqdn'},
                            {'field': 'vendor', 'value': 'test_vendor'}
                        ]
                    }]
                }]
            }
        }
    })
    config = {
        "aai": {
            "discovery_endpoint_url": "https://sample-url",
            "inventory_provider": {
                "client_id": "test_id",
                "secret": "test_secret"
            }
        },
        "orchestrator": {
            "url": "orchestrator-url"
        }
    }
    router_info = gap.extract_router_info(device, 'test_token', config)
    assert router_info == {'fqdn': 'test_fqdn', 'vendor': 'test_vendor'}


def test_load_routers_from_orchestrator(mocker):
    mocker.patch('inventory_provider.gap.make_request', return_value={
        'data': {
            'subscriptions': {
                'page': [
                    {'subscriptionId': '1', 'product': {'tag': 'RTR'}},
                    {'subscriptionId': '2', 'product': {'tag': 'OFFICE_ROUTER'}}
                ],
                "pageInfo": {
                    "totalItems": 2,
                    "startCursor": 0,
                    "hasPreviousPage": False,
                    "hasNextPage": False,
                    "endCursor": 2
                }
            }
        }
    })
    mocker.patch('inventory_provider.gap.extract_router_info', side_effect=[
        {'fqdn': 'fqdn1', 'vendor': 'vendor1'},
        {'fqdn': 'fqdn2', 'vendor': 'vendor2'}
    ])
    mocker.patch('inventory_provider.gap.get_token', return_value='test_token')
    config = {
        "aai": {
            "discovery_endpoint_url": "https://sample-url",
            "inventory_provider": {
                "client_id": "test_id",
                "secret": "test_secret"
            }
        },
        "orchestrator": {
            "url": "orchestrator-url"
        }
    }

    routers = gap.load_routers_from_orchestrator(config)
    assert routers == {'fqdn1': 'vendor1', 'fqdn2': 'vendor2'}