"""Tests para dav_list_addressbooks.

Sin red: ejercitan el parser puro `_parse_multistatus` con un multistatus 207
realista (2 libretas CardDAV + el contacts-home). Verifican que descarta el home,
extrae nombre y descripcion correctos, normaliza descripcion ausente a None e
ignora props marcadas 404 por el servidor.
"""

from infra.dav_list_addressbooks import _parse_multistatus

# Multistatus 207 realista al estilo Xandikos: el contacts-home plano + dos
# libretas CardDAV. La segunda no expone addressbook-description en su propstat
# 2xx (Xandikos la devuelve vacia en un propstat 404).
_MULTISTATUS = """<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
  <D:response>
    <D:href>/enmanuel/contacts/</D:href>
    <D:propstat>
      <D:prop>
        <D:resourcetype><D:collection/></D:resourcetype>
        <D:displayname>contacts</D:displayname>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
    <D:propstat>
      <D:prop><C:addressbook-description/></D:prop>
      <D:status>HTTP/1.1 404 Not Found</D:status>
    </D:propstat>
  </D:response>
  <D:response>
    <D:href>/enmanuel/contacts/personal/</D:href>
    <D:propstat>
      <D:prop>
        <D:resourcetype><D:collection/><C:addressbook/></D:resourcetype>
        <D:displayname>Personal</D:displayname>
        <C:addressbook-description>Contactos personales &amp; familia</C:addressbook-description>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>
  <D:response>
    <D:href>/enmanuel/contacts/work/</D:href>
    <D:propstat>
      <D:prop>
        <D:resourcetype><D:collection/><C:addressbook/></D:resourcetype>
        <D:displayname>Trabajo</D:displayname>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
    <D:propstat>
      <D:prop><C:addressbook-description/></D:prop>
      <D:status>HTTP/1.1 404 Not Found</D:status>
    </D:propstat>
  </D:response>
</D:multistatus>
"""


def test_devuelve_dos_libretas_descarta_home():
    libros = _parse_multistatus(_MULTISTATUS, "/enmanuel/contacts/")
    assert len(libros) == 2
    hrefs = [a["href"] for a in libros]
    assert "/enmanuel/contacts/" not in hrefs


def test_ordenadas_por_nombre():
    libros = _parse_multistatus(_MULTISTATUS, "/enmanuel/contacts/")
    # Orden case-insensitive: "Personal" < "Trabajo".
    assert [a["name"] for a in libros] == ["Personal", "Trabajo"]


def test_extrae_nombre_y_descripcion():
    libros = _parse_multistatus(_MULTISTATUS, "/enmanuel/contacts/")
    personal = next(a for a in libros if a["href"] == "/enmanuel/contacts/personal/")
    assert personal["name"] == "Personal"
    # html.unescape convierte &amp; en &.
    assert personal["description"] == "Contactos personales & familia"


def test_descripcion_ausente_es_none():
    libros = _parse_multistatus(_MULTISTATUS, "/enmanuel/contacts/")
    trabajo = next(a for a in libros if a["href"] == "/enmanuel/contacts/work/")
    assert trabajo["name"] == "Trabajo"
    assert trabajo["description"] is None


def test_ignora_props_404():
    # El home tiene un addressbook-description en un propstat 404; aunque no se
    # descartara por resourcetype, no debe colarse como libreta ni su prop vacia
    # mezclarse con otra entrada.
    libros = _parse_multistatus(_MULTISTATUS, "/enmanuel/contacts/")
    for a in libros:
        # Ninguna descripcion debe ser cadena vacia (404 -> None, no "").
        assert a["description"] != ""


def test_multistatus_vacio_devuelve_lista_vacia():
    xml = '<D:multistatus xmlns:D="DAV:"></D:multistatus>'
    assert _parse_multistatus(xml, "/enmanuel/contacts/") == []


def test_home_sin_libretas_solo_home():
    xml = """<D:multistatus xmlns:D="DAV:">
      <D:response>
        <D:href>/enmanuel/contacts/</D:href>
        <D:propstat>
          <D:prop><D:resourcetype><D:collection/></D:resourcetype></D:prop>
          <D:status>HTTP/1.1 200 OK</D:status>
        </D:propstat>
      </D:response>
    </D:multistatus>"""
    assert _parse_multistatus(xml, "/enmanuel/contacts/") == []
