# Configuración

> Cada opción de @probara/cucumber-reporter, su variable PROBARA_* y su valor por defecto, y dónde escribe el reporter su salida.

Cada ajuste es una opción del formateador bajo la clave `probara` de `formatOptions`, y la mayoría tiene
también una variable `PROBARA_*`. Guarda el token en el entorno, el proyecto en la configuración (o en el
entorno), y el resto donde encaje en tu pipeline.

Una opción en `formatOptions` gana a su variable `PROBARA_*`, y la variable gana al valor por defecto. Las
mismas opciones funcionan en la línea de comandos:

```bash
npx cucumber-js --format-options '{"probara":{"projectId":"SHOP"}}'
```

## Inicio rápido

1. Crea un token de aplicación desde la tarjeta **Cucumber** en **Integraciones**
   ([obtener un token](#obtener-un-token)) y guárdalo como secreto de CI llamado `PROBARA_API_TOKEN`.
2. Define el código del proyecto: `projectId` en las opciones del formateador, o `PROBARA_PROJECT`. Un código
   de proyecto es una letra mayúscula, y después letras mayúsculas o dígitos (`SHOP`, `E2E`). Cualquier otro
   valor desactiva el reporte, con un error.
3. Todo lo demás tiene un valor por defecto. La ejecución toma el nombre de la compilación de CI, y su rama,
   su commit y la URL de la compilación salen del CI por sí solos.

## Opciones

### Conexión y proyecto

| Opción      | Variable            | Tipo     | Por defecto               | Qué hace                                                                                                                                                   |
| ----------- | ------------------- | -------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `enabled`   | `PROBARA_ENABLED`   | boolean  | `true`                    | `false` desactiva el reporte: no se envía nada y no se registra nada                                                                                       |
| `apiToken`  | `PROBARA_API_TOKEN` | string   | ninguno (obligatorio)     | El token de aplicación. Guárdalo en el entorno                                                                                                             |
| `projectId` | `PROBARA_PROJECT`   | string   | ninguno (obligatorio)     | El código del proyecto, como `SHOP`                                                                                                                        |
| `baseUrl`   | `PROBARA_BASE_URL`  | string   | `https://app.probara.net` | La instancia de Probara a la que se reporta ([red](#red))                                                                                                  |
| `projects`  | `PROBARA_PROJECTS`  | string[] | ninguno                   | Otros proyectos a los que pueden ir resultados (`WEB,API`), según el caso de cada resultado ([vincular](https://docs.probara.net/es/developers/ci-integrations/cucumber/linking/)) |

### La ejecución

| Opción                   | Variable                      | Tipo                      | Por defecto                                                       | Qué hace                                                                                                                      |
| ------------------------ | ----------------------------- | ------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `run.ulid`               | `PROBARA_RUN_ULID`            | string                    | ninguno: una ejecución nueva                                      | Reporta en una ejecución existente. No se cierra por defecto                                                                  |
| `run.name`               | `PROBARA_RUN_NAME`            | string                    | el nombre de la compilación de CI; si no, `Automated run <fecha>` | Nombre de una ejecución nueva                                                                                                 |
| `run.description`        | `PROBARA_RUN_DESCRIPTION`     | string                    | ninguno                                                           | Descripción de una ejecución nueva                                                                                            |
| `run.environment`        | `PROBARA_ENVIRONMENT`         | string                    | ninguno                                                           | Entorno de una ejecución nueva, por nombre; se crea si ninguno coincide                                                       |
| `run.environmentId`      | `PROBARA_ENVIRONMENT_ID`      | string                    | ninguno                                                           | Entorno de una ejecución nueva, por ULID                                                                                      |
| `run.milestone`          | `PROBARA_MILESTONE`           | string                    | ninguno                                                           | Hito de una ejecución nueva, por identificador visible (`M-3`) o por nombre                                                   |
| `run.milestoneId`        | `PROBARA_MILESTONE_ID`        | string                    | ninguno                                                           | Hito de una ejecución nueva, por ULID                                                                                         |
| `run.plan`               | `PROBARA_PLAN`                | string                    | ninguno                                                           | Plan de pruebas de una ejecución nueva, por identificador visible (`PLAN-2`) o por nombre: la ejecución empieza con sus casos |
| `run.configurations`     | `PROBARA_CONFIGURATIONS`      | `{ group, name }[]`       | ninguno                                                           | Configuraciones de una ejecución nueva, por nombre (`Browser=Chrome,OS=Linux`), cada grupo una vez                            |
| `run.configurationUlids` | `PROBARA_CONFIGURATION_ULIDS` | string[]                  | ninguno                                                           | Configuraciones de una ejecución nueva, por ULID                                                                              |
| `run.tags`               | `PROBARA_RUN_TAGS`            | string[]                  | ninguno                                                           | Etiquetas de una ejecución nueva                                                                                              |
| `run.ulids`              | `PROBARA_RUN_ULIDS`           | `Record<string, string>`  | ninguno                                                           | La ejecución que se reutiliza en cada proyecto (`WEB=<ulid>,API=<ulid>`)                                                      |
| `closeRun`               | `PROBARA_CLOSE_RUN`           | boolean                   | `true` para una nueva, `false` para una reutilizada               | Cierra la ejecución al final                                                                                                  |
| `closeRuns`              | ninguna                       | `Record<string, boolean>` | ninguno                                                           | Cierra la ejecución de cada proyecto (`{ SHOP: true, WEB: false }`) cuando no se define `closeRun`                            |

### Origen de la ejecución

| Opción            | Variable            | Tipo                                    | Por defecto           | Qué hace                                                                      |
| ----------------- | ------------------- | --------------------------------------- | --------------------- | ----------------------------------------------------------------------------- |
| `source`          | ninguna             | `false \| objeto (campos GitHub abajo)` | detectado desde el CI | `false` no envía origen. Un objeto sustituye los campos detectados, uno a uno |
| `source.branch`   | `PROBARA_BRANCH`    | string                                  | detectado desde el CI | Rama del origen de la ejecución                                               |
| `source.commit`   | `PROBARA_COMMIT`    | string                                  | detectado desde el CI | Commit del origen de la ejecución                                             |
| `source.buildUrl` | `PROBARA_BUILD_URL` | string                                  | detectado desde el CI | URL de la compilación de CI del origen de la ejecución                        |

En GitHub Actions el origen también recibe estos campos, detectados de las variables `GITHUB_*`:

| Opción                     | Variable | Tipo     | Por defecto                 | Qué hace                                                                        |
| -------------------------- | -------- | -------- | --------------------------- | ------------------------------------------------------------------------------- |
| `source.provider`          | ninguna  | `string` | detectado de GitHub Actions | `github_actions` (detectado) u `other`                                          |
| `source.repository`        | ninguna  | `string` | detectado de GitHub Actions | Repositorio del origen de la ejecución, `owner/name`                            |
| `source.commitAuthor`      | ninguna  | `string` | detectado de GitHub Actions | Quién activó el build                                                           |
| `source.pullRequestNumber` | ninguna  | `number` | detectado de GitHub Actions | Pull request del build                                                          |
| `source.workflow`          | ninguna  | `string` | detectado de GitHub Actions | Workflow de CI del origen de la ejecución                                       |
| `source.ciRunId`           | ninguna  | `string` | detectado de GitHub Actions | Id de la ejecución de CI: los jobs de un mismo workflow comparten una ejecución |
| `source.ciRunAttempt`      | ninguna  | `number` | detectado de GitHub Actions | Intento de la ejecución de CI: una re-ejecución va a una ejecución propia       |
| `source.ciJob`             | ninguna  | `string` | detectado de GitHub Actions | Job de CI del origen de la ejecución                                            |

### Casos

| Opción               | Variable                       | Tipo    | Por defecto          | Qué hace                                                                                                                                                   |
| -------------------- | ------------------------------ | ------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `createMissingCases` | `PROBARA_CREATE_MISSING_CASES` | boolean | `true`               | Crea un caso para un escenario que no coincide con ninguno ([vincular](https://docs.probara.net/es/developers/ci-integrations/cucumber/linking/#escenarios-sin-caso-sincronizado)) |
| `suiteUlid`          | `PROBARA_SUITE_ULID`           | string  | la raíz del proyecto | Suite bajo la que van los casos creados                                                                                                                    |

### Resultados, adjuntos y archivos

| Opción              | Variable                     | Tipo                                   | Por defecto                                 | Qué hace                                                                                                                                                          |
| ------------------- | ---------------------------- | -------------------------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `statusMapping`     | `PROBARA_STATUS_MAPPING`     | `{ passed, failed, skipped, blocked }` | ninguno                                     | Envía un estado como otro (`failed=blocked`) ([estados](https://docs.probara.net/es/developers/ci-integrations/cucumber/results-and-retries/#mapeo-y-filtro-de-estados))                  |
| `statusFilter`      | `PROBARA_STATUS_FILTER`      | string[]                               | ninguno                                     | No envía resultados con estos estados, después del mapeo (`skipped`)                                                                                              |
| `assignFailedTo`    | `PROBARA_ASSIGN_FAILED_TO`   | string[]                               | ninguno                                     | Asigna cada resultado fallido sin responsable a uno de estos miembros, por turnos (`ana@example.com,bo@example.com`)                                              |
| `uploadAttachments` | `PROBARA_UPLOAD_ATTACHMENTS` | boolean                                | `true`                                      | `false` no sube ningún archivo ([pasos y adjuntos](https://docs.probara.net/es/developers/ci-integrations/cucumber/steps-and-attachments/#adjuntos))                                      |
| `resultsFile`       | `PROBARA_RESULTS_FILE`       | string                                 | ninguno                                     | Archivo JSON para lo que no se pudo enviar ([archivo de resultados](https://docs.probara.net/es/developers/ci-integrations/cucumber/results-and-retries/#archivo-de-resultados))          |
| `rootDir`           | ninguna                      | string                                 | el directorio desde donde corre cucumber-js | Directorio al que son relativas las rutas de los archivos en las claves de automatización ([vincular](https://docs.probara.net/es/developers/ci-integrations/cucumber/linking/#la-clave)) |
| `debug`             | `PROBARA_DEBUG`              | boolean                                | `false`                                     | Registra cada petición, sin el token ([solución de problemas](https://docs.probara.net/es/developers/ci-integrations/cucumber/troubleshooting/#depuración))                               |

### Red

| Opción                  | Variable | Tipo   | Por defecto | Qué hace                                                         |
| ----------------------- | -------- | ------ | ----------- | ---------------------------------------------------------------- |
| `chunkSize`             | ninguna  | number | `500`       | Resultados por petición de reporte, de 1 a 500                   |
| `timeoutMs`             | ninguna  | number | `30000`     | Tiempo límite de un intento HTTP, en milisegundos, de 1 a 600000 |
| `maxRetries`            | ninguna  | number | `4`         | Reintentos de una petición fallida, de 0 a 10                    |
| `attachmentConcurrency` | ninguna  | number | `2`         | Resultados cuyos adjuntos se suben al mismo tiempo, de 1 a 8     |

Los resultados se envían al final de la ejecución, en peticiones de reporte de hasta `chunkSize` resultados. En una
ejecución con más resultados, cada petición completa sale durante la ejecución, y el resto al terminar.

Una petición fallida se reintenta con una espera creciente. Si sigue fallando, se registra y se cuenta en el
resumen, y la ejecución continúa. Pon `maxRetries` a `0` para fallar rápido cuando Probara no responda: los
resultados se conservan entonces en el [archivo de resultados](https://docs.probara.net/es/developers/ci-integrations/cucumber/results-and-retries/#archivo-de-resultados),
si lo has configurado. Un proxy o una instancia propia de Probara funcionan igual: pon en `baseUrl` su dirección.

El formateador también acepta, para código y pruebas, las piezas de `@probara/core`: `logger`, `env`, `fetch`,
`sleep`, `random` y `now`. No tienen variable, y un `cucumber.js` rara vez las necesita.

## Dónde va la salida

cucumber-js envía stdout a un solo formateador: el último `--format` sin ruta. Sin ningún `--format`, ese es su
propio formateador `progress`. Por eso, `--format @probara/cucumber-reporter` por sí solo no imprime nada en
stdout, y las líneas `[probara]` van a stderr.

Para conservar la salida de progreso, indica una ruta al formateador:

```bash
npx cucumber-js --format progress --format @probara/cucumber-reporter:reports/probara.txt
```

El reporter no escribe nada en ese archivo (sus registros van a stderr), así que el archivo queda vacío. Dos
formateadores sin ruta no imprimen los dos: cucumber-js conserva el último y descarta el otro, sin avisar.

Este formateador solo lee la clave `probara` de `formatOptions`. Una opción bajo `probara` que el reporter no
conoce se ignora, con una advertencia en el registro que la nombra.

## Obtener un token

Reporta con un token de aplicación. Pertenece a tu organización, no a una persona:

1. Como propietario o administrador, abre **Workspace › Integraciones** en Probara y selecciona la tarjeta **Cucumber**.
2. Escribe un **Nombre del token** según lo que lo use (el repositorio o el pipeline) y selecciona **Crear token**.
3. Selecciona **Copiar token**. Se muestra una sola vez: guárdalo enseguida como secreto de CI llamado `PROBARA_API_TOKEN`.

Un token de aplicación no consume un puesto, sigue funcionando cuando quien lo creó deja la organización, y
muestra la aplicación y su nombre (como **Cucumber · e2e-ci**) en sus ejecuciones y resultados. Solo puede
reportar y sincronizar: crear ejecuciones automatizadas, enviar reportes (que pueden crear casos y suites),
sincronizar archivos `.feature`, añadir adjuntos a los resultados y cerrar ejecuciones. Revócalo desde la misma
tarjeta si puede haberse filtrado.

## Ejecuciones

El formateador crea una ejecución por cada ejecución de cucumber-js, con el nombre de la compilación de CI (o
`Automated run <fecha>` fuera de CI), y la cierra cuando termina. Para reportar en una ejecución que ya existe,
define `run.ulid`: no se cierra a menos que definas `closeRun`.

En GitHub Actions los jobs de un mismo workflow comparten una ejecución, y un job final la cierra
([jobs en paralelo](https://docs.probara.net/es/developers/ci-integrations/cucumber/ci-providers/#jobs-en-paralelo-una-ejecución-cerrada-por-el-job-final)).

Una ejecución nueva puede empezar con su entorno, hito, plan de pruebas, configuraciones y etiquetas. Por
ejemplo, `PROBARA_PLAN=PLAN-2` hace que la ejecución empiece con los casos de ese plan.
