Files
ng-eventually/examples/notebook/index.html
Sylvain Duchesne aa6bbc436e test(e2e): les parcours applicatifs passent par l'app d'exemple
Une seconde suite e2e, `packages/sdk/e2e/notebook.ts` (`test:e2e:app`), qui pilote
`examples/notebook` par le DOM — une page de navigateur par identité — contre le même
broker réel.

**Pourquoi une seconde suite plutôt qu'un ajout dans la première.** `run.ts` parle à un
sac de méthodes sur `window.__sdk` : cela prouve que les fonctions TOURNENT, jamais
qu'une application peut s'écrire avec. L'écart a déjà coûté un défaut livré — l'inbox
d'un document était verte ici et inutilisable en pratique, parce que le harnais pouvait
faire traverser une adresse d'une identité à l'autre par une variable, canal qu'aucune
application n'a. Ici, rien ne traverse que ce qui traverse dans la vie : la RÉFÉRENCE
d'une note, recopiée d'un écran, et un identifiant tapé dans un champ.

Quatre parcours, qui se lisent comme des parcours :

- Bob lit la note publique d'Alice depuis sa seule référence — la propriété pour
  laquelle l'émulation du store public existe, vérifiée bout en bout et sans qu'aucune
  clé ne circule ;
- la note protégée d'Alice reste fermée jusqu'à ce qu'elle la partage — même geste côté
  Bob, issue opposée, décidée par où la note se trouve ;
- Bob laisse un message sur la note d'Alice, et seule Alice le lit — il TROUVE l'adresse
  depuis la note, personne ne la lui donne ;
- la liste de chacun ne contient que ses notes.

**Deux étapes quittent `run.ts`** (`documentInboxDeposit`, `capsShareCap`), avec un
commentaire disant où elles sont parties : ce sont des parcours, et ils valent plus joués
sur deux écrans que sur deux appels d'une même page. Ce qui reste là-bas est ce qu'une
application ne fait pas : primitives, caractérisation, régressions de démarrage à froid.

**Trois défauts trouvés en écrivant la suite**, tous côté application et invisibles pour
le harnais : `connectedUser()` devait être attendu à la connexion (sinon une note qu'on
vient de vous partager se lit comme illisible — ce qui ressemble à un problème de droits
alors que c'est un problème de moment) ; une réponse périmée restait affichée à côté
d'une question fraîche ; et changer de portée ne rafraîchissait pas la liste. L'app
affiche désormais la référence de chaque note — ce qu'aucun écran ne montre, aucun
utilisateur ne peut le faire circuler.

Corrigé au passage : le `.gitignore` pointait encore `packages/client/`, si bien que le
commit de renommage a embarqué le profil Playwright de la suite e2e (226 fichiers). Les
chemins sont réalignés et le commit précédent a été amendé — rien n'était poussé.

179 tests unitaires, e2e 40/40 (3,2 min) et applicatif 10/10 (0,7 min).
2026-08-07 11:20:58 +02:00

60 lines
2.5 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<title>Notebook — exemple ng-eventually</title>
<style>
body { font: 15px/1.5 system-ui, sans-serif; max-width: 640px; margin: 24px auto; padding: 0 16px; color: #222; }
fieldset { border: 1px solid #ddd; border-radius: 8px; margin: 0 0 16px; }
legend { padding: 0 6px; color: #666; font-size: 13px; }
input, select, button { font: inherit; padding: 6px 8px; }
input { border: 1px solid #bbb; border-radius: 5px; }
button { cursor: pointer; border: 1px solid #bbb; border-radius: 5px; background: #f6f6f6; }
ul { list-style: none; padding: 0; }
li { padding: 6px 0; border-bottom: 1px solid #eee; }
code.ref { font-size: 11px; color: #888; user-select: all; }
.out { color: #555; font-size: 13px; min-height: 1.2em; }
</style>
</head>
<body>
<p>Connecté : <b id="who" data-testid="who"></b></p>
<fieldset>
<legend>Écrire une note</legend>
<input id="title" data-testid="title" placeholder="titre" />
<input id="body" data-testid="body" placeholder="contenu" />
<select id="scope" data-testid="scope">
<option value="protected">protégée</option>
<option value="public">publique</option>
<option value="private">privée</option>
</select>
<button id="write" data-testid="write">écrire</button>
</fieldset>
<fieldset>
<legend>Mes notes</legend>
<input id="shareWith" data-testid="share-with" placeholder="partager avec (identifiant)" />
<ul id="notes" data-testid="notes"></ul>
<p class="out" id="shareResult" data-testid="share-result"></p>
<p class="out" id="messages" data-testid="messages"></p>
</fieldset>
<fieldset>
<legend>Ouvrir une note reçue</legend>
<input id="reference" data-testid="reference" placeholder="référence de la note" size="46" />
<button id="openRef" data-testid="open-reference">ouvrir</button>
<p class="out" id="shared" data-testid="shared"></p>
</fieldset>
<fieldset>
<legend>Laisser un message sur la note d'un autre</legend>
<input id="onNote" data-testid="on-note" placeholder="note visée" size="46" />
<input id="message" data-testid="message" placeholder="message" />
<button id="leave" data-testid="leave">déposer</button>
<p class="out" id="left" data-testid="left"></p>
</fieldset>
<script type="module" src="/app.js"></script>
</body>
</html>