259 lines
9.1 KiB
C#
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);
|
|
}
|
|
}
|