182 lines
6.5 KiB
C#
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);
|
|
}
|
|
}
|