10bfb846a8
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
96 lines
3.4 KiB
Python
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
|