# -*- coding: utf-8 -*- """Test puntual del fallback que insertamos: - Crea contacto en PINOTEPA SIN poblar el CF id_contacto_sucursal. - Dispara el webhook Sucursal->Marca. - Espera unos segundos. - Verifica que el CF en la SUCURSAL quedo poblado == contact.id. Eso prueba que el IF entro por la rama "false" y el PUT autoenlazo. - Cleanup: borra el contacto sucursal y cualquier contacto Marca que se haya creado con CF apuntando al sucursal. """ import os import sys import time import json import datetime ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, ROOT_DIR) sys.path.insert(0, os.path.join(ROOT_DIR, "scripts")) # Importa helpers del harness E2E from scripts import n8n_e2e_test as t PINOTEPA = t.PINOTEPA_LOCATION_ID BRAND = t.BRAND_LOCATION_ID WEBHOOK = t.WEBHOOK_URL_SUC_TO_MARCA CF_KEY = t.CF_KEY def log(msg): ts = datetime.datetime.now().strftime("%H:%M:%S") print(f"[{ts}] {msg}", flush=True) def main(): cleanup = t.Cleanup() try: # 1) Resolver field_id del CF en sucursal (varia por sucursal) cf_id_branch = t.resolve_cf_id_in_location(PINOTEPA, CF_KEY) log(f"CF field_id en PINOTEPA: {cf_id_branch}") assert cf_id_branch, "No se resolvio field_id del CF en sucursal" # 2) Crear contacto sucursal SIN CF poblado phone = "+5219991119911" payload = t._new_contact_payload("FB", phone=phone, email="fbtest@e3.local") branch_id = t.create_contact(PINOTEPA, payload) cleanup.register(PINOTEPA, branch_id, "fallback branch") log(f"Branch contact creado: {branch_id}") # 3) Sanity: confirmar que el CF arranca VACIO en sucursal c0 = t.get_contact(PINOTEPA, branch_id) cf0 = t.cf_value_of(c0, cf_id_branch) log(f"CF pre-webhook en sucursal: {cf0!r} (esperado: vacio)") assert not cf0, f"CF deberia estar vacio antes del webhook, valor={cf0!r}" # 4) Disparar webhook Sucursal -> Marca webhook_payload = t.build_webhook_payload_suc_to_marca(c0) s, body = t.fire_webhook(WEBHOOK, webhook_payload) log(f"Webhook status: {s} body: {body[:100]}") assert s == 200, f"Webhook fallo: {s}" # 5) Esperar a que el workflow termine + GHL indexe log("Esperando 15s para que el fallback PUT corra y GHL indexe...") time.sleep(15) # 6) Verificar que el CF en SUCURSAL quedo poblado con branch_id c1 = t.get_contact(PINOTEPA, branch_id) cf1 = t.cf_value_of(c1, cf_id_branch) log(f"CF post-webhook en sucursal: {cf1!r}") if cf1 == branch_id: log("[OK] El fallback autoenlazo correctamente: rama false -> PUT funciono.") else: log(f"[FAIL] CF post-webhook = {cf1!r}, esperaba {branch_id!r}") sys.exit(2) # 7) Buscar contacto Marca creado (deberia existir con CF apuntando) brand_matches = t._find_brand_with_cf(branch_id) if brand_matches: for m in brand_matches: cleanup.register(BRAND, m["id"], "fallback brand (creado por workflow)") log(f"[OK] Brand creado: {[m['id'] for m in brand_matches]}") else: log("[WARN] No se encontro contacto Marca con CF=branch_id (puede tardar mas en indexar).") finally: cleanup.run() if __name__ == "__main__": main()