aa6bbc436e
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).
60 lines
2.5 KiB
HTML
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>
|