import json
import jsonschema

import inventory_provider

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

ROUTER_LIST_SCHEMA = {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "array",
    "items": {"type": "string"}
}


def test_flushdb(client):
    rv = client.post("/testing/flushdb")
    assert rv.status_code == 200


def test_juniper_addresses(client):
    rv = client.post(
        "/testing/juniper-server-addresses",
        headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    response_data = json.loads(rv.data.decode('utf-8'))
    jsonschema.validate(response_data, ROUTER_LIST_SCHEMA)
    assert len(response_data) > 0  # test data is not empty


def test_circuit_tree(client, mocker):
    raw = [
        {
            'id': 1,
            'name': 'root circuit',
            'product': 'product A',
            'speed': 'Speed A',
            'status': ' Operational',
            'sub-circuits': [2, 3]
        },
        {
            'id': 2,
            'name': 'circuit 2',
            'product': 'product A',
            'speed': 'Speed A',
            'status': ' Operational'
        },
        {
            'id': 3,
            'name': 'circuit 3',
            'product': 'product A',
            'speed': 'Speed A',
            'status': ' Operational'
        }]
    data = {}
    for v in raw:
        data[f'ims:circuit_hierarchy:{v["id"]}'] = \
            json.dumps([v]).encode('utf-8')

    expected = """<pre>1 -- root circuit -- prod: product A -- spd: Speed A -- status:  Operational
├── 2 -- circuit 2 -- prod: product A -- spd: Speed A -- status:  Operational
└── 3 -- circuit 3 -- prod: product A -- spd: Speed A -- status:  Operational
</pre>"""  # noqa

    class MockedR:
        def get(self, key):
            return data.get(key, None)

    mr = mocker.patch.object(
        inventory_provider.tasks.common,
        "get_current_redis"
    )
    mr.return_value = MockedR()

    rv = client.post(
        "/testing/circuit-tree/1",
        headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    response_data = rv.data.decode('utf-8')
    assert response_data == expected