# Tests

> Ce que couvre la suite du dépôt, comment la lancer, et comment tester votre propre code autour de colis sans identifiants ni réseau.

Canonical: https://colis-docs.vercel.app/docs/tests · Markdown: https://colis-docs.vercel.app/docs/tests.md

## Lancer la suite

```sh
bun run test                              # turbo test sur tout l’espace de travail
bun run --filter @colis/core test         # un seul paquet
bun run --filter colis-drop test          # la page de livraison
```

Chaque paquet utilise [Vitest](https://vitest.dev), lancé sur Node. La CI exécute la suite sur
Node 20, 22 et 24, après le formatage, le lint, la vérification des types et le build.

La suite est hors ligne : elle tourne contre un S3 en mémoire qui respecte les en-têtes
conditionnels, donc ni identifiants ni réseau.

## Ce qu’elle couvre

| Emplacement                     | Couvre                                                                                                                                                             |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `packages/core/test`            | L’API fichiers, les envois en morceaux, les enregistrements JSON, les clés, la configuration, le gestionnaire de routes, et le client du protocole branché dessus. |
| `packages/protocol/test`        | Le client, les codes, la signature et la vérification des webhooks.                                                                                                |
| `packages/react/test`           | Les hooks d’envoi et de retrait, le champ de code.                                                                                                                 |
| `packages/cli/test`             | Le fichier de configuration, `init`, `verifier`, `statut`, le format des durées et des tailles.                                                                    |
| `packages/n8n-nodes-colis/test` | La vérification de signature, le filtre d’événements, les deux nœuds contre un faux contexte n8n.                                                                  |
| `templates/drop/test`           | La configuration, l’accusé de réception, les webhooks, les envois en morceaux.                                                                                     |

## Tester votre code

**Contre le gestionnaire, sans socket.** Le client du protocole accepte un `fetch` à vous : branchez-le
directement sur `createTransferHandler()`. C’est exactement ce que fait la CLI sans `--remote`.

```ts
import { createBucket, createTransferHandler } from '@colis/core'
import { createTransferClient } from '@colis/protocol'

const handler = createTransferHandler({ bucket: createBucket({ bucket: 'test', client: fakeS3Client }) })

const transfers = createTransferClient({
  baseUrl: 'http://drop.test/api/transfers',
  fetch: (input, init) => handler(new Request(input as string, init as RequestInit)),
})
```

`fakeS3Client` est n’importe quel objet avec une méthode `send(command)` : `createBucket({ client })`
l’utilise tel quel. `packages/core/test/helpers.ts` en contient un en mémoire, qui garde les objets
et respecte `If-Match` et `If-None-Match`.

**Les hooks React, sans réseau.** Passez un client à vous au fournisseur :
`<ColisProvider client={fakeClient}>`.

**Un récepteur de webhooks.** `webhookHeaders(secret, { id, body })` de `@colis/protocol` produit les
en-têtes qu’enverrait la page de livraison : construisez une `Request` avec, et passez-la à votre
route. `verifyWebhook(…, { now })` fixe l’horloge pour tester le refus d’un horodatage trop ancien.

**Les URL signées.** La signature est un calcul local : avec des clés statiques et aucune connexion,
`getUrl()` produit une vraie URL dont on peut lire `X-Amz-Expires` et `X-Amz-Signature`.

## Contre un vrai bucket

Un double en mémoire ne voit pas ce que seul le vrai protocole fait : les en-têtes de somme de
contrôle, l’adressage par chemin, et si votre fournisseur respecte `If-None-Match` sur l’assemblage
d’un envoi en morceaux. Lancez MinIO (voir [Stockages](https://colis-docs.vercel.app/docs/stockages#minio)), pointez la page de
livraison dessus comme dans le [démarrage rapide](https://colis-docs.vercel.app/docs/demarrage-rapide), et vérifiez avec
`colis verifier`.
