Files
fn_registry/python/functions/browser/browser_profile_register_test.py
T
egutierrez 763e06c127 feat(browser): auto-commit con 178 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-20 18:22:23 +02:00

113 lines
4.1 KiB
Python

"""Tests para browser_profile_register.
browser_profile_register hace POST al service osint_db (perfil + cuentas). Aqui se
mockea el helper compartido `post_json` (ligado en el modulo por el `from
browser._osint_db_client import post_json`) para NO tocar el service real. Se valida
el armado de los payloads y el conteo/errores de cuentas.
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
import browser.browser_profile_register as bpr
from browser.browser_profile_register import browser_profile_register
class _PostSpy:
"""Registra cada (path, payload) y devuelve respuestas segun el path."""
def __init__(self, profile_resp, account_resp):
self.calls = [] # lista de (path, payload)
self.profile_resp = profile_resp
self.account_resp = account_resp
def __call__(self, base_url, path, payload):
self.calls.append((path, payload))
if path == "/api/browser-profile":
return self.profile_resp
return self.account_resp
def test_golden_registra_perfil_con_dos_cuentas(monkeypatch):
spy = _PostSpy(
profile_resp={"status": "ok", "profile_dir": "Profile 1", "inserted": 1, "updated": 0},
account_resp={"status": "ok", "id": "x", "inserted": 1, "updated": 0},
)
monkeypatch.setattr(bpr, "post_json", spy)
res = browser_profile_register(
"Profile 1",
label="Persona Maria",
persona="maria_ficticia",
purpose="rastreo",
tags=["osint", "sock-puppet"],
accounts=[
{"service": "gmail", "identity": "maria@example.com",
"secret_ref": "pass show osint/p1/gmail"},
{"service": "x", "identity": "@maria_fake", "role": "primary"},
],
)
assert res["status"] == "ok"
assert res["profile_dir"] == "Profile 1"
assert res["accounts"] == 2
assert res["account_errors"] == []
# 1 POST de perfil + 2 POST de cuentas = 3 llamadas.
assert len(spy.calls) == 3
profile_path, profile_payload = spy.calls[0]
assert profile_path == "/api/browser-profile"
assert profile_payload["profile_dir"] == "Profile 1"
assert profile_payload["label"] == "Persona Maria"
assert profile_payload["tags"] == ["osint", "sock-puppet"]
assert profile_payload["status"] == "active"
# user_data_dir vacio no debe ir en el payload.
assert "user_data_dir" not in profile_payload
# Las cuentas llevan profile_dir y solo las claves no vacias.
acc_path, acc_payload = spy.calls[1]
assert acc_path == "/api/browser-profile/account"
assert acc_payload["profile_dir"] == "Profile 1"
assert acc_payload["service"] == "gmail"
assert acc_payload["secret_ref"] == "pass show osint/p1/gmail"
def test_edge_cuenta_invalida_se_reporta_y_no_se_envia(monkeypatch):
spy = _PostSpy(
profile_resp={"status": "ok", "profile_dir": "osint_01", "inserted": 0, "updated": 1},
account_resp={"status": "ok"},
)
monkeypatch.setattr(bpr, "post_json", spy)
res = browser_profile_register(
"osint_01",
accounts=[
{"service": "gmail"}, # falta identity -> invalida
{"service": "x", "identity": "@ok"}, # valida
],
)
assert res["status"] == "ok"
assert res["accounts"] == 1 # solo la valida se registro
assert len(res["account_errors"]) == 1
assert "identity" in res["account_errors"][0]["error"]
# La cuenta invalida NO genero POST: 1 perfil + 1 cuenta valida = 2 llamadas.
assert len(spy.calls) == 2
def test_error_post_perfil_falla_devuelve_status_error(monkeypatch):
spy = _PostSpy(
profile_resp={"status": "error", "error": "service osint_db inaccesible"},
account_resp={"status": "ok"},
)
monkeypatch.setattr(bpr, "post_json", spy)
res = browser_profile_register("Profile 1", accounts=[{"service": "g", "identity": "a@b"}])
assert res["status"] == "error"
assert "inaccesible" in res["error"]
# Si el perfil falla, NO se intentan las cuentas: solo 1 llamada (la del perfil).
assert len(spy.calls) == 1