Files
fn_registry/python/functions/browser/browser_profile_open_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

95 lines
3.8 KiB
Python

"""Tests para browser_profile_open.
browser_profile_open compone browser_profile_show (lectura de metadata) y lanza
Chromium via systemd-run. Aqui se mockea browser_profile_show (ligado en el modulo por
el `from browser.browser_profile_show import browser_profile_show`) y se usa dry_run=True
para NO abrir navegador. Se valida el comando construido en los dos casos clave:
- user_data_dir vacio -> NO se pasa --user-data-dir (lo hereda el wrapper chromium-cdp).
- user_data_dir custom -> SI se pasa --user-data-dir explicito.
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
import browser.browser_profile_open as bpo
from browser.browser_profile_open import browser_profile_open
def _show_ret(user_data_dir=""):
"""Construye una respuesta ok de browser_profile_show con cuentas."""
return {
"status": "ok",
"profile": {"profile_dir": "Profile 1", "user_data_dir": user_data_dir,
"label": "Maria", "status": "active"},
"accounts": [
{"id": "Profile 1:gmail:maria@example.com", "service": "gmail",
"identity": "maria@example.com", "secret_ref": "pass show osint/p1/gmail",
"role": "primary", "status": "active", "notes": ""},
],
}
def test_dry_run_default_user_data_dir_no_pasa_user_data_dir(monkeypatch):
# user_data_dir vacio en la fila -> default del wrapper -> NO --user-data-dir.
monkeypatch.setattr(bpo, "browser_profile_show", lambda pd, base_url="": _show_ret(""))
res = browser_profile_open("Profile 1", url="https://mail.google.com", dry_run=True)
assert res["status"] == "ok"
assert res["profile_dir"] == "Profile 1"
cmd = res["cmd"]
# Lanzamiento aislado via systemd-run --user --scope --.
assert cmd[:5] == ["systemd-run", "--user", "--scope", "--", "chromium"]
assert '--profile-directory=Profile 1' in cmd
# Caso default: NO debe aparecer --user-data-dir (lo inyecta el wrapper).
assert not any(a.startswith("--user-data-dir=") for a in cmd)
# La URL va al final.
assert cmd[-1] == "https://mail.google.com"
# Las cuentas se exponen con su secret_ref (referencia, nunca el password).
assert res["accounts"][0]["secret_ref"] == "pass show osint/p1/gmail"
assert res["accounts"][0]["service"] == "gmail"
def test_dry_run_custom_user_data_dir_pasa_flag_explicito(monkeypatch):
custom = "/mnt/data/chromium-osint"
monkeypatch.setattr(bpo, "browser_profile_show", lambda pd, base_url="": _show_ret(custom))
res = browser_profile_open("Profile 1", dry_run=True)
assert res["status"] == "ok"
cmd = res["cmd"]
# Caso custom: SI debe aparecer --user-data-dir explicito con el dir de la fila.
assert f"--user-data-dir={custom}" in cmd
assert '--profile-directory=Profile 1' in cmd
# Sin url -> el ultimo arg NO es una URL.
assert not cmd[-1].startswith("http")
def test_dry_run_user_data_dir_default_explicito_no_se_pasa(monkeypatch):
# Si la fila trae EXACTAMENTE el default (con ~), tampoco debe pasarse --user-data-dir.
monkeypatch.setattr(
bpo, "browser_profile_show",
lambda pd, base_url="": _show_ret("~/.config/chromium-cdp"),
)
res = browser_profile_open("Profile 1", dry_run=True)
assert res["status"] == "ok"
cmd = res["cmd"]
assert not any(a.startswith("--user-data-dir=") for a in cmd)
def test_error_perfil_no_existe_propaga_sin_lanzar(monkeypatch):
err = {"status": "error", "error": "perfil no encontrado: fantasma"}
monkeypatch.setattr(bpo, "browser_profile_show", lambda pd, base_url="": err)
res = browser_profile_open("fantasma", dry_run=True)
assert res["status"] == "error"
assert "no encontrado" in res["error"]
# No hay cmd ni launched cuando el perfil no existe.
assert "cmd" not in res
assert "launched" not in res