feat(dav): expand_rrule + dav_make_calendar para recurrencia y multi-calendario
Dos funciones nuevas del grupo de capacidad `dav`: - expand_rrule_py_infra (pure): expande una RRULE iCalendar a las fechas de cada ocurrencia dentro de un rango [from, to]. Solo stdlib (datetime, re). Soporta FREQ DAILY/WEEKLY/MONTHLY/YEARLY, INTERVAL, COUNT, UNTIL, BYDAY. 9 tests. - dav_make_calendar_py_infra (impure): crea una coleccion de calendario nueva via MKCALENDAR + PROPPATCH de nombre/color. Idempotente si ya existe. 11 tests. Consumidas por la app osint_web (eventos recurrentes + creacion de agendas). Pagina del grupo dav actualizada con ambas. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
"""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 "<C:mkcalendar" in xml
|
||||
assert "<D:displayname>Trabajo</D:displayname>" in xml
|
||||
|
||||
|
||||
def test_mkcalendar_xml_escapa_displayname():
|
||||
xml = _build_mkcalendar_xml("Casa & <Ocio>")
|
||||
assert "Casa & <Ocio>" in xml
|
||||
assert "<Ocio>" not in xml
|
||||
|
||||
|
||||
def test_proppatch_xml_color_y_descripcion():
|
||||
xml = _build_proppatch_xml(color="#e8590c", description="Mi agenda")
|
||||
assert "<A:calendar-color>#e8590c</A:calendar-color>" in xml
|
||||
assert "<C:calendar-description>Mi agenda</C:calendar-description>" in xml
|
||||
|
||||
|
||||
def test_proppatch_xml_solo_color():
|
||||
xml = _build_proppatch_xml(color="#e8590c")
|
||||
assert "<A:calendar-color>#e8590c</A:calendar-color>" in xml
|
||||
assert "calendar-description" not in xml
|
||||
|
||||
|
||||
def test_proppatch_xml_escapa_descripcion():
|
||||
xml = _build_proppatch_xml(description="A & B <c>")
|
||||
assert "A & B <c>" in xml
|
||||
Reference in New Issue
Block a user