"""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 "" in xml def test_mkcol_xml_incluye_displayname(): xml = _build_mkcol_xml("Trabajo") assert "Trabajo" in xml def test_mkcol_xml_escapa_displayname(): xml = _build_mkcol_xml("Casa & ") assert "Casa & <Ocio>" in xml assert "" not in xml def test_mkcol_xml_incluye_y_escapa_descripcion(): xml = _build_mkcol_xml("Trabajo", description="A & B ") assert ( "A & B <c>" in xml ) def test_mkcol_xml_omite_descripcion_vacia(): xml = _build_mkcol_xml("Trabajo") assert "addressbook-description" not in xml