- Cataloguer en rafale — nouvel écran /ajout/rafale : on scanne une pile de livres à la suite dans une zone de texte, chaque code est traité (BnF puis OpenLibrary), les doublons connus sont passés automatiquement. La collecte marche même hors-ligne. Le compte rendu liste maintenant les livres créés, en lien vers leur fiche, et reste consultable en revenant sur l'écran même après une rafale entièrement réussie. Le catalogue reconnaît un ISBN dans sa barre de recherche (13 ou 10 chiffres, avec ou sans tirets) : scanner un livre en main ouvre directement sa fiche s'il n'y en a qu'un. Un bouton « Scanner » l'alimente, actif hors-ligne. - Ajouter un tome à une série accepte aussi un ISBN dans le champ manuel : le catalogue est cherché d'abord (rattachement direct si un seul exemplaire), sinon la BnF prend le relais. Séries et sagas - Numéro de tome distinct de la position de lecture : on peut indiquer « c'est le tome 7 » même si on ne possède pas les six premiers ; l'ordre de lecture reste un réglage séparé (utile pour les préquelles). - Tri par numéro en plus du tri par ordre de lecture quand des tomes en portent un. - Panneau « Ajouter » regroupé et repliable sur la fiche d'une série (manuellement / en rafale / depuis le catalogue / depuis les envies), au lieu de quatre formulaires ouverts en permanence. - Filtre catalogue « sans couverture » pour repérer les livres à illustrer. Le catalogue groupe les tomes d'une même série sous un bloc repliable, avec un décompte plus clair (affichés / possédés / total). - Corrections directes sur la fiche - Effacer un prêt saisi par erreur (bouton ✕ sur chaque ligne, avec confirmation), sans passer par « rendre ». - Corriger une couverture manquante ou cassée en cliquant dessus : le champ d'adresse s'ouvre focalisé, Entrée enregistre. Étendu aux numéros de revue dans la dernière modification. - Les thèmes déjà utilisés dans la bibliothèque sont proposés à la frappe. - La recherche d'un livre à rattacher montre des suggestions dès le focus, sans attendre de taper. - Visuel : un rendu manquant après une écriture asynchrone dans le formulaire de livre, une bascule de rôle cassée, des débordements à 320 px, et le style d'un bouton-lien qui restait souligné.
71 lines
2.4 KiB
C#
71 lines
2.4 KiB
C#
using MaBibli.Shared.Isbn;
|
|
|
|
namespace MaBibli.Tests;
|
|
|
|
/// <summary>
|
|
/// Reconnaissance d'un code dans le champ de recherche du catalogue.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// L'enjeu n'est pas de trouver un ISBN — c'est de <b>ne pas</b> en voir un là où il n'y en a
|
|
/// pas : « 1984 » est un titre, et le confondre avec un fragment de code remplacerait une
|
|
/// réponse par du bruit.
|
|
/// </remarks>
|
|
public class RechercheIsbnTests
|
|
{
|
|
[Theory]
|
|
[InlineData("Germinal")]
|
|
[InlineData("Zola 1984")]
|
|
[InlineData("1984")]
|
|
[InlineData("2026")]
|
|
[InlineData("1234567")] // sept chiffres : sous le seuil
|
|
[InlineData("")]
|
|
[InlineData(" ")]
|
|
[InlineData(null)]
|
|
public void Ce_qui_n_est_pas_un_code_reste_une_recherche_de_mots(string? terme)
|
|
=> Assert.Null(RechercheIsbn.Formes(terme));
|
|
|
|
[Fact]
|
|
public void Un_ean13_est_cherche_sous_ses_deux_formes()
|
|
{
|
|
// ⚠️ Le cœur de la fonctionnalité : la douchette lit toujours un 13, alors qu'un livre
|
|
// paru avant 2007 est rangé sous son 10.
|
|
var formes = RechercheIsbn.Formes("9782253004226");
|
|
|
|
Assert.NotNull(formes);
|
|
Assert.Equal(["9782253004226", "2253004227"], formes);
|
|
}
|
|
|
|
[Fact]
|
|
public void Les_tirets_de_l_affichage_se_recollent()
|
|
=> Assert.Equal(
|
|
RechercheIsbn.Formes("9782253004226"),
|
|
RechercheIsbn.Formes("978-2-25-300422-6"));
|
|
|
|
[Fact]
|
|
public void Un_fragment_assez_long_reste_un_code_mais_sans_seconde_forme()
|
|
{
|
|
// La conversion 13 → 10 n'a pas de sens sur un fragment : elle exige un ISBN complet.
|
|
var formes = RechercheIsbn.Formes("97822530");
|
|
|
|
Assert.Equal(["97822530"], formes);
|
|
}
|
|
|
|
[Fact]
|
|
public void Un_isbn_10_terminant_par_X_est_reconnu()
|
|
{
|
|
var formes = RechercheIsbn.Formes("2-266-11156-X");
|
|
|
|
Assert.Equal(["226611156X"], formes);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("9782253004226", true)]
|
|
[InlineData("978-2-25-300422-6", true)]
|
|
[InlineData("2253004227", true)]
|
|
[InlineData("9782253004227", false)] // clé fausse : ce n'est pas une édition, c'est une faute
|
|
[InlineData("97822530", false)] // fragment : le résultat unique serait un hasard
|
|
[InlineData("Germinal", false)]
|
|
public void Seul_un_code_complet_et_valide_autorise_l_ouverture_directe(string terme, bool attendu)
|
|
=> Assert.Equal(attendu, RechercheIsbn.EstCodeComplet(terme));
|
|
}
|