#!/usr/bin/env py.test-3
import re

import pytest

CMD = "../sbin/ngcp-instances-validator"


def test_help(cli):
    cmd = [CMD, "--help"]
    out = cli(*cmd)
    assert out.exitcode == 0


def test_no_network(cli):
    cmd = [CMD]
    out = cli(*cmd)
    assert out.exitcode != 0
    assert re.search(
        "Can't open '/etc/ngcp-config/network.yml' for input", out.stderr
    )


def test_no_instances(cli):
    cmd = [CMD, "--network-file=./fixtures/repos/network_pro.yml"]
    out = cli(*cmd)
    assert out.exitcode == 0


@pytest.mark.tt_168102
def test_pro_instances(cli):
    cmd = [CMD, "--network-file=./fixtures/repos/network_pro_instances.yml"]
    out = cli(*cmd)
    assert out.exitcode == 0


def test_wrong_link(cli):
    cmd = [CMD, "--network-file=./fixtures/instances-validator/wrong_link.yml"]
    out = cli(*cmd)
    assert out.exitcode != 0
    msg = "Missing required instance for connection link"
    assert re.search(
        rf"\[instances/A/proxy/fake\] {msg}",
        out.stderr,
    )
    msg = "Missing required host for connection link"
    assert re.search(
        rf"\[instances/B/proxy/sp3\] {msg}",
        out.stderr,
    )


def test_wrong_link_interfaces(cli):
    file = "wrong_link_interfaces"
    cmd = [
        CMD,
        f"--network-file=./fixtures/instances-validator/{file}.yml",
    ]
    out = cli(*cmd)
    assert out.exitcode != 0
    msg = "Missing type sip_X on link interface"
    assert re.search(
        rf"\[instances/A/proxy/C/neth1\] {msg}",
        out.stderr,
    )
    assert re.search(
        rf"\[instances/B/proxy/sp2/neth1\] {msg}",
        out.stderr,
    )

def test_repeated_instance_name(cli):
    file = "repeated_instance_name"
    cmd = [
        CMD,
        f"--network-file=./fixtures/instances-validator/{file}.yml",
    ]
    out = cli(*cmd)
    assert out.exitcode != 0
    msg = "Duplicate instance name with an existing instance A"
    assert re.search(
        rf"\[/instances/<name>\] {msg}",
        out.stderr,
    )

def test_repeated_instance_name_in_connections(cli):
    file = "repeated_instance_name_in_connections"
    cmd = [
        CMD,
        f"--network-file=./fixtures/instances-validator/{file}.yml",
    ]
    out = cli(*cmd)
    assert out.exitcode != 0
    msg = "Duplicate connetion name #3 : D: proxy"
    assert re.search(
        rf"\[/instances/<name>\] {msg}",
        out.stderr,
    )

def test_host_to_run_on_is_absent(cli):
    file = "host_to_run_on_is_absent"
    cmd = [
        CMD,
        f"--network-file=./fixtures/instances-validator/{file}.yml",
    ]
    out = cli(*cmd)
    assert out.exitcode != 0
    msg = "Missing required host sp3"
    assert re.search(
        rf"\[instances/A\] {msg}",
        out.stderr,
    )