# Solución de problemas del reporter de Jest

> Problemas de @probara/jest-reporter y sus soluciones, cada línea que registra el reporter, PROBARA_DEBUG, y cómo comprobar qué se enviaría sin enviarlo.

Cada entrada parte de lo que ves, y después explica por qué y qué hacer. El reporter escribe en
stderr en líneas `[probara]`; [`PROBARA_DEBUG=true`](#depuración) añade cada petición. Sea cual sea
el problema, el código de salida de Jest sigue siendo el de las pruebas. La
[última tabla](#cada-línea-que-registra-el-reporter) enumera cada línea que registra el reporter.

## No se reporta nada, y no se registra nada

**Por qué.** Sin un token y un proyecto, el reporter queda desactivado y en silencio, a propósito:
las ejecuciones locales y los builds de forks no envían nada. Solo lo indica en debug:

```text
$ PROBARA_DEBUG=true npx jest
[probara] Probara reporting is not configured: set PROBARA_API_TOKEN and PROBARA_PROJECT to enable it
```

**Solución.** Pasa el secreto `PROBARA_API_TOKEN` al paso que ejecuta `jest`, y define el proyecto
(`projectId` o `PROBARA_PROJECT`). Comprueba que el reporter está en los `reporters` de la
configuración que usa Jest: `--reporters` en la línea de comandos sustituye los reporters de la
configuración, y una clave `reporters` dentro de uno de los `projects` de Jest se ignora (regístralo
en el nivel superior).

## El envío está desactivado: un problema de configuración

```text
$ PROBARA_RUN_ULID=R-12 npx jest
[probara] Probara reporting is off: PROBARA_RUN_ULID is not a ULID
```

**Por qué.** Un ajuste tiene un valor incorrecto, o solo está definido uno de los dos, el token o el
proyecto. Cada problema se registra, nombrando la opción o la variable afectada (nunca su valor), y
no se envía nada.

**Solución.** Corrige el ajuste que nombra la línea
([opciones](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#opciones)).

## Probara responde 401 o 403

```text
$ npx jest
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] 3 results were not sent: Probara answered 401 unauthorized: <message from Probara>. No run was created or updated
```

**Por qué.** `401`: el token es incorrecto, está revocado o es de otro Probara (`baseUrl`). `403`: el
token no puede reportar en ese proyecto, o la organización está en el plan Free (el envío desde CI
necesita un plan de pago).

**Solución.** Crea un token de aplicación nuevo desde la tarjeta **Jest**
([primeros pasos](https://docs.probara.net/es/developers/ci-integrations/jest/#1-crea-un-token-de-aplicación)) y actualiza el
secreto; comprueba el ID del Proyecto; comprueba el plan de la organización.

## La ejecución quedó abierta

La línea de error termina con `The run R-4 was left open: <url>` o, cuando ni siquiera el primer
informe llegó, con `No run was created or updated`.

**Por qué.** Un informe falló tras sus reintentos (Probara inalcanzable, un informe rechazado): los
informes siguientes no se envían, y una ejecución que ya tiene resultados queda abierta, para que
nada parezca completo cuando no lo está. Una ejecución de una sesión watch y una ejecución
reutilizada (`run.ulid`) quedan abiertas a propósito.

**Solución.** Define un
[archivo de resultados](https://docs.probara.net/es/developers/ci-integrations/jest/results-and-retries/#archivo-de-resultados):
lo que no se envió va ahí, con la ejecución a la que pertenece, y `probara import results` lo envía a
esa ejecución y la cierra. Si no, cierra la ejecución a mano con
`npx @probara/cli run close --run-ulid <ulid>`, y vuelve a ejecutar las pruebas.

## Un job envía después de cerrarse su ejecución

En GitHub Actions los jobs de un mismo workflow comparten una ejecución, y un job final la cierra. Un
job que envía después de ese cierre recibe `409 ci_run_closed` (la ejecución ya estaba cerrada): el
reporter registra el motivo, no envía nada más, y las pruebas conservan su código de salida.

**Por qué.** Un job que envía no está en el `needs` del job final, así que el job final cerró la
ejecución antes de que ese job enviara. O un job en paralelo cerró la ejecución al terminar porque no
tenía `PROBARA_CLOSE_RUN: false`, y los jobs posteriores reciben el mismo error.

**Solución.** Mantén cada job que envía en el `needs` del job final, y define `PROBARA_CLOSE_RUN: false`
en cada job en paralelo. La sección
[jobs en paralelo](https://docs.probara.net/es/developers/ci-integrations/jest/ci-providers/#jobs-en-paralelo-una-ejecución-cerrada-por-el-job-final)
tiene el workflow completo.

## Resultados no registrados (unmatched)

```text
$ PROBARA_CREATE_MISSING_CASES=false npx jest --runInBand
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 1 result (0 new cases, 2 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1
[probara] 2 results were not recorded (case_not_found): tests/cart.test.js > cart removes an item; tests/login.test.js > login logs in with a valid password
```

**Por qué.** Un resultado nombra un caso que no existe (una errata en un ID, un caso de otro
proyecto), o no coincide con ningún caso mientras `createMissingCases` está desactivado. Probara
registra los demás e indica cuáles se omitieron, con el motivo.

**Solución.** Corrige el ID, crea el caso, o deja que el reporter cree los casos que faltan (el valor
por defecto).

## Cada ejecución crea casos nuevos

**Por qué.** Las claves de automatización cambiaron: se renombró o movió una prueba, un `describe` o
un archivo, `jest` se ejecuta desde otro directorio que antes (las claves son relativas a él), o
cambió `keyIncludesFile`
([qué cambia una clave](https://docs.probara.net/es/developers/ci-integrations/jest/linking/#claves-de-automatización)). Si
vienes de `probara import junit`, el informe de jest-junit puede haberse escrito sin el atributo de
archivo, o con otras plantillas.

**Solución.** Nombra los casos en los títulos
([vincular](https://docs.probara.net/es/developers/ci-integrations/jest/linking/)), para que un cambio de nombre los conserve.
Define `rootDir` cuando `jest` se ejecute desde directorios distintos. Antes de una refactorización,
[compara las claves](#comprobar-qué-se-enviaría); si vienes de la importación JUnit, consulta
[migrar desde la importación JUnit](https://docs.probara.net/es/developers/ci-integrations/jest/migrating/#desde-la-importación-junit).

## Un archivo de prueba no se reporta

```text
$ npx jest
[probara] Could not report tests/totals.test.js: Jest could not run it (Cannot find module '../src/totals' from 'tests/totals.test.js')
```

**Por qué.** Jest no pudo ejecutar el archivo (un error de sintaxis, una importación que lanza un
error, un módulo que falta): no tiene pruebas que reportar. El motivo entre paréntesis es la primera
línea del error de Jest.

**Solución.** Corrige el archivo; la salida del propio Jest, encima de las líneas `[probara]`,
muestra el error completo. Un hook `afterAll` que lanza un error es distinto: sus pruebas se
reportan, con un resultado fallido más
([estados](https://docs.probara.net/es/developers/ci-integrations/jest/results-and-retries/#un-hook-que-falla-después-de-las-pruebas)).

## Un helper advierte que solo funciona mientras corre una prueba

**Por qué.** Se llamó a un helper `probara.*` fuera de una prueba: al principio de un archivo, en el
cuerpo de un `describe`, en `beforeAll` o en `afterAll`. No se registra nada, y la prueba continúa.

**Solución.** Llámalo en la prueba, en `beforeEach` o en `afterEach`
([dónde llamar a los helpers](https://docs.probara.net/es/developers/ci-integrations/jest/metadata/#dónde-llamar-a-los-helpers)).

## Los helpers no registran nada

| Ves                                                                                | Por qué, y qué hacer                                                                                                              |
| ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `probara.* needs jest-circus, Jest's default test runner: ...`                     | La configuración define `testRunner` con otro runner (`jest-jasmine2`). Quítalo: jest-circus es el de Jest por defecto            |
| Ninguna advertencia, y ni pasos, ni archivos, ni metadatos en un archivo de prueba | El archivo simula `fs` (`jest.mock('fs')`), con el que escriben los helpers. Simula en su lugar los módulos que importa tu código |
| Ninguna advertencia, y nada en ningún archivo                                      | El envío está desactivado (sin token, `enabled: false`): los helpers no hacen nada, y `probara.step()` sigue ejecutando su cuerpo |
| `The probara.* helpers are off: could not create their channel: ...`               | No se puede escribir en el directorio temporal del sistema. Apunta `TMPDIR` a una carpeta con permisos de escritura               |

## Una prueba perdió sus pasos o archivos

```js
// tests/prices.test.js
const { probara } = require('@probara/jest-reporter');

test.each([1, 2])('rounds the total', (items) => {
  probara.parameters({ items });
});
```

```text
$ npx jest
[probara] Several tests of one file have the same full name and attempt: what the probara.* helpers said about them is left out (first seen in tests/prices.test.js › rounds the total; repeats are logged at debug)
[probara] Sending 2 results of 1 test (2 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 2 results (1 new case, 0 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1
```

Se envían ambas filas, en un solo caso, sin sus parámetros.

**Por qué.** El reporter asocia lo que dijeron los helpers a un intento por su archivo de prueba, su
nombre completo (los títulos de los `describe` y el título, unidos por espacios) y su número de
intento. Cuando eso no basta para distinguir dos intentos, omite sus detalles en lugar de atribuirlos
a la prueba equivocada:

- **Dos pruebas de un archivo con el mismo nombre completo**: un título de `test.each` sin marcador
  (como arriba), el mismo título dos veces, o `a b` › `c` junto a `a` › `b c`.
- **Un archivo que dos proyectos de Jest ejecutaron al mismo tiempo**: el registro dice
  `Several Jest projects ran this file at once`
  ([proyectos de Jest](https://docs.probara.net/es/developers/ci-integrations/jest/sharding/#proyectos-de-jest)).
- **Una prueba `test.concurrent` reintentada en Jest 30.0 a 30.4**: las llamadas de sus reintentos
  van a su primer intento.

**Solución.** Da a cada prueba de un archivo su propio nombre (marcadores de `test.each`: `%s`,
`$name`), da a los proyectos de Jest sus propios archivos, o actualiza Jest a 30.5.

## La selección ejecutó todas las pruebas

**Por qué.** Con `runCasesOnly`, el reporter no pudo saber qué pruebas pertenecen a la ejecución, así
que todas las pruebas se ejecutaron y se reportaron, en lugar de ninguna. Una advertencia dice por
qué: no hay `PROBARA_RUN_ULID`, los casos de la ejecución no se pudieron leer (un ULID incorrecto, un
token de otra organización), falta el archivo de setup en la configuración de Jest (o en uno de sus
`projects`), o no pudo omitir pruebas en un archivo (otro `testRunner`).

**Solución.** Sigue la advertencia
([cuando no puede seleccionar](https://docs.probara.net/es/developers/ci-integrations/jest/run-selection/#cuando-no-puede-seleccionar)).
Si en cambio se omitieron todas las pruebas, ninguna pertenece a la ejecución: comprueba el ULID, y
que las pruebas nombren los casos de la ejecución o tengan sus claves.

## captureOutput no adjunta nada

**Por qué.** Falta el archivo de setup (una advertencia lo indica), o la salida es de un tipo que no
captura: `process.stdout.write`, `console.table` y similares, pruebas `test.concurrent`, un
`afterEach` de nivel superior del archivo de prueba, un método de consola que la prueba simuló, o
salida fuera de una prueba
([salida de consola](https://docs.probara.net/es/developers/ci-integrations/jest/steps-and-attachments/#salida-de-consola)).

**Solución.** Añade `setupFilesAfterEnv: ['@probara/jest-reporter/setup']` a la configuración (a
cada proyecto de Jest), y escribe con `console.log`, `info`, `debug`, `warn` o `error` dentro de la
prueba, de un `beforeEach` o del `afterEach` de un bloque `describe`.

## Falta un adjunto

**Por qué.** El registro nombra cada archivo que omitió y por qué: más de 32 MiB, una imagen de más
de 10 MiB o de 8192 px, un tipo de contenido rechazado, más de 20 archivos en un resultado, o un
archivo que `probara.attach()` no pudo leer cuando se llamó
([límites](https://docs.probara.net/es/developers/ci-integrations/jest/steps-and-attachments/#límites-y-qué-se-omite)). Un
archivo adjuntado dentro de un paso va a ese paso, no al resultado.

**Solución.** Adjunta un archivo que exista cuando llamas a `probara.attach()` (se copia en el
momento), mantén los archivos dentro de los límites, y adjunta menos archivos por resultado.

## Probara responde 429 (demasiadas peticiones)

**Por qué.** El límite de peticiones de la organización (60 peticiones por minuto en Free, 1.200 en Pro y 3.000 en Enterprise) lo comparten todos los tokens y pipelines. Los adjuntos cuestan dos peticiones por resultado
([límite de peticiones](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#límite-de-peticiones)).

**Solución.** El reporter espera y reintenta por su cuenta. En baterías grandes, adjunta menos,
reduce `attachmentConcurrency` o reparte en el tiempo los pipelines con sharding.

## Depuración

### El registro

El reporter solo escribe en **stderr**, con cada línea precedida de `[probara]`; el resto de la
terminal pertenece a los reporters del propio Jest (`default`, `summary`...). Una ejecución que
reporta registra dos líneas:

```text
$ npx jest
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 3 results (2 new cases, 0 unmatched) in R-1 (closed): https://app.probara.net/projects/SHOP/runs/R-1
```

| Línea                                                    | Qué dice                                                                                                                  |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `Sending N results of M tests (...)`                     | Antes de enviar nada: un resultado por intento y caso, por estado después de `statusMapping`, y lo que se dejó fuera      |
| `Recorded N results (...) in R-1`                        | Por ejecución: lo que registró Probara, los casos que creó, los resultados que no pudo asociar, y el enlace               |
| `N results were not recorded (...)`                      | Los resultados no asociados, por motivo, con sus casos o claves                                                           |
| `Attached N files to results (...)`                      | Subidas: adjuntados, omitidos y fallidos                                                                                  |
| `N results were not sent: ...`                           | Un informe fallido: el motivo, y la ejecución que quedó abierta                                                           |
| `Wrote ... to <file>`                                    | Lo que fue al archivo de resultados                                                                                       |
| `Ran only the tests of run <ULID>: ...`                  | Selección de pruebas: cuántas pruebas coincidieron con los casos de la ejecución, y cuántas se omitieron y quedaron fuera |
| `Watch mode: every re-run reports into R-1 of SHOP, ...` | Modo watch: la única ejecución de la sesión, que queda abierta, y el comando que la cierra                                |
| `Could not report <file>: Jest could not run it (...)`   | Un archivo de prueba que no se pudo cargar: no tiene pruebas que reportar                                                 |
| `Probara reporting is off: ...`                          | Un problema de configuración: no se envía nada                                                                            |

Una advertencia que se repite en cada prueba (una llamada `probara.*` mal formada, un adjunto
omitido, un archivo de prueba sin el archivo de setup) se registra la primera vez, indicando dónde se
vio primero, con `(first seen in <file or test>; repeats are logged at debug)`, y en debug a partir
de entonces. El token nunca aparece en ninguna línea, aunque la respuesta de Probara lo repita.

### `PROBARA_DEBUG`

`debug: true` (`PROBARA_DEBUG=true`) añade una línea por cada petición (método, ruta, estado, tiempo)
y cada reintento, las repeticiones de las advertencias, e indica por qué el envío está desactivado
cuando lo está:

```bash
PROBARA_DEBUG=true npx jest
```

Mantenlo desactivado en las ejecuciones normales: es muy detallado, aunque nunca registra el token ni
los cuerpos.

### Comprobar qué se enviaría

El reporter no tiene un modo de simulación propio, pero un archivo de resultados cumple esa función:
ejecuta las pruebas con el envío desactivado y un archivo de resultados, y deja que la CLI muestre lo
que enviaría. No llega nada a Probara, y no hace falta token:

```text
$ PROBARA_ENABLED=false PROBARA_PROJECT=SHOP PROBARA_RESULTS_FILE=probara-results.json npx jest --runInBand
[probara] Wrote 3 results to /work/shop/probara-results.json: send them with probara import results /work/shop/probara-results.json
$ npx @probara/cli import results probara-results.json --dry-run
passed	SHOP-12	tests/cart.test.js > cart adds an item
passed	-	tests/cart.test.js > cart removes an item
passed	-	tests/login.test.js > login logs in with a valid password
Total: 3 results from 1 file (3 passed, 0 failed, 0 skipped, 0 blocked)
```

El primer comando escribe en stderr; la simulación imprime en stdout, una línea por resultado, en el
orden en que se escribieron los resultados (`--runInBand` lo mantiene igual entre ejecuciones): el
estado, el caso (`-` si no se nombra ninguno) y la clave de automatización. `--dry-run` nunca toca el
archivo; bórralo después, o impórtalo de verdad (un archivo que queda ahí hace que la siguiente
ejecución escriba `probara-results-2.json`). `--json` imprime en su lugar el documento completo, cada
entrada tal como la recibiría Probara
([`probara import results`](https://github.com/cynch-me/probara-sdk/blob/main/packages/cli/docs/commands.md#probara-import-results)).

Úsalo para comparar claves antes de una refactorización, una actualización o un cambio de
`keyIncludesFile`: escribe un archivo por ejecución, y compara las dos simulaciones con `diff`. Da a
cada ejecución su propio nombre de archivo y empieza sin ellos: si ya hay un archivo en la ruta, una
ejecución escribe en un hermano (`before-2.json`) y la simulación de `before.json` mostraría una
ejecución anterior, ocultando la diferencia.

```bash
rm -f before.json after.json
PROBARA_ENABLED=false PROBARA_PROJECT=SHOP PROBARA_RESULTS_FILE=before.json npx jest
# Change the code, or upgrade the reporter, then:
PROBARA_ENABLED=false PROBARA_PROJECT=SHOP PROBARA_RESULTS_FILE=after.json npx jest
npx @probara/cli import results before.json --dry-run > before.txt
npx @probara/cli import results after.json --dry-run > after.txt
diff before.txt after.txt
```

Cualquier línea que cambió es una prueba cuya clave o cuyo vínculo con un caso cambió: recibiría un
caso nuevo.

## Cada línea que registra el reporter

Las líneas propias del reporter, además de las de la biblioteca de reporte que comparte con el
[reporter de Playwright](https://docs.probara.net/es/developers/ci-integrations/playwright/) y la [CLI](https://docs.probara.net/es/developers/cli/)
(`Sending`, `Recorded`, `not sent`, `Wrote`, `Attached`, `Probara warned`):

| Línea                                                                                                          | Nivel | Dónde mirar                                                                                                                                           |
| -------------------------------------------------------------------------------------------------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Ignored the unknown option "<name>" of @probara/jest-reporter`                                                | warn  | [Opciones desconocidas](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#opciones-desconocidas): una errata                                         |
| `Probara reporting is off: the reporter could not start: <reason>`                                             | error | Repórtalo: el reporter nunca lanza errores dentro de Jest, y dice por qué se detuvo                                                                   |
| `Could not report <file>: Jest could not run it (<reason>)`                                                    | warn  | [Un archivo de prueba no se reporta](#un-archivo-de-prueba-no-se-reporta)                                                                             |
| `captureOutput needs the setup file: ...`                                                                      | warn  | [captureOutput no adjunta nada](#captureoutput-no-adjunta-nada)                                                                                       |
| `runCasesOnly needs the setup file: ...`                                                                       | warn  | [La selección ejecutó todas las pruebas](#la-selección-ejecutó-todas-las-pruebas)                                                                     |
| `runCasesOnly needs the run whose tests to run: ...`                                                           | warn  | [La selección ejecutó todas las pruebas](#la-selección-ejecutó-todas-las-pruebas)                                                                     |
| `runCasesOnly: could not read the cases of the run <ULID> (<reason>). ...`                                     | warn  | [La selección ejecutó todas las pruebas](#la-selección-ejecutó-todas-las-pruebas)                                                                     |
| `runCasesOnly: the setup file could not skip the tests of a file ... (<reason>). ...`                          | warn  | [La selección ejecutó todas las pruebas](#la-selección-ejecutó-todas-las-pruebas)                                                                     |
| `Ran only the tests of run <ULID>: <k> of <m> tests match its cases; ...`                                      | info  | [Selección de pruebas](https://docs.probara.net/es/developers/ci-integrations/jest/run-selection/)                                                                            |
| `No test matches the cases of the run <ULID>: ...`                                                             | warn  | [La selección ejecutó todas las pruebas](#la-selección-ejecutó-todas-las-pruebas)                                                                     |
| `Watch mode: every re-run reports into <run> of <project>, which stays open: ...`                              | info  | [Modo watch](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#modo-watch)                                                                           |
| `The run <run> of <project> was closed: ...` (o `deleted`)                                                     | info  | [Cuando se cierra la ejecución durante la sesión](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#cuando-se-cierra-la-ejecución-durante-la-sesión) |
| `Several Jest projects ran this file at once: ...`                                                             | warn  | [Una prueba perdió sus pasos o archivos](#una-prueba-perdió-sus-pasos-o-archivos)                                                                     |
| `Several tests of one file have the same full name and attempt: ...`                                           | warn  | [Una prueba perdió sus pasos o archivos](#una-prueba-perdió-sus-pasos-o-archivos)                                                                     |
| `The probara.* helpers are off: could not create their channel: <reason>`                                      | error | [Los helpers no registran nada](#los-helpers-no-registran-nada)                                                                                       |
| `probara.<helper>() only works while a test runs (...)`                                                        | warn  | [Dónde llamar a los helpers](https://docs.probara.net/es/developers/ci-integrations/jest/metadata/#dónde-llamar-a-los-helpers)                                                |
| `probara.* needs jest-circus, Jest's default test runner: ...`                                                 | warn  | [Los helpers no registran nada](#los-helpers-no-registran-nada)                                                                                       |
| `probara.<helper>() takes ...`, `probara.attach() could not attach "<name>": <reason>`                         | warn  | Un argumento incorrecto; la llamada se ignora ([metadatos](https://docs.probara.net/es/developers/ci-integrations/jest/metadata/))                                            |
| `Dropped the issues of probara.issue(): no issueUrlTemplate turns their ids into links`                        | warn  | [Enlaces e incidencias](https://docs.probara.net/es/developers/ci-integrations/jest/metadata/#probaraissue-e-issueurltemplate)                                                |
| `Could not report an attempt of "<test>": <reason>`, `Could not follow ...`, `Could not finish reporting: ...` | error | Repórtalo: un intento que el reporter no pudo leer se pierde, y la ejecución continúa                                                                 |

Reporta un problema en
[github.com/cynch-me/probara-sdk/issues](https://github.com/cynch-me/probara-sdk/issues), con las
líneas `[probara]` de una ejecución con `PROBARA_DEBUG=true`.

Relacionado: [Configuración](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/) ·
[Red](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#red) ·
[Archivo de resultados](https://docs.probara.net/es/developers/ci-integrations/jest/results-and-retries/#archivo-de-resultados) ·
Fuente: [troubleshooting.md](https://github.com/cynch-me/probara-sdk/blob/main/packages/jest-reporter/docs/troubleshooting.md),
[debugging.md](https://github.com/cynch-me/probara-sdk/blob/main/packages/jest-reporter/docs/debugging.md)
