# Selección de pruebas en Jest

> Ejecuta solo las pruebas de Jest de una ejecución creada en Probara con runCasesOnly, cómo se asocian las pruebas a los casos de la ejecución, y qué pasa cuando la selección no es posible.

Alguien crea una ejecución en Probara (los casos de una versión, de un plan de pruebas, los que
fallaron ayer) y el pipeline ejecuta exactamente esas pruebas. Con `runCasesOnly`, el reporter lee
los casos de la ejecución antes de que Jest empiece sus pruebas, Jest ejecuta solo las pruebas que
pertenecen a alguno de ellos, y sus resultados van a esa ejecución, que queda abierta.

## Camino rápido

1. Añade una vez el archivo de setup del reporter a la configuración de Jest. Omite las pruebas que
   no son de ningún caso de la ejecución; sin las variables de abajo no hace nada.

   ```js
   // jest.config.js
   module.exports = {
     reporters: ['default', ['@probara/jest-reporter', { projectId: 'SHOP' }]],
     setupFilesAfterEnv: ['@probara/jest-reporter/setup'],
   };
   ```

2. En el job que ejecuta las pruebas de una ejecución, define `PROBARA_RUN_CASES_ONLY=true` y
   `PROBARA_RUN_ULID` con el ULID de la ejecución. En Probara, abre la ejecución, selecciona
   **Acciones de la ejecución** (el menú de la cabecera de la ejecución) y elige **Copiar ULID de la
   ejecución**; la misma opción está en el menú de cada ejecución de la lista de ejecuciones.
3. Revisa la ejecución en Probara: sus casos tienen los resultados, y la ejecución queda abierta para
   quien la creó.

```text
$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] Ran only the tests of run 01J9Z3K4M5N6P7Q8R9S0T1V2W3: 2 of 3 tests match its cases; 1 skipped and not reported
[probara] Sending 2 results of 2 tests (2 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 2 results (0 new cases, 0 unmatched) in R-1 (open): https://app.probara.net/projects/SHOP/runs/R-1
```

En GitHub Actions, un workflow que se inicia a mano con el ULID de la ejecución como input:

```yaml
on:
  workflow_dispatch:
    inputs:
      run_ulid:
        description: The ULID of the Probara run to run the tests of
        required: true

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v5
        with:
          node-version: 22
      - run: npm ci
      - name: Run the tests of a Probara run
        run: npx jest
        env:
          PROBARA_API_TOKEN: ${{ secrets.PROBARA_API_TOKEN }}
          PROBARA_RUN_CASES_ONLY: 'true'
          PROBARA_RUN_ULID: ${{ inputs.run_ulid }}
```

Actívalo por job, con las variables: `runCasesOnly: true` en la configuración de Jest lo activa en
todos los jobs, y un job sin ULID muestra entonces una advertencia y ejecuta todas las pruebas.

## Qué pruebas pertenecen a la ejecución

Una prueba pertenece a la ejecución cuando se cumple una de estas condiciones, que se comprueba para
cada prueba antes de ejecutarla:

| La prueba                                                                       | Ejemplo                                                    |
| ------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| Su clave de automatización es la de uno de los casos de la ejecución            | Un caso que creó el reporter o `probara import junit`      |
| Su título o el de uno de sus `describe` nombra uno de los casos de la ejecución | `test('SHOP-12 adds an item')`, `describe('SHOP-12 cart')` |

- **`probara.id()` no cuenta**: se ejecuta con la prueba, después de la selección. Nombra el caso en
  un título ([vincular](https://docs.probara.net/es/developers/ci-integrations/jest/linking/)).
- **Las claves son las del reporter**: con el mismo
  [`keyIncludesFile`](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#keyincludesfile) y el mismo
  `rootDir` que el informe que vinculó los casos. También cuentan los IDs en los títulos de los
  proyectos de [`projects`](https://docs.probara.net/es/developers/ci-integrations/jest/sharding/#varios-proyectos-de-probara).
- **Un caso de la ejecución sin prueba** simplemente no recibe resultado: el registro solo cuenta las
  pruebas.

En el ejemplo de arriba, la ejecución tiene dos casos: `SHOP-12`, nombrado en el título de una prueba
del carrito, y `SHOP-30`, cuya clave es la de la prueba de login. La tercera prueba no pertenece a
ninguno, así que Jest la omite, y solo se envían las otras dos:

```json
[
  { "caseDisplayId": "SHOP-12", "automationKey": "tests/cart.test.js > cart adds an item" },
  { "automationKey": "tests/login.test.js > login logs in with a valid password" }
]
```

## Qué se reporta

| Prueba                                                                             | Se ejecuta | Se reporta                                    |
| ---------------------------------------------------------------------------------- | ---------- | --------------------------------------------- |
| Pertenece a la ejecución                                                           | Sí         | Sí, en la ejecución, con cada intento         |
| Pertenece a la ejecución, pero es `test.skip`, `test.todo` o un `describe` omitido | No         | Sí, como omitida (un todo con la nota `Todo`) |
| No pertenece a ningún caso de la ejecución                                         | No         | No: el resumen de Jest la cuenta como omitida |

Las pruebas se omiten cuando Jest ya cargó su archivo, desde un hook `beforeAll` raíz que añade el
archivo de setup, así que un archivo sin ninguna prueba de la ejecución sigue ejecutando su ámbito de
módulo y sus hooks `beforeAll` y `afterAll` raíz (los hooks de un `describe` sin pruebas de la
ejecución se omiten con él). Cuando eso es costoso (una base de datos, un navegador), pasa también a
Jest un filtro de rutas que deje fuera esos archivos:

```bash
PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest tests/cart
```

## Cuando no puede seleccionar

La selección nunca rompe la ejecución de pruebas: cuando no puede saber qué pruebas pertenecen a la
ejecución, todas las pruebas se ejecutan y se reportan, con una advertencia.

| Qué pasa                                                  | La advertencia                                                                                                                              |
| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| No hay `run.ulid` ni `PROBARA_RUN_ULID`                   | `runCasesOnly needs the run whose tests to run: set run.ulid or PROBARA_RUN_ULID. Every test runs and is reported`                          |
| Los casos de la ejecución no se pueden leer (404, 403...) | `runCasesOnly: could not read the cases of the run <ULID> (<why>). Every test runs and is reported`                                         |
| Un archivo de prueba se ejecutó sin el archivo de setup   | `runCasesOnly needs the setup file: add setupFilesAfterEnv: [...] to the Jest config. Every test of a file without it runs and is reported` |
| El archivo de setup no pudo omitir pruebas en un archivo  | `runCasesOnly: the setup file could not skip the tests of a file that match no case of the run (<why>). ...`                                |
| Ninguna prueba coincide con ningún caso de la ejecución   | `No test matches the cases of the run <ULID>: every test was skipped, and none is reported`                                                 |

Los casos no se pueden leer, por ejemplo, cuando el token no puede leer esa ejecución:

```text
$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] runCasesOnly: could not read the cases of the run 01J9Z3K4M5N6P7Q8R9S0T1V2W3 (Probara answered 403 forbidden: <message from Probara>). Every test runs and is reported
[probara] Sending 3 results of 3 tests (3 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 3 results (1 new case, 0 unmatched) in R-1 (open): https://app.probara.net/projects/SHOP/runs/R-1
```

Una configuración sin el archivo de setup:

```text
$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] runCasesOnly needs the setup file: add setupFilesAfterEnv: ['@probara/jest-reporter/setup'] to the Jest config. Every test of a file without it runs and is reported (first seen in tests/cart.test.js; repeats are logged at debug)
[probara] Sending 2 results of 2 tests (2 passed, 0 failed, 0 skipped, 0 blocked)
[probara] Recorded 2 results (1 new case, 0 unmatched) in R-1 (open): https://app.probara.net/projects/SHOP/runs/R-1
```

Una ejecución cuyos casos no nombra ni encuentra ninguna prueba:

```text
$ PROBARA_RUN_CASES_ONLY=true PROBARA_RUN_ULID=01J9Z3K4M5N6P7Q8R9S0T1V2W3 npx jest
[probara] No test matches the cases of the run 01J9Z3K4M5N6P7Q8R9S0T1V2W3: every test was skipped, and none is reported
```

En ese caso no se envía nada, y la ejecución queda como estaba: comprueba que el ULID es el de la
ejecución que querías.

El archivo de setup no puede omitir pruebas en un archivo cuando el archivo se ejecuta con otro test
runner distinto de jest-circus (`testRunner: 'jest-jasmine2'`), o cuando su selección falló. Ese
archivo ejecuta y reporta todas sus pruebas, y la línea `Ran only` lo deja fuera de su recuento.

## Configuraciones

- **`injectGlobals: false`** funciona: el archivo de setup toma los hooks de Jest de `@jest/globals`.
- **`projects` de Jest**: pasa el archivo de setup a cada proyecto. Una prueba cuyo título contiene
  [`{displayName}`](https://docs.probara.net/es/developers/ci-integrations/jest/sharding/#displayname-en-un-título) se
  ejecuta en todos los proyectos (el archivo de setup no puede conocer el nombre del proyecto), y solo
  se reporta donde su nombre, con el del proyecto, pertenece a la ejecución; la línea `Ran only`
  cuenta las demás aparte, como `ran and not reported`.
- **Shards** (`--shard`): cada shard lee los casos de la ejecución y ejecuta su parte de las pruebas
  seleccionadas.
- **Modo watch**: los casos de la ejecución se vuelven a leer antes de cada repetición.
- **Una petición más**: leer los casos es una petición antes de que empiecen las pruebas, 200 casos
  por página ([red](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#red)). Es la única lectura que
  puede hacer un token de aplicación: el
  [endpoint de claves de casos de una ejecución](https://docs.probara.net/es/developers/api/run-cases/#listar-las-claves-de-casos-de-una-ejecución).

Relacionado: [Configuración](https://docs.probara.net/es/developers/ci-integrations/jest/configuration/#runcasesonly) ·
[Una ejecución existente](https://docs.probara.net/es/developers/ci-integrations/jest/results-and-retries/#una-ejecución-existente) ·
[Solución de problemas](https://docs.probara.net/es/developers/ci-integrations/jest/troubleshooting/#la-selección-ejecutó-todas-las-pruebas) ·
Fuente: [run-selection.md](https://github.com/cynch-me/probara-sdk/blob/main/packages/jest-reporter/docs/run-selection.md)
