Files
Omika/tests/Omika.Tests/Mapping/OmikaRendezVousMapperTests.cs
2026-10-23 18:46:50 +02:00

259 lines
9.1 KiB
C#

using Omika.Core.Compatibility;
using Omika.Core.Domain.Entities.Planning;
using Omika.Core.Domain.ValueObjects;
using OmikaModels = Omika.Data.HfSql.Models.Omika;
using OmikaMappers = Omika.Data.Mapping.Omika;
namespace Omika.Tests.Mapping;
/// <summary>
/// Tests unitaires du mapping Omika de l'affectation Collaborateur d'un
/// rendez-vous (table RDV_Collaborateur). Aucune base réelle : uniquement des
/// objets en mémoire.
/// </summary>
public class OmikaRendezVousMapperTests
{
[Fact]
public void MapCollaborateur_DateFinAnterieureADateDeb_NeLevePasEtPeriodeNull()
{
var row = new OmikaModels.RDVCollaborateurRow
{
RVCPKID = 1,
RVCGUIDColb = "0f8fad5b-d9cb-469f-a165-70867728950e",
RVCDateDeb = new DateTime(2026, 8, 19, 10, 0, 0),
RVCDateFin = new DateTime(2026, 8, 19, 9, 0, 0), // antérieure → anomalie historique
RVCResponsable = true,
RVCTempsValide = true
};
// Aucune DomainValidationException ne doit remonter.
AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row);
Assert.NotNull(affectation);
Assert.Null(affectation.PeriodeParticuliere);
// L'affectation elle-même est conservée (identifiant + flags).
Assert.NotNull(affectation.CollaborateurId);
Assert.True(affectation.Responsable);
Assert.True(affectation.TempsValide);
}
[Fact]
public void MapCollaborateur_PlageValide_PeriodeMappee()
{
var debut = new DateTime(2026, 8, 19, 9, 0, 0);
var fin = new DateTime(2026, 8, 19, 10, 0, 0);
var row = new OmikaModels.RDVCollaborateurRow
{
RVCDateDeb = debut,
RVCDateFin = fin
};
AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row);
Assert.NotNull(affectation.PeriodeParticuliere);
Assert.Equal(debut, affectation.PeriodeParticuliere!.Start);
Assert.Equal(fin, affectation.PeriodeParticuliere.End);
}
[Fact]
public void MapCollaborateur_DateEgale_PeriodeMappee()
{
var instant = new DateTime(2026, 8, 19, 9, 0, 0);
var row = new OmikaModels.RDVCollaborateurRow
{
RVCDateDeb = instant,
RVCDateFin = instant
};
AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row);
Assert.NotNull(affectation.PeriodeParticuliere);
Assert.Equal(instant, affectation.PeriodeParticuliere!.Start);
Assert.Equal(instant, affectation.PeriodeParticuliere.End);
}
[Fact]
public void MapCollaborateur_DatesParDefaut_PeriodeNull()
{
var row = new OmikaModels.RDVCollaborateurRow
{
RVCDateDeb = default,
RVCDateFin = default
};
AffectationCollaborateur affectation = OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row);
Assert.Null(affectation.PeriodeParticuliere);
}
[Fact]
public void MapCollaborateur_PkNumeriqueFourni_SourceReferencePorteNumericIdEtEntityGuid()
{
Guid guid = Guid.Parse("0f8fad5b-d9cb-469f-a165-70867728950e");
var row = new OmikaModels.RDVCollaborateurRow
{
RVCGUIDColb = guid.ToString("D")
};
AffectationCollaborateur affectation =
OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row, collaborateurNumericId: 42);
Assert.NotNull(affectation.SourceReference);
Assert.Equal(42, affectation.SourceReference!.NumericId);
Assert.Equal(guid, affectation.SourceReference.EntityGuid);
}
[Fact]
public void MapCollaborateur_SansPkNumerique_SourceReferenceSansNumericId()
{
Guid guid = Guid.Parse("0f8fad5b-d9cb-469f-a165-70867728950e");
var row = new OmikaModels.RDVCollaborateurRow
{
RVCGUIDColb = guid.ToString("D")
};
AffectationCollaborateur affectation =
OmikaMappers.OmikaRendezVousMapper.MapCollaborateur(row);
Assert.NotNull(affectation.SourceReference);
Assert.Null(affectation.SourceReference!.NumericId);
Assert.Equal(guid, affectation.SourceReference.EntityGuid);
}
[Fact]
public void Map_RVIdInterPresent_InterventionSourceReferenceAvecGUID()
{
var interventionGuid = Guid.Parse("11111111-1111-1111-1111-111111111111");
var row = new OmikaModels.RDVPlanningRow
{
RVPKID = 1,
GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
RVDate = new DateOnly(2026, 8, 19),
RVIdInter = 105
};
var interventionGuids = new Dictionary<long, Guid> { [105] = interventionGuid };
CanonicalMappingResult<RendezVous> mapped =
OmikaMappers.OmikaRendezVousMapper.Map(row, null, interventionGuids);
Assert.NotNull(mapped.Value.InterventionSourceReference);
Assert.Equal(105, mapped.Value.InterventionSourceReference.NumericId);
Assert.Equal(interventionGuid, mapped.Value.InterventionSourceReference.EntityGuid);
}
[Fact]
public void Map_RVIdInterAbsent_InterventionSourceReferenceNull()
{
var row = new OmikaModels.RDVPlanningRow
{
RVPKID = 1,
GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
RVDate = new DateOnly(2026, 8, 19),
RVIdInter = 0
};
CanonicalMappingResult<RendezVous> mapped =
OmikaMappers.OmikaRendezVousMapper.Map(row, null, null);
Assert.Null(mapped.Value.InterventionSourceReference);
}
[Fact]
public void Map_RVIdInterOrphelin_InterventionSourceReferenceSansGUID()
{
var row = new OmikaModels.RDVPlanningRow
{
RVPKID = 1,
GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
RVDate = new DateOnly(2026, 8, 19),
RVIdInter = 999
};
CanonicalMappingResult<RendezVous> mapped =
OmikaMappers.OmikaRendezVousMapper.Map(row, null, new Dictionary<long, Guid>());
Assert.NotNull(mapped.Value.InterventionSourceReference);
Assert.Equal(999, mapped.Value.InterventionSourceReference.NumericId);
Assert.Null(mapped.Value.InterventionSourceReference.EntityGuid);
}
[Fact]
public void Map_AnnulationAvecReferentiel_LibellesOrigineEtMotifResolus()
{
// La fiche du rendez-vous affiche le motif et l'origine d'annulation : sans
// résolution dans le référentiel, elle n'afficherait que le CODE du
// paramètre (« O.ANU.RDV.E.CLI ») au lieu de son libellé.
var row = new OmikaModels.RDVPlanningRow
{
RVPKID = 7,
GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
RVDate = new DateOnly(2026, 8, 19),
RVCleOrigineAnnu = "O.ANU.RDV.E.CLI",
RVCleMotifAnnu = "M.ANU.RDV.ABS"
};
var references = new Dictionary<string, OmikaModels.ParametreMetierRow>(StringComparer.OrdinalIgnoreCase)
{
["O.ANU.RDV.E.CLI"] = new OmikaModels.ParametreMetierRow
{
PAPKID = 10,
PACLE = "O.ANU.RDV.E.CLI",
PACategorie = "O.ANU.RDV",
PALibelle = "Externe : Client"
},
["M.ANU.RDV.ABS"] = new OmikaModels.ParametreMetierRow
{
PAPKID = 11,
PACLE = "M.ANU.RDV.ABS",
PACategorie = "M.ANU.RDV",
PALibelle = "Absent"
}
};
CanonicalMappingResult<RendezVous> mapped =
OmikaMappers.OmikaRendezVousMapper.Map(row, references, null);
Assert.NotNull(mapped.Value.Annulation);
Assert.Equal("O.ANU.RDV.E.CLI", mapped.Value.Annulation!.Origine!.Key);
Assert.Equal("Externe : Client", mapped.Value.Annulation.Origine!.Label);
Assert.Equal("M.ANU.RDV.ABS", mapped.Value.Annulation.Motif!.Key);
Assert.Equal("Absent", mapped.Value.Annulation.Motif!.Label);
}
[Fact]
public void Map_AnnulationSansReferentiel_ConserveLaCleSansInventerDeLibelle()
{
var row = new OmikaModels.RDVPlanningRow
{
RVPKID = 8,
GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
RVDate = new DateOnly(2026, 8, 19),
RVCleMotifAnnu = "M.ANU.RDV.ABS"
};
CanonicalMappingResult<RendezVous> mapped =
OmikaMappers.OmikaRendezVousMapper.Map(row, null, null);
Assert.NotNull(mapped.Value.Annulation);
Assert.Equal("M.ANU.RDV.ABS", mapped.Value.Annulation!.Motif!.Key);
Assert.True(string.IsNullOrEmpty(mapped.Value.Annulation.Motif!.Label));
Assert.Null(mapped.Value.Annulation.Origine);
}
[Fact]
public void Map_SansAnnulation_AucuneAnnulation()
{
var row = new OmikaModels.RDVPlanningRow
{
RVPKID = 9,
GUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
RVDate = new DateOnly(2026, 8, 19)
};
CanonicalMappingResult<RendezVous> mapped =
OmikaMappers.OmikaRendezVousMapper.Map(row, null, null);
Assert.Null(mapped.Value.Annulation);
}
}