Signaler les envies déjà entrées au catalogue, sans les supprimer

La demande initiale était de retirer l'envie ; c'est refusé. Le catalogue
est commun et la liste d'envies personnelle : supprimer modifierait la
liste d'un autre en silence, avec sa note. Et le rapprochement par clé
d'œuvre est faillible, alors qu'une suppression ne se rattrape pas.

L'étiquette « Déjà au catalogue » mène à la fiche, pour vérifier avant de
retirer. Le critère est celui des doublons, la convention d'auteur commun
étant désormais partagée par les deux (RapprochementAuteurs).

Au passage : accolade manquante sur .etiquette-souhaite, qui avalait la
règle suivante — le bandeau de mise à jour perdait son style.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-19 21:30:55 +02:00
co-authored by Claude Opus 5
parent 383ed43227
commit a49125ddc3
9 changed files with 301 additions and 42 deletions
+95
View File
@@ -52,6 +52,101 @@ public class ServiceSouhaitsTests : IDisposable
new EnregistrementSouhait { Titre = titre, Auteur = auteur, Isbn = isbn, Note = note },
utilisateur);
// ── « Déjà au catalogue » : on signale, on ne supprime jamais ────────────
//
// Le catalogue est COMMUN, la liste d'envies PERSONNELLE : c'est ce croisement de portées
// que ces tests protègent. Retirer l'envie d'un autre, comme le demandait la version
// initiale de l'idée, modifierait sa liste en silence.
[Fact]
public async Task Une_envie_deja_au_catalogue_est_signalee_avec_sa_fiche()
{
var livre = (await _catalogue.CreerAsync(
new EnregistrementLivre { Titre = "Les fourmis", Auteur = "Bernard Werber" }, Mathieu)).Livre!;
// Sous-titre et ordre du nom différents : ce que la clé d'œuvre et le rapprochement
// d'auteurs doivent absorber.
await AjouterAsync("Les fourmis : roman", "Werber, Bernard");
var souhait = (await _souhaits.ListerAsync(Mathieu)).Single();
Assert.True(souhait.Possede);
Assert.Equal(livre.Id, souhait.LivreId);
}
[Fact]
public async Task Une_envie_signalee_reste_dans_la_liste_avec_sa_note()
{
await AjouterAsync("Les fourmis", note: "demandé à Noël");
await _catalogue.CreerAsync(
new EnregistrementLivre { Titre = "Les fourmis", Auteur = "Bernard Werber" }, Camille);
var souhait = (await _souhaits.ListerAsync(Mathieu)).Single();
// L'ajout au catalogue par QUELQU'UN D'AUTRE ne touche pas à la liste de Mathieu.
Assert.True(souhait.Possede);
Assert.Equal("demandé à Noël", souhait.Note);
}
[Fact]
public async Task Un_titre_identique_dun_autre_auteur_nest_pas_signale()
{
await _catalogue.CreerAsync(
new EnregistrementLivre { Titre = "Nouvelles", Auteur = "Guy de Maupassant" }, Mathieu);
await AjouterAsync("Nouvelles", "Anton Tchekhov");
Assert.False((await _souhaits.ListerAsync(Mathieu)).Single().Possede);
}
[Fact]
public async Task Le_meme_isbn_suffit_a_signaler_malgre_un_titre_different()
{
// L'ISBN désigne une édition précise : il tranche seul, et rattrape un titre saisi
// autrement qu'à la source.
var livre = (await _catalogue.CreerAsync(
new EnregistrementLivre
{
Titre = "Le Horla et autres contes",
Auteur = "Guy de Maupassant",
Isbn = "9782080704092",
},
Mathieu)).Livre!;
await AjouterAsync("Le Horla", "Maupassant", isbn: "9782080704092");
var souhait = (await _souhaits.ListerAsync(Mathieu)).Single();
Assert.Equal(livre.Id, souhait.LivreId);
}
[Fact]
public async Task Une_envie_sans_equivalent_nest_pas_signalee()
{
await _catalogue.CreerAsync(
new EnregistrementLivre { Titre = "Les fourmis", Auteur = "Bernard Werber" }, Mathieu);
await AjouterAsync("La prophétie des abeilles");
var souhait = (await _souhaits.ListerAsync(Mathieu)).Single();
Assert.False(souhait.Possede);
Assert.Null(souhait.LivreId);
}
[Fact]
public async Task Le_signalement_apparait_des_lajout_de_lenvie()
{
await _catalogue.CreerAsync(
new EnregistrementLivre { Titre = "Les fourmis", Auteur = "Bernard Werber" }, Mathieu);
var ajout = await AjouterAsync("Les fourmis");
// Sinon l'écran d'ajout renverrait une fiche muette, et il faudrait recharger la liste
// pour apprendre qu'on possède déjà le livre.
Assert.True(ajout.Souhait!.Possede);
}
// ── Ordre choisi à la main ───────────────────────────────────────────────
private async Task<IReadOnlyList<string>> TitresAsync(string utilisateur = Mathieu) =>