Distinguer romans et BD par un type de document
Format disait physique ou numérique, jamais roman ou BD. Trois valeurs seulement : une valeur s'ajoute sans migration, la renommer une fois posée sur des centaines de fiches, non. Le défaut est « non précisé », pas « roman » : les fiches existantes n'ont pas été saisies avec cette question en tête, et un AddColumn suffit justement parce que la valeur par défaut ne prétend rien. L'interface n'affiche donc que ce qui a été choisi, comme pour le format. Filtre ajouté aux DEUX implémentations, serveur et hors-ligne, avec quatre jeux de critères de plus dans le test qui les confronte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -30,9 +30,14 @@ public class FiltreLivresLocalTests
|
||||
private static readonly Auteur Zola = Auteur(1, "Émile Zola");
|
||||
private static readonly Auteur Maupassant = Auteur(2, "Guy de Maupassant");
|
||||
|
||||
private static Livre Livre(int id, string titre, Auteur? auteur, Format format, Statut? statut)
|
||||
private static Livre Livre(
|
||||
int id, string titre, Auteur? auteur, Format format, Statut? statut,
|
||||
TypeDocument type = TypeDocument.NonPrecise)
|
||||
{
|
||||
var livre = new Livre { Id = id, Titre = titre, Format = format, AjoutePar = Lecteur };
|
||||
var livre = new Livre
|
||||
{
|
||||
Id = id, Titre = titre, Format = format, TypeDocument = type, AjoutePar = Lecteur,
|
||||
};
|
||||
livre.RecalculerFormes();
|
||||
|
||||
if (auteur is not null)
|
||||
@@ -50,9 +55,9 @@ public class FiltreLivresLocalTests
|
||||
|
||||
private static readonly Livre[] Entites =
|
||||
[
|
||||
Livre(1, "Germinal", Zola, Format.Physique, Statut.Lu),
|
||||
Livre(2, "La Bête humaine", Zola, Format.Numerique, Statut.ALire),
|
||||
Livre(3, "Le Horla", Maupassant, Format.Physique, Statut.EnCours),
|
||||
Livre(1, "Germinal", Zola, Format.Physique, Statut.Lu, TypeDocument.Roman),
|
||||
Livre(2, "La Bête humaine", Zola, Format.Numerique, Statut.ALire, TypeDocument.BandeDessinee),
|
||||
Livre(3, "Le Horla", Maupassant, Format.Physique, Statut.EnCours, TypeDocument.Roman),
|
||||
Livre(4, "Bel-Ami", Maupassant, Format.Numerique, null),
|
||||
Livre(5, "Œuvres complètes", Zola, Format.Physique, Statut.ALire),
|
||||
Livre(6, "L'Éducation sentimentale", null, Format.Physique, null),
|
||||
@@ -68,6 +73,7 @@ public class FiltreLivresLocalTests
|
||||
Id = l.Id,
|
||||
Titre = l.Titre,
|
||||
Format = l.Format,
|
||||
TypeDocument = l.TypeDocument,
|
||||
DateAjout = DateTime.UtcNow,
|
||||
Statut = l.Statuts.FirstOrDefault(s => s.Utilisateur == Lecteur)?.Statut,
|
||||
Auteurs = l.Auteurs
|
||||
@@ -89,12 +95,20 @@ public class FiltreLivresLocalTests
|
||||
new CritereLivres { Recherche = "introuvable" },
|
||||
new CritereLivres { Format = Format.Physique },
|
||||
new CritereLivres { Format = Format.Numerique },
|
||||
new CritereLivres { TypeDocument = TypeDocument.Roman },
|
||||
new CritereLivres { TypeDocument = TypeDocument.BandeDessinee },
|
||||
// « Non précisé » est une valeur filtrable, pas l'absence de filtre.
|
||||
new CritereLivres { TypeDocument = TypeDocument.NonPrecise },
|
||||
new CritereLivres { Statut = Statut.Lu },
|
||||
new CritereLivres { Statut = Statut.ALire },
|
||||
new CritereLivres { AuteurId = 1 },
|
||||
new CritereLivres { AuteurId = 2 },
|
||||
new CritereLivres { AuteurId = 99 },
|
||||
new CritereLivres { Recherche = "zola", Format = Format.Physique, Statut = Statut.ALire },
|
||||
new CritereLivres
|
||||
{
|
||||
Recherche = "zola", TypeDocument = TypeDocument.BandeDessinee, Format = Format.Numerique,
|
||||
},
|
||||
];
|
||||
|
||||
[Theory]
|
||||
|
||||
@@ -348,6 +348,48 @@ public class ServiceCatalogueTests : IDisposable
|
||||
Assert.Equal(["Guy de Maupassant"], relu.Auteurs.Select(a => a.Nom));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Un_livre_sans_type_precise_reste_non_precise()
|
||||
{
|
||||
var livre = (await _service.CreerAsync(Saisie("Germinal", "Émile Zola"), "mathieu")).Livre!;
|
||||
|
||||
// ⚠️ Le défaut n'est PAS « Roman » : on ne remplit pas une case à la place de
|
||||
// l'utilisateur, et l'interface n'affiche que ce qui a été choisi.
|
||||
Assert.Equal(TypeDocument.NonPrecise, livre.TypeDocument);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Le_type_de_document_est_enregistre_puis_modifiable()
|
||||
{
|
||||
var saisie = Saisie("Les fourmis", "Bernard Werber");
|
||||
saisie.TypeDocument = TypeDocument.BandeDessinee;
|
||||
|
||||
var cree = (await _service.CreerAsync(saisie, "mathieu")).Livre!;
|
||||
Assert.Equal(TypeDocument.BandeDessinee, cree.TypeDocument);
|
||||
|
||||
saisie.TypeDocument = TypeDocument.Roman;
|
||||
var modifie = (await _service.ModifierAsync(cree.Id, saisie, "mathieu")).Livre!;
|
||||
|
||||
Assert.Equal(TypeDocument.Roman, modifie.TypeDocument);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Le_catalogue_se_filtre_par_type_de_document()
|
||||
{
|
||||
var bd = Saisie("Les fourmis", "Bernard Werber");
|
||||
bd.TypeDocument = TypeDocument.BandeDessinee;
|
||||
await _service.CreerAsync(bd, "mathieu");
|
||||
await _service.CreerAsync(Saisie("Germinal", "Émile Zola"), "mathieu");
|
||||
|
||||
var bds = await _service.ListerAsync(
|
||||
new CritereLivres { TypeDocument = TypeDocument.BandeDessinee }, "mathieu");
|
||||
var nonPrecises = await _service.ListerAsync(
|
||||
new CritereLivres { TypeDocument = TypeDocument.NonPrecise }, "mathieu");
|
||||
|
||||
Assert.Equal(["Les fourmis"], bds.Select(l => l.Titre));
|
||||
Assert.Equal(["Germinal"], nonPrecises.Select(l => l.Titre));
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
// Doublons : un AVERTISSEMENT, jamais un refus. Posséder deux exemplaires est légitime —
|
||||
// on garde le sien et on prête l'autre — et l'ISBN est facultatif, donc il ne peut pas
|
||||
|
||||
Reference in New Issue
Block a user