"""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