# Prueba de extremo a extremo

import script from "../../../scripts/nexa-e2e.mjs?raw";

El script que está al final de esta página llama a todos los endpoints en el
orden en que los usa el flujo real, imprime lo que envió y lo que recibió de
vuelta, y explica cada paso conforme avanza. Basta ejecutarlo una vez para
ver la integración completa sin leer una sola línea de especificación.

Es **un solo archivo sin dependencias**: no hay repositorio, ni instalación
de paquetes, ni paso de compilación. Se copia, se guarda como
`nexa-e2e.mjs` y se ejecuta.

```sh
node nexa-e2e.mjs
```

Requiere Node 20 o más reciente. Bun y Deno (`deno run --allow-net`)
también funcionan. Para apuntarlo a una implementación propia en lugar del
host de stubs de Tesser, se pasa una URL base:

```sh
node nexa-e2e.mjs https://your-host
```

## Los siete pasos que recorre

| | Paso | |
| --- | --- | --- |
| 1 | Tesser le pide una cotización a Nexa | <N /> |
| 2 | Tesser acepta la cotización | <N /> |
| 3 | Tesser reporta el USDC que llega a custodia | <N /> |
| 4 | Nexa decide acreditar (`quote.credit.sent`) | <T /> |
| 5 | Nexa confirma que los GTQ llegaron (`quote.credit.confirmed`) | <T /> |
| 6 | Tesser instruye el desembolso en GTQ y recibe el resultado en la respuesta | <N /> |
| 7 | Nexa consulta su saldo en USDC | <T /> |

Los pasos 1, 2, 3 y 6 son llamadas de API hacia los
[endpoints de Nexa](/api-nexa). Los pasos 4 y 5 son webhooks hacia el
[receptor de Tesser](/api-tesser/webhooks#receive-nexa-webhook-op-4), que el
script envía en nombre de Nexa para que se puedan ver los envoltorios. El
paso 7 es Nexa llamando a la
[API principal de Tesser](/api-tesser/accounts#get-an-account-by-id).

El desembolso del paso 6 es **sincrónico**, así que el recorrido termina ahí:
no hay ningún evento de avance que esperar. Nexa envía un evento
`payment.status.changed` únicamente si el desembolso falla después, cosa que
el script no simula porque es la excepción y no el flujo. Véase
[4 · Desembolso en GTQ](/es/flow-nexa/gtq-payout).

El paso 4 es el punto de bifurcación: Nexa podría enviar en su lugar
`quote.additional_funds_requested` o `quote.rejected`. Ambos casos se
describen en
[3 · Decisión de acreditación](/es/flow-nexa/credit-decision).

<Callout type="note" title="Estos son stubs">

Los endpoints responden con el ejemplo de la referencia de API sin importar
lo que se les envíe, y no guardan ningún estado entre llamadas. Así que la
ejecución muestra las formas reales, los nombres de los campos y el orden
de los hechos, pero no está verificando que se cumplan las reglas de
secuencia: todavía no hay nada que las imponga. Para eso, conviene apuntar
el script a una implementación real.

</Callout>

Si una llamada responde con algo distinto a un estado de éxito, el script lo
indica y termina con código distinto de cero, lo cual es suficiente para
incorporarlo a un CI como prueba de humo. En cualquier otro caso, basta con
leer la salida e ignorar el código de salida.

## El script

<SyntaxHighlight language="js" code={script} title="nexa-e2e.mjs" showLanguageIndicator />
