test(desktop): failure parity for the write commands, and the three defects it found - #204
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Seconde moitié du lot v3.11.0 « audit de dérive des routes dev-server », après #203 qui en a livré le registre. Avec elle, le lot est complet.
Pourquoi
pnpm dev:weblancedev-server.mjs, pas le backend Rust. Les deux s'accordent sur les chemins heureux — ce sont les chemins d'échec qui avaient déjà divergé sans que rien ne le voie :read_filerefusait le non-UTF-8 côté Rust et substituaitU+FFFDcôté Node.Ce que fait cette PR
Un bras de probe générique. Seules 5 des 35 commandes d'écriture étaient joignables depuis le harnais ; les 30 autres auraient demandé chacune un wrapper
*_parityet un bras. Un uniquecommand-parity, prenant{ command, args }en JSON sur stdin et dispatchant parmatch, remplace trente paires par trente branches courtes.31 tests de parité sur les chemins d'échec, couvrant 27 commandes d'écriture. Chacun asserte que les deux backends refusent et laissent le même dépôt derrière : s'accorder sur « non » en laissant des arbres de travail différents n'est pas de la parité, puisque c'est l'état que l'utilisateur manipule ensuite. La suite passe de 81 à 112 tests sans ralentir (~21 s).
Trois défauts trouvés, tous corrigés
/api/git-submodule-update-onelançaitgit submodule updateet jetait le code de sortie, répondant{}quoi qu'il arrive, pendant que le Rust propageait l'erreur./api/git-commit-template-pathn'existait pas.backend.tsl'appelait, donc la recherche de template de commit retournait silencieusementnullen mode web./api/git-config-identityn'existait pas non plus. Même cause, conséquence différente : le wrapper levait une exception.Les deux routes écrites reprennent les arbitrages du Rust plutôt que de les approcher : un
commit.templatenon configuré n'est pas une erreur, unuser.nameouuser.emailvide en est une, et l'expansion du~initial est reproduite. Quatre tests de parité les épinglent.Hors couverture, et pourquoi
git_fetchprend untauri::ipc::Channel<CloneProgress>: aucun processus sans runtime Tauri ne peut l'appeler. La couvrir demande de scinder le travail git du rapport de progression — un refactor, pas un test.workspace_fetch_all/workspace_pull_allrenvoient unVec<WorkspaceRepoStatus>sansResult: pas de refus à comparer, la parité y aurait une autre forme.snapshot_createrépondOk(None)au lieu d'échouer, même sur un répertoire qui n'est pas un dépôt : pas de refus atteignable. Le cas a été retiré avec sa raison plutôt que remplacé par une fixture qui aurait testé la fixture.git_autocomplete,git_conflict_check,set_git_config, les deuxscratch_worktree_*, les quatremcp_*) : pas de route, aucun obstacle à en avoir une. Contrairement aux deux 404 corrigés ici, ce ne sont pas des défauts actifs — ces commandes sont simplement indisponibles sousdev:web, ce qui se voit dès qu'on les utilise.Un garde-fou ajouté en cours de route
Le dispatcher répond
command-parity does not know 'X'pour un bras manquant, ce qui ressemble exactement à un refus. Avec un binaire de probe périmé, tous les tests de ce fichier passent alors au vert pour la mauvaise raison — c'est arrivé une fois pendant l'implémentation et a produit deux fausses « divergences ». Le helper lève désormais une erreur explicite qui dit de reconstruire.Le fichier documente aussi deux pièges de fixture qui ont chacun coûté un aller-retour :
git stashsur un arbre propre sort 0 (« No local changes to save »), donc ce n'est pas un refus ; et « dépôt sans identité » ne s'obtient pas en s'abstenant de configurer, puisque les deux backends héritent de la config git globale de la machine.Tests
Parité 112 / 25 fichiers, desktop 1412 / 164, Rust 404,
cargo fmt --checkpropre,vue-tsc --noEmitpropre,pnpm buildOK.