Files
fn_registry/python/functions/browser/whatsapp_read_chat_test.py
T
egutierrez 10bfb846a8 ahora si funciona
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-07 16:23:52 +02:00

96 lines
3.4 KiB
Python

"""Tests para whatsapp_read_chat.
whatsapp_read_chat compone whatsapp_open_chat (apertura del chat) + cdp_eval
(lectura de los rows del panel #main) y requiere un Chrome vivo. Aqui se mockean
ambas con monkeypatch sobre el modulo `browser.whatsapp_read_chat` (donde quedan
ligados los nombres por el `from browser.X import Y`), de modo que NO hace falta
Chrome.
"""
import json
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
import browser.whatsapp_read_chat as wrc
from browser.whatsapp_read_chat import whatsapp_read_chat
class _Spy:
"""Registra cada llamada (args, kwargs) y devuelve un valor fijo."""
def __init__(self, ret):
self.calls = []
self.ret = ret
def __call__(self, *args, **kwargs):
self.calls.append((args, kwargs))
return self.ret
# --- Tests -----------------------------------------------------------------
def test_golden_lee_mensajes_y_detecta_outgoing(monkeypatch):
# whatsapp_open_chat abre el chat OK.
open_spy = _Spy(ret={"opened": True, "name": "NOTAS WASAP"})
# cdp_eval devuelve el JSON serializado de dos mensajes (uno entrante, uno saliente).
rows = json.dumps([
{"text": "hola", "outgoing": False},
{"text": "que tal", "outgoing": True},
])
eval_spy = _Spy(ret={"ok": True, "value": rows, "error": "", "target_url": ""})
monkeypatch.setattr(wrc, "whatsapp_open_chat", open_spy)
monkeypatch.setattr(wrc, "cdp_eval", eval_spy)
res = whatsapp_read_chat("NOTAS WASAP", n=2, port=9222,
target_url_substr="whatsapp")
assert res["ok"] is True
assert res["name"] == "NOTAS WASAP"
assert res["count"] == 2
assert res["messages"] == [
{"text": "hola", "outgoing": False},
{"text": "que tal", "outgoing": True},
]
# Se abrio el chat una vez y se leyo una vez.
assert len(open_spy.calls) == 1
assert len(eval_spy.calls) == 1
def test_edge_open_first_falla_no_lee_y_devuelve_reason(monkeypatch):
# whatsapp_open_chat NO consigue abrir el chat.
open_spy = _Spy(ret={
"opened": False,
"name": "Contacto Inexistente",
"reason": "chat no encontrado en la lista (no cargado o nombre inexacto)",
})
eval_spy = _Spy(ret={"ok": True, "value": "[]", "error": "", "target_url": ""})
monkeypatch.setattr(wrc, "whatsapp_open_chat", open_spy)
monkeypatch.setattr(wrc, "cdp_eval", eval_spy)
res = whatsapp_read_chat("Contacto Inexistente", open_first=True)
assert res["ok"] is False
assert res["name"] == "Contacto Inexistente"
assert res["messages"] == []
assert "no encontrado" in res["reason"]
# Como la apertura fallo, NO se llamo al cdp_eval de lectura.
assert len(eval_spy.calls) == 0
def test_open_first_false_no_llama_open_chat(monkeypatch):
# Con open_first=False no se debe invocar whatsapp_open_chat; se lee directo.
open_spy = _Spy(ret={"opened": True})
rows = json.dumps([{"text": "ya estaba abierto", "outgoing": False}])
eval_spy = _Spy(ret={"ok": True, "value": rows, "error": "", "target_url": ""})
monkeypatch.setattr(wrc, "whatsapp_open_chat", open_spy)
monkeypatch.setattr(wrc, "cdp_eval", eval_spy)
res = whatsapp_read_chat("NOTAS WASAP", n=1, open_first=False)
assert res["ok"] is True
assert res["count"] == 1
assert len(open_spy.calls) == 0
assert len(eval_spy.calls) == 1