using Omika.Core.Services; namespace Omika.Tests.Services; /// /// Tests de la règle métier unique de composition de la mention d'annulation : /// le mot « Note », le nom du collaborateur entre parenthèses, puis son message /// (Note (DUPONT Jean) : Client absent). Cette règle est partagée par le /// serveur (repositories Batik/Omika) et l'application mobile (copie locale /// offline-first), qui doivent écrire exactement le même texte. /// public class AnnulationRendezVousDescriptionTests { [Fact] public void ComposerNote_MessageEtNom_InscritNoteNomPuisMessage() { string? note = AnnulationRendezVousDescription.ComposerNote("Client absent", "Jean DUPONT"); Assert.Equal("Note (Jean DUPONT) : Client absent", note); } [Fact] public void ComposerNote_NomInconnu_InscritNoteEtMessageSansParentheses() { // Aucun nom connu : aucune parenthèse vide ne doit apparaître. Assert.Equal("Note : Client absent", AnnulationRendezVousDescription.ComposerNote("Client absent", null)); Assert.Equal("Note : Client absent", AnnulationRendezVousDescription.ComposerNote("Client absent", " ")); } [Fact] public void ComposerNote_SansMessage_NeComposeRien() { // Sans message du collaborateur, RIEN n'est inscrit dans la description : // la mention trace une note, pas l'annulation elle-même (le statut, le // motif et l'origine portent déjà l'information). Le nom seul n'est jamais // inscrit. Assert.Null(AnnulationRendezVousDescription.ComposerNote(null, "Jean DUPONT")); Assert.Null(AnnulationRendezVousDescription.ComposerNote(" ", "Jean DUPONT")); } [Fact] public void ComposerNote_AucuneInformation_RetourneNull() { Assert.Null(AnnulationRendezVousDescription.ComposerNote(null, null)); Assert.Null(AnnulationRendezVousDescription.ComposerNote(" ", " ")); } [Fact] public void ComposerNote_NettoieLesEspaces() { Assert.Equal( "Note (Jean DUPONT) : Client absent", AnnulationRendezVousDescription.ComposerNote(" Client absent ", " Jean DUPONT ")); } [Fact] public void Concatener_DescriptionExistante_AjouteLaMentionSurUneNouvelleLigne() { string? resultat = AnnulationRendezVousDescription.Concatener( "Description initiale", "Client absent", "Jean DUPONT"); Assert.Equal( "Description initiale" + Environment.NewLine + "Note (Jean DUPONT) : Client absent", resultat); } [Fact] public void Concatener_DescriptionVide_RetourneLaMentionSeule() { Assert.Equal( "Note (Jean DUPONT) : Client absent", AnnulationRendezVousDescription.Concatener(null, "Client absent", "Jean DUPONT")); Assert.Equal( "Note (Jean DUPONT) : Client absent", AnnulationRendezVousDescription.Concatener(" ", "Client absent", "Jean DUPONT")); } [Fact] public void Concatener_AucuneNote_LaisseLaDescriptionInchangee() { Assert.Equal( "Description initiale", AnnulationRendezVousDescription.Concatener("Description initiale", null, null)); // Un nom sans message ne modifie jamais la description. Assert.Equal( "Description initiale", AnnulationRendezVousDescription.Concatener("Description initiale", null, "Jean DUPONT")); } [Fact] public void Concatener_MentionDejaPresente_EstIdempotent() { // Rejeu d'une opération de synchronisation dont la réponse a été perdue : // la mention ne doit jamais être ajoutée deux fois. string description = "Description initiale" + Environment.NewLine + "Note (Jean DUPONT) : Client absent"; string? resultat = AnnulationRendezVousDescription.Concatener(description, "Client absent", "Jean DUPONT"); Assert.Equal(description, resultat); } }