Premiere commit - Omika
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
using System.Reflection;
|
||||
using Omika.Data.HfSql.Metadata;
|
||||
using Omika.Data.HfSql.Models.Batik;
|
||||
using Omika.Data.Repositories.Batik;
|
||||
|
||||
namespace Omika.Tests.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// Test miroir Batik (non-régression) : vérifie que les colonnes référencées
|
||||
/// par les SELECT de <see cref="BatikRendezVousRepository"/> existent dans les
|
||||
/// modèles physiques Batik. Miroir du garde-fou Omika.
|
||||
/// </summary>
|
||||
public class BatikRendezVousSqlConsistencyTests
|
||||
{
|
||||
public static IEnumerable<object[]> Cases()
|
||||
{
|
||||
yield return [typeof(BatikRendezVousRepository), "SqlSelectRendezVousColumns", typeof(PlanningRDVRow)];
|
||||
yield return [typeof(BatikRendezVousRepository), "SqlSelectPersonneColumns", typeof(PlanningRDVPersonneRow)];
|
||||
yield return [typeof(BatikRendezVousRepository), "SqlSelectParametreMetierColumns", typeof(ParametreMetierRow)];
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(Cases))]
|
||||
public void ColonnesSelect_ExistentDansLeModelePhysique(Type repositoryType, string fieldName, Type rowType)
|
||||
{
|
||||
FieldInfo? field = repositoryType.GetField(
|
||||
fieldName,
|
||||
BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public);
|
||||
Assert.True(field is not null, $"Champ « {fieldName} » introuvable dans {repositoryType.Name}.");
|
||||
|
||||
string sql = (string)field!.GetRawConstantValue()!;
|
||||
var physicalColumns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (PropertyInfo property in rowType.GetProperties())
|
||||
{
|
||||
HfSqlColumnAttribute? attr = property.GetCustomAttribute<HfSqlColumnAttribute>();
|
||||
if (attr is not null)
|
||||
{
|
||||
physicalColumns.Add(attr.ColumnName);
|
||||
}
|
||||
}
|
||||
|
||||
Assert.NotEmpty(physicalColumns);
|
||||
|
||||
foreach (string column in sql.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
Assert.True(
|
||||
physicalColumns.Contains(column),
|
||||
$"{repositoryType.Name}.{fieldName} référence la colonne « {column} » absente du modèle {rowType.Name}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user