using Omika.Core.Contracts.Documents; namespace Omika.Tests.Services; /// /// Verrouille la machine d'état de persistance du courriel (règles §1, §7-§9) : /// ME_EnvoyerMob est INDÉPENDANT de ME_Envoyer (un envoi WinDev a /// ME_Envoyer=true mais ME_EnvoyerMob=false). /// /// /// Deux chemins donnent ME_EnvoyerMob=true, tous deux « envoyé depuis le /// mobile » : (1) un envoi SMTP réussi par Omika ; (2) un envoi depuis une /// MESSAGERIE EXTERNE confirmé par l'utilisateur (choix de messagerie /// « Externe » — l'application n'a envoyé aucun courriel elle-même, elle /// enregistre une déclaration). /// /// public class EmailEnregistrementStateMachineTests { // TEST MOBILE 1 : envoi réussi depuis Omika. [Fact] public void EnvoiReussiDepuisOmika_EnvoyerVrai_EnvoyerMobVrai_BrouillonFaux() { var enregistrement = new EmailEnregistrement { Brouillon = false, Envoyer = true, EnvoyerMob = true }; Assert.True(enregistrement.Envoyer); Assert.False(enregistrement.Brouillon); Assert.True(enregistrement.EnvoyerMob); } // TEST MOBILE 2 : échec SMTP. [Fact] public void EchecSmtp_EnvoyerFaux_EnvoyerMobFaux_BrouillonVrai() { var enregistrement = new EmailEnregistrement { Brouillon = true, Envoyer = false, EnvoyerMob = false }; Assert.False(enregistrement.Envoyer); Assert.True(enregistrement.Brouillon); Assert.False(enregistrement.EnvoyerMob); } // TEST MOBILE 3 : enregistrement sans envoi (brouillon). [Fact] public void EnregistrementSansEnvoi_EnvoyerFaux_EnvoyerMobFaux_BrouillonVrai() { var enregistrement = new EmailEnregistrement { Brouillon = true, Envoyer = false, EnvoyerMob = false }; Assert.False(enregistrement.Envoyer); Assert.True(enregistrement.Brouillon); Assert.False(enregistrement.EnvoyerMob); } // TEST MOBILE 4 : un message envoyé par WinDev ne force jamais EnvoyerMob=true. [Fact] public void MessageEnvoyeParWinDev_EnvoyerVraiMaisEnvoyerMobFaux() { var enregistrement = new EmailEnregistrement { Brouillon = false, Envoyer = true, EnvoyerMob = false }; // ME_EnvoyerMob est un champ DISTINCT de ME_Envoyer : il peut rester faux // alors que le message a été envoyé par WinDev. Assert.True(enregistrement.Envoyer); Assert.False(enregistrement.EnvoyerMob); } // TEST MOBILE 4 (invariant) : EnvoyerMob n'est PAS dérivé de Envoyer. [Fact] public void EnvoyerMob_EstUnChampIndependantDeEnvoyer() { // Le record expose les deux drapeaux séparément : aucune dérivation // EnvoyerMob = Envoyer n'est codée dans le contrat. Assert.False(new EmailEnregistrement().EnvoyerMob); Assert.False(new EmailEnregistrement().Envoyer); } // TEST MOBILE 5 : envoi déclaré depuis une MESSAGERIE EXTERNE (choix // « Externe » + confirmation de l'utilisateur). Omika n'a envoyé aucun // courriel, aucun expéditeur n'est connu, mais le message est bien « envoyé // par le mobile » : EnvoyerMob = vrai, comme un envoi SMTP réussi. [Fact] public void EnvoiDeclareDepuisMessagerieExterne_EnvoyerMobVrai_SansExpediteur() { var enregistrement = new EmailEnregistrement { Brouillon = false, Envoyer = true, EnvoyerMob = true, AdrExp = null }; Assert.True(enregistrement.EnvoyerMob); Assert.False(enregistrement.Brouillon); Assert.Null(enregistrement.AdrExp); } // TEST MOBILE 5 (repli) : réponse « Non » à la confirmation — l'utilisateur // n'a pas envoyé le courriel depuis sa messagerie : il reste un BROUILLON. [Fact] public void ReponseNonALaConfirmationExterne_ResteBrouillon() { var enregistrement = new EmailEnregistrement { Brouillon = true, Envoyer = false, EnvoyerMob = false }; Assert.True(enregistrement.Brouillon); Assert.False(enregistrement.Envoyer); Assert.False(enregistrement.EnvoyerMob); } }