Files
mabibli/MaBibli.Tests/NettoyageIsbdTests.cs
T
mathieuandClaude Opus 5 f8f30dbcf7 Phase 2 : service de lookup ISBN en cascade BnF puis OpenLibrary
Recuperation des metadonnees d'un livre a partir de son ISBN, cote serveur
uniquement (aucune interface, aucune persistance).

Cascade : BnF en ISBN-13, puis BnF en ISBN-10 converti, puis OpenLibrary.
La conversion 13 -> 10 est indispensable et non optionnelle : la BnF indexe
l'ISBN tel qu'imprime, les ouvrages d'avant 2007 ne portent qu'un ISBN-10 et
sont introuvables par l'EAN-13 que lit le scanner.

Toutes les notices trouvees sont remontees (jusqu'a 5) : un meme ISBN peut
correspondre a plusieurs reeditions, le choix revient a l'utilisateur.

Le double appel /isbn puis /authors d'OpenLibrary est bien fait, avec repli
sur l'oeuvre quand l'edition ne porte aucun auteur : c'est le bug de BookLogr
(titre rempli, auteur vide) qu'il ne faut pas reproduire.

La couverture vient toujours d'OpenLibrary, avec ?default=false pour obtenir
un 404 plutot qu'une image placeholder.

87 tests xUnit, sur fixtures enregistrees : aucune dependance au reseau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 22:22:47 +02:00

75 lines
3.4 KiB
C#

using MaBibli.Api.Services.Isbn;
namespace MaBibli.Tests;
public class NettoyageIsbdTests
{
[Theory]
[InlineData("Germinal / Émile Zola ; préface d'Armand Lanoux", "Germinal")]
[InlineData("Germinal / Émile Zola ; préf., dossier et notes par Colette Becker", "Germinal")]
[InlineData("Le Horla / Guy de Maupassant", "Le Horla")]
public void Titre_coupe_a_la_mention_de_responsabilite(string brut, string attendu)
=> Assert.Equal(attendu, NettoyageIsbd.Titre(brut));
[Theory]
[InlineData("Germinal", "Germinal")]
[InlineData("Le Petit Prince", "Le Petit Prince")]
[InlineData("Introduction to Algorithms", "Introduction to Algorithms")]
// Le sous-titre ISBD (« : ») n'est pas de la ponctuation à retirer : on le garde.
[InlineData("Voyage au bout de la nuit : roman", "Voyage au bout de la nuit : roman")]
// Un « / » sans espaces autour appartient au titre, il ne doit pas servir de coupure.
[InlineData("Entrée/sortie", "Entrée/sortie")]
public void Titre_laisse_passer_ce_qui_est_deja_propre(string brut, string attendu)
=> Assert.Equal(attendu, NettoyageIsbd.Titre(brut));
[Theory]
[InlineData("Zola, Émile (1840-1902). Auteur du texte", "Émile Zola")]
[InlineData("Saint-Exupéry, Antoine de (1900-1944). Auteur du texte", "Antoine de Saint-Exupéry")]
[InlineData("Maupassant, Guy de (1850-1893). Auteur du texte", "Guy de Maupassant")]
[InlineData("Becker, Colette (1932-....). Éditeur scientifique", "Colette Becker")]
[InlineData("Zola, Émile (1840-1902)", "Émile Zola")]
[InlineData("Zola, Émile. Auteur du texte", "Émile Zola")]
public void Auteur_retire_dates_et_role_puis_inverse(string brut, string attendu)
=> Assert.Equal(attendu, NettoyageIsbd.Auteur(brut));
[Theory]
[InlineData("Émile Zola", "Émile Zola")]
[InlineData("Antoine de Saint-Exupéry", "Antoine de Saint-Exupéry")]
[InlineData("Molière", "Molière")]
public void Auteur_laisse_passer_ce_qui_est_deja_propre(string brut, string attendu)
=> Assert.Equal(attendu, NettoyageIsbd.Auteur(brut));
[Fact]
public void Auteur_ne_coupe_pas_sur_une_initiale()
{
// « H. » est une initiale, pas un séparateur de rôle : la couper amputerait le prénom.
Assert.Equal("Thomas H. Cormen", NettoyageIsbd.Auteur("Cormen, Thomas H."));
}
[Theory]
[InlineData("le Livre de poche (Paris)", "le Livre de poche")]
[InlineData("Librairie générale française (Paris)", "Librairie générale française")]
[InlineData("Gallimard (Paris)", "Gallimard")]
public void Editeur_retire_la_ville_finale(string brut, string attendu)
=> Assert.Equal(attendu, NettoyageIsbd.Editeur(brut));
[Theory]
[InlineData("Gallimard", "Gallimard")]
[InlineData("The MIT Press", "The MIT Press")]
// Parenthèses en milieu de chaîne : ce n'est pas la ville, on n'y touche pas.
[InlineData("Presses (universitaires) de France", "Presses (universitaires) de France")]
public void Editeur_laisse_passer_ce_qui_est_deja_propre(string brut, string attendu)
=> Assert.Equal(attendu, NettoyageIsbd.Editeur(brut));
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Champs_vides_donnent_null(string? brut)
{
Assert.Null(NettoyageIsbd.Titre(brut));
Assert.Null(NettoyageIsbd.Auteur(brut));
Assert.Null(NettoyageIsbd.Editeur(brut));
}
}