using Omika.Core.Contracts.Common; using Omika.Core.Contracts.Planning; using Omika.Core.Mapping; using Omika.Core.Domain.Entities.Planning; using Omika.Core.Domain.ValueObjects; namespace Omika.Tests.Domain; /// /// Scénario de compatibilité des rendez-vous : le même /// doit pouvoir représenter un rendez-vous de /// l'ancien schéma (Batik) et du nouveau schéma (Omika), avec ou sans contacts, /// avec plusieurs collaborateurs, et avec des informations absentes selon la /// version. /// public class RendezVousCrossSchemaTests { private static RendezVous BuildOldSchemaRendezVous() { var rendezVous = new RendezVous { Titre = "RDV Batik", Description = null, // absent dans l'ancien modèle Periode = new DateTimeRange(new DateTime(2026, 2, 10, 9, 0, 0), new DateTime(2026, 2, 10, 10, 0, 0)), TypeActivite = new ReferenceValue("Visite") { LegacyId = 3 }, Statut = new ReferenceValue("Planifié") { LegacyId = 1 }, Couleur = "#FF0000", EstTouteLaJournee = false, EstArchive = false }; rendezVous.AddCollaborateur(new AffectationCollaborateur { CollaborateurId = Guid.NewGuid(), NomAffiche = "Dupont Jean", Responsable = true, Statut = new ReferenceValue("Affecté") { LegacyId = 2 }, TempsValide = false }); rendezVous.AddCollaborateur(new AffectationCollaborateur { CollaborateurId = Guid.NewGuid(), NomAffiche = "Martin Claire", Responsable = false, TempsValide = false }); rendezVous.AddContact(new ParticipantRendezVous { ContactId = Guid.NewGuid(), NomAffiche = "Durand Paul", Email = "paul@exemple.fr", Telephone = "0600000000", PresenceConfirmee = false }); return rendezVous; } private static RendezVous BuildNewSchemaRendezVous() { var rendezVous = new RendezVous { Titre = "RDV Omika", Description = "Visite de contrôle annuelle", Periode = new DateTimeRange(new DateTime(2026, 2, 12, 14, 0, 0), new DateTime(2026, 2, 12, 16, 0, 0)), ClientId = Guid.NewGuid(), SiteId = Guid.NewGuid(), DossierId = Guid.NewGuid(), InterventionId = Guid.NewGuid(), TypeActivite = new ReferenceValue("Contrôle") { Key = "CONTROLE" }, Statut = new ReferenceValue("Confirmé") { Key = "CONFIRME" }, Couleur = "#00FF00", EstTouteLaJournee = false, EstArchive = false }; rendezVous.AddCollaborateur(new AffectationCollaborateur { CollaborateurId = Guid.NewGuid(), NomAffiche = "Dupont Jean", Responsable = true, Statut = new ReferenceValue("Validé") { Key = "VALIDE" }, TempsValide = true, PeriodeParticuliere = new DateTimeRange(new DateTime(2026, 2, 12, 14, 30, 0), new DateTime(2026, 2, 12, 15, 30, 0)) }); // Pas de contact : le nouveau schéma gère RDV_Contact séparément. return rendezVous; } [Fact] public void SameDto_RepresentsOldAndNewSchema() { RendezVousDetailsDto oldDto = RendezVousContractMapper.ToDetails(BuildOldSchemaRendezVous()); RendezVousDetailsDto newDto = RendezVousContractMapper.ToDetails(BuildNewSchemaRendezVous()); // Le type du DTO est strictement le même pour les deux versions. Assert.Equal(oldDto.GetType(), newDto.GetType()); // Les informations partagées sont portées de la même façon. Assert.Equal("RDV Batik", oldDto.Titre); Assert.Equal("RDV Omika", newDto.Titre); Assert.Equal(new DateTime(2026, 2, 10, 9, 0, 0), oldDto.Debut); Assert.Equal(new DateTime(2026, 2, 12, 16, 0, 0), newDto.Fin); } [Fact] public void NewSchema_CanCarryLinkedEntities() { RendezVousDetailsDto newDto = RendezVousContractMapper.ToDetails(BuildNewSchemaRendezVous()); Assert.NotNull(newDto.ClientId); Assert.NotNull(newDto.SiteId); Assert.NotNull(newDto.DossierId); Assert.NotNull(newDto.InterventionId); } [Fact] public void OldSchema_AbsentInformationIsNull() { RendezVousDetailsDto oldDto = RendezVousContractMapper.ToDetails(BuildOldSchemaRendezVous()); // La description et les liens métier n'existaient pas dans l'ancien modèle. Assert.Null(oldDto.Description); Assert.Null(oldDto.ClientId); Assert.Null(oldDto.DossierId); Assert.Null(oldDto.InterventionId); } [Fact] public void OldSchema_CarriesLegacyReferenceValues() { RendezVousDetailsDto oldDto = RendezVousContractMapper.ToDetails(BuildOldSchemaRendezVous()); Assert.NotNull(oldDto.TypeActivite); Assert.Equal(3, oldDto.TypeActivite.LegacyId); Assert.Equal(1, oldDto.Statut!.LegacyId); // La nouvelle clé métier n'existe pas dans l'ancien schéma. Assert.Null(oldDto.TypeActivite.Key); } [Fact] public void NewSchema_CarriesBusinessKeys() { RendezVousDetailsDto newDto = RendezVousContractMapper.ToDetails(BuildNewSchemaRendezVous()); Assert.NotNull(newDto.TypeActivite); Assert.Equal("CONTROLE", newDto.TypeActivite.Key); Assert.Null(newDto.TypeActivite.LegacyId); } [Fact] public void RendezVous_WithMultipleCollaborateurs_MapsAllOfThem() { RendezVousDetailsDto oldDto = RendezVousContractMapper.ToDetails(BuildOldSchemaRendezVous()); Assert.Equal(2, oldDto.Collaborateurs.Count); Assert.True(oldDto.Collaborateurs[0].Responsable); Assert.False(oldDto.Collaborateurs[1].Responsable); } [Fact] public void RendezVous_WithoutContacts_IsSupported() { RendezVousDetailsDto newDto = RendezVousContractMapper.ToDetails(BuildNewSchemaRendezVous()); Assert.Empty(newDto.Contacts); } [Fact] public void RendezVous_WithSingleCollaborateurCarriesTempsValide() { RendezVousDetailsDto newDto = RendezVousContractMapper.ToDetails(BuildNewSchemaRendezVous()); Assert.Single(newDto.Collaborateurs); Assert.True(newDto.Collaborateurs[0].TempsValide); Assert.NotNull(newDto.Collaborateurs[0].PeriodeDebut); Assert.NotNull(newDto.Collaborateurs[0].PeriodeFin); } }