import json

import jsonschema
import pytest

from inventory_provider.routes.mic import SITES_LIST_SCHEMA, \
    NODES_LIST_SCHEMA, INTERFACES_LIST_SCHEMA, IMPACT_SCHEMA

DEFAULT_REQUEST_HEADERS = {
    "Content-type": "application/json",
    "Accept": ["application/json"]
}


def test_get_sites(client, mocked_redis):
    rv = client.get(
        '/mic/sites',
        headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    assert rv.is_json
    response_data = json.loads(rv.data.decode('utf-8'))
    jsonschema.validate(response_data, SITES_LIST_SCHEMA)


def test_get_nodes(client, mocked_redis):
    rv = client.get(
        '/mic/nodes/AMSTERDAM',
        headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    assert rv.is_json
    response_data = json.loads(rv.data.decode('utf-8'))
    jsonschema.validate(response_data, NODES_LIST_SCHEMA)


def test_get_interfaces(client, mocked_redis):
    rv = client.get(
        '/mic/interfaces/MX1.LON.UK',
        headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    assert rv.is_json
    response_data = json.loads(rv.data.decode('utf-8'))
    jsonschema.validate(response_data, INTERFACES_LIST_SCHEMA)


@pytest.mark.parametrize('endpoint', [
    '/mic/impact/AMSTERDAM/MX1.AMS.NL/AE21',
    '/mic/impact/LONDON/MX1.LON.UK',
    '/mic/impact/GENEVA'])
def test_get_impact(endpoint, client, mocked_redis):
    rv = client.get(endpoint, headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    assert rv.is_json
    response_data = json.loads(rv.data.decode('utf-8'))
    jsonschema.validate(response_data, IMPACT_SCHEMA)