"""Tests para dav_make_calendar. 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 de los cuerpos XML del MKCALENDAR y del PROPPATCH (displayname/color/descripcion escapados). Sin red. """ from infra.dav_make_calendar import ( _build_mkcalendar_xml, _build_proppatch_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/calendars/", "trabajo", ) assert url == "https://dav-x.organic-machine.com/enmanuel/calendars/trabajo/" def test_mkcalendar_xml_incluye_displayname(): xml = _build_mkcalendar_xml("Trabajo") assert "Trabajo" in xml def test_mkcalendar_xml_escapa_displayname(): xml = _build_mkcalendar_xml("Casa & ") assert "Casa & <Ocio>" in xml assert "" not in xml def test_proppatch_xml_color_y_descripcion(): xml = _build_proppatch_xml(color="#e8590c", description="Mi agenda") assert "#e8590c" in xml assert "Mi agenda" in xml def test_proppatch_xml_solo_color(): xml = _build_proppatch_xml(color="#e8590c") assert "#e8590c" in xml assert "calendar-description" not in xml def test_proppatch_xml_escapa_descripcion(): xml = _build_proppatch_xml(description="A & B ") assert "A & B <c>" in xml