"""Проверки поведения парсера IOC."""

from __future__ import annotations

from ioc_checker.iocs.text_parser import TextIOCParser


def test_url_blocks_nested_domain() -> None:
    """URL должен перехватывать домен целиком."""

    parser = TextIOCParser()
    results = parser.parse("Посетите http://example.com/path для деталей")
    assert len(results) == 1
    assert results[0].indicator.category == "url"


def test_url_blocks_embedded_ip() -> None:
    """IP внутри URL не должен выделяться отдельно."""

    parser = TextIOCParser()
    results = parser.parse("Используйте http://127.0.0.1:8080/index.html")
    assert len(results) == 1
    assert results[0].indicator.category == "url"


def test_independent_indicators_detected() -> None:
    """Независимые IOC должны находиться параллельно."""

    parser = TextIOCParser()
    text = "Домены example.com и test.local, а также адрес 8.8.8.8"
    results = parser.parse(text)
    kinds = {item.indicator.category for item in results}
    assert "domain" in kinds
    assert "ip" in kinds


def test_domain_with_nested_subdomain_hash() -> None:
    """Домен с длинным хешем и поддоменом должен корректно определяться."""
    parser = TextIOCParser()
    text = "66755d39c10960e085f601490daf0c37.bulinouui.sbs"
    results = parser.parse(text)
    assert len(results) == 1
    ind = results[0].indicator
    assert ind.category == "domain"


def test_domain_with_embedded_ip_like_label() -> None:
    """Домен, начинающийся с IP-подобного сегмента, должен считаться доменом."""
    parser = TextIOCParser()
    text = "1.1.1.1.malware.com"
    results = parser.parse(text)
    assert len(results) == 1
    ind = results[0].indicator
    assert ind.category == "domain"


def test_unicode_domain_returns_punycode() -> None:
    """Юникод-домены должны возвращаться в punycode."""

    parser = TextIOCParser()
    text = "Проверка домена пример.рф"
    results = parser.parse(text)
    assert len(results) == 1
    indicator = results[0].indicator
    assert indicator.category == "domain"
    assert indicator.value == "xn--e1afmkfd.xn--p1ai"
