Files
Omika/tests/Omika.Tests/Domain/RendezVousCrossSchemaTests.cs
T
2026-10-23 18:46:50 +02:00

182 lines
6.5 KiB
C#

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;
/// <summary>
/// Scénario de compatibilité des rendez-vous : le même
/// <see cref="RendezVousDetailsDto"/> 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.
/// </summary>
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);
}
}