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>
85 lines
3.5 KiB
C#
85 lines
3.5 KiB
C#
using MaBibli.Api.Services.Isbn;
|
|
using MaBibli.Shared.Dtos;
|
|
|
|
namespace MaBibli.Tests;
|
|
|
|
/// <summary>
|
|
/// Parsing de réponses SRU réelles de la BnF (schéma <c>dublincore</c>).
|
|
/// </summary>
|
|
public class BnfSruParserTests
|
|
{
|
|
[Theory]
|
|
// Le piège bloquant, mesuré : ces trois ISBN-13 donnent 0 notice, leur ISBN-10 en donne.
|
|
[InlineData("bnf-9782070612758.xml", 1)] // Le Petit Prince (2007) : trouvé en ISBN-13
|
|
[InlineData("bnf-9782253004226.xml", 0)] // Germinal en ISBN-13 : rien
|
|
[InlineData("bnf-2253004227.xml", 3)] // Germinal en ISBN-10 : 3 rééditions
|
|
[InlineData("bnf-9782080704092.xml", 0)] // Le Horla en ISBN-13 : rien
|
|
[InlineData("bnf-2080704095.xml", 1)] // Le Horla en ISBN-10 : 1 notice
|
|
[InlineData("bnf-9780262033848.xml", 0)] // Livre étranger : absent du dépôt légal français
|
|
[InlineData("bnf-0262033844.xml", 0)] // …sous les deux formes d'ISBN
|
|
public void NombreDeNotices_correspond_aux_mesures(string fixture, int attendu)
|
|
=> Assert.Equal(attendu, BnfSruParser.LireNombreDeNotices(Fixture.Lire(fixture)));
|
|
|
|
[Fact]
|
|
public void Petit_Prince_est_parse_et_nettoye()
|
|
{
|
|
var candidats = BnfSruParser.Parser(
|
|
Fixture.Lire("bnf-9782070612758.xml"), "9782070612758", "https://couverture");
|
|
|
|
var c = Assert.Single(candidats);
|
|
Assert.Equal("Le petit prince", c.Titre);
|
|
Assert.Equal("Antoine de Saint-Exupéry", c.Auteur);
|
|
Assert.Equal("Gallimard", c.Editeur);
|
|
Assert.Equal("2007", c.Annee);
|
|
Assert.Equal("fre", c.Langue);
|
|
Assert.Equal(SourceMetadonnees.Bnf, c.Source);
|
|
Assert.Equal("9782070612758", c.IsbnInterroge);
|
|
Assert.Equal("https://couverture", c.CoverUrl);
|
|
Assert.StartsWith("ark:/12148/", c.IdentifiantSource);
|
|
}
|
|
|
|
[Fact]
|
|
public void Germinal_renvoie_les_trois_reeditions_distinctes()
|
|
{
|
|
// Décision actée : on ne choisit pas à la place de l'utilisateur, on remonte tout.
|
|
var candidats = BnfSruParser.Parser(
|
|
Fixture.Lire("bnf-2253004227.xml"), "2253004227", null);
|
|
|
|
Assert.Equal(3, candidats.Count);
|
|
Assert.All(candidats, c => Assert.Equal("Germinal", c.Titre));
|
|
Assert.All(candidats, c => Assert.Equal("Émile Zola", c.Auteur));
|
|
|
|
Assert.Equal(
|
|
["le Livre de poche", "Librairie générale française", "Librairie générale française"],
|
|
candidats.Select(c => c.Editeur));
|
|
|
|
Assert.Equal(["1979", "2000", "1983"], candidats.Select(c => c.Annee));
|
|
|
|
// Les notices doivent rester discernables : sans ark distinct l'utilisateur ne peut pas trancher.
|
|
Assert.Equal(3, candidats.Select(c => c.IdentifiantSource).Distinct().Count());
|
|
}
|
|
|
|
[Fact]
|
|
public void Le_Horla_est_parse_depuis_lisbn10()
|
|
{
|
|
var candidats = BnfSruParser.Parser(
|
|
Fixture.Lire("bnf-2080704095.xml"), "2080704095", null);
|
|
|
|
var c = Assert.Single(candidats);
|
|
// La BnF écrit « Le horla » : le nettoyage ne doit pas « corriger » la casse de la source.
|
|
Assert.Equal("Le horla", c.Titre);
|
|
Assert.Equal("Guy de Maupassant", c.Auteur);
|
|
Assert.Equal("2080704095", c.IsbnInterroge);
|
|
Assert.DoesNotContain("(", c.Editeur ?? string.Empty);
|
|
}
|
|
|
|
[Fact]
|
|
public void Reponse_sans_notice_donne_une_liste_vide_et_pas_une_exception()
|
|
{
|
|
var candidats = BnfSruParser.Parser(
|
|
Fixture.Lire("bnf-9780262033848.xml"), "9780262033848", null);
|
|
|
|
Assert.Empty(candidats);
|
|
}
|
|
}
|