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

60 lines
1.9 KiB
C#

using System.Reflection;
using Omika.Core.Observability;
namespace Omika.Tests.Observability;
/// <summary>
/// Contrat structurel de la façade d'observabilité : les méthodes exposées au
/// métier sont strictement <c>void</c> (never-throw, non bloquantes, sans await).
/// Aucune méthode <c>Task ...Async</c> ne doit apparaître.
/// </summary>
public class ObservabilityContractTests
{
[Fact]
public void AllTelemetryInterfaces_ExposeOnlyVoidMethods()
{
Type[] interfaces = [typeof(IOmikaTelemetry), typeof(IEventTracker), typeof(IDiagnosticLogger)];
foreach (Type type in interfaces)
{
foreach (MethodInfo method in type.GetMethods())
{
Assert.True(
method.ReturnType == typeof(void),
$"{type.Name}.{method.Name} doit retourner void (jamais Task).");
}
}
}
[Fact]
public void NoAsyncTrackOrLogMethod_IsExposed()
{
MethodInfo[] methods = typeof(IEventTracker).GetMethods()
.Concat(typeof(IDiagnosticLogger).GetMethods())
.Concat(typeof(IOmikaTelemetry).GetMethods())
.ToArray();
Assert.DoesNotContain(methods, m => m.Name.EndsWith("Async", StringComparison.Ordinal));
}
[Fact]
public void EventTracker_ExposesTrack_ReturningVoid()
{
MethodInfo track = typeof(IEventTracker).GetMethod(nameof(IEventTracker.Track))!;
Assert.NotNull(track);
Assert.Equal(typeof(void), track.ReturnType);
Assert.Equal(typeof(TelemetryEvent), track.GetParameters().Single().ParameterType);
}
[Fact]
public void DiagnosticLogger_ExposesLog_ReturningVoid()
{
MethodInfo log = typeof(IDiagnosticLogger).GetMethod(nameof(IDiagnosticLogger.Log))!;
Assert.NotNull(log);
Assert.Equal(typeof(void), log.ReturnType);
Assert.Equal(typeof(DiagnosticEvent), log.GetParameters().Single().ParameterType);
}
}