# Basic veilid tests

import socket
import json
import dataclasses

import pytest
import veilid

from .conftest import simple_update_callback


@pytest.mark.asyncio
async def test_connect(api_connection: veilid.VeilidAPI):
    pass


@pytest.mark.asyncio
async def test_get_node_id(api_connection: veilid.VeilidAPI):
    state = await api_connection.get_state()
    node_ids = state.config.config.network.routing_table.node_id

    assert len(node_ids) >= 1

    for node_id in node_ids:
        assert node_id[4] == ":"


@pytest.mark.asyncio
async def test_fail_connect():
    with pytest.raises(socket.gaierror) as exc:
        await veilid.json_api_connect("fuahwelifuh32luhwafluehawea", 1, simple_update_callback)

    assert exc.value.errno == socket.EAI_NONAME


@pytest.mark.asyncio
async def test_version(api_connection: veilid.VeilidAPI):
    v = await api_connection.veilid_version()
    print(f"veilid_version: {v.__dict__}")
    assert v.__dict__.keys() >= {"_major", "_minor", "_patch"}

    vstr = await api_connection.veilid_version_string()
    print(f"veilid_version_string: {vstr}")


@pytest.mark.asyncio
async def test_config(api_connection: veilid.VeilidAPI):
    cfgstr = await api_connection.default_veilid_config()
    print(f"default_veilid_config:\n{cfgstr}")
    cfgjson = json.loads(cfgstr)
    
    veilidConfigInstance = veilid.VeilidConfig(**cfgjson)
    cfgstr2 = json.dumps(dataclasses.asdict(veilidConfigInstance))
    
    cfgjson2 = json.loads(cfgstr2)
    veilidConfigInstance2 = veilid.VeilidConfig(**cfgjson2)
    
    assert veilidConfigInstance == veilidConfigInstance2