"""Tests para dav_make_addressbook.

La funcion publica es impura (hace HTTP), asi que no se prueba contra un servidor
real. Se ejercitan los helpers puros extraidos a nivel de modulo: la
sanitizacion del slug, la construccion de la URL de la coleccion y la generacion
del cuerpo XML del MKCOL extendido (resourcetype addressbook + displayname +
descripcion escapados). Sin red.
"""

from infra.dav_make_addressbook import (
    _build_mkcol_xml,
    _join_url,
    _sanitize_slug,
)


def test_sanitize_slug_minusculas():
    assert _sanitize_slug("Trabajo") == "trabajo"


def test_sanitize_slug_espacios_a_guion():
    assert _sanitize_slug("agenda de trabajo") == "agenda-de-trabajo"


def test_sanitize_slug_elimina_caracteres_raros():
    assert _sanitize_slug("Casa/Ocio!! 2026") == "casaocio-2026"


def test_sanitize_slug_colapsa_guiones_y_recorta():
    assert _sanitize_slug("  --Foo   Bar--  ") == "foo-bar"


def test_sanitize_slug_vacio():
    assert _sanitize_slug("   !!!   ") == ""


def test_join_url_compone_la_coleccion():
    url = _join_url(
        "https://dav-x.organic-machine.com",
        "/enmanuel/contacts/",
        "trabajo",
    )
    assert url == "https://dav-x.organic-machine.com/enmanuel/contacts/trabajo/"


def test_mkcol_xml_es_mkcol_extendido():
    xml = _build_mkcol_xml("Trabajo")
    assert "<D:mkcol" in xml
    assert 'xmlns:C="urn:ietf:params:xml:ns:carddav"' in xml


def test_mkcol_xml_declara_resourcetype_addressbook():
    xml = _build_mkcol_xml("Trabajo")
    assert "<D:resourcetype><D:collection/><C:addressbook/></D:resourcetype>" in xml


def test_mkcol_xml_incluye_displayname():
    xml = _build_mkcol_xml("Trabajo")
    assert "<D:displayname>Trabajo</D:displayname>" in xml


def test_mkcol_xml_escapa_displayname():
    xml = _build_mkcol_xml("Casa & <Ocio>")
    assert "Casa &amp; &lt;Ocio&gt;" in xml
    assert "<Ocio>" not in xml


def test_mkcol_xml_incluye_y_escapa_descripcion():
    xml = _build_mkcol_xml("Trabajo", description="A & B <c>")
    assert (
        "<C:addressbook-description>A &amp; B &lt;c&gt;</C:addressbook-description>"
        in xml
    )


def test_mkcol_xml_omite_descripcion_vacia():
    xml = _build_mkcol_xml("Trabajo")
    assert "addressbook-description" not in xml
