using Omika.Core.Configuration; using Omika.Core.Observability; namespace Omika.Tests.Observability; public class SafeTelemetrySinkFailOpenTests { [Fact] public void ThrowingQueue_DoesNotPropagate_AndCountsInternalDrop() { var options = new ObservabilityOptions(); var counters = new TelemetryCounters(); var sink = new SafeTelemetrySink(options, new ThrowingQueue(), counters); sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted)); Assert.Equal(1L, counters.DroppedInternal); Assert.Equal(0L, counters.Accepted); } [Fact] public void ThrowingQueue_Log_DoesNotPropagate() { var sink = new SafeTelemetrySink( new ObservabilityOptions(), new ThrowingQueue(), new TelemetryCounters()); sink.Log(ObservabilityTestHarness.NewDiagnostic(TelemetryEventCodes.ApiRequestFailed)); // Aucune exception : l'assertion porte sur l'absence de levée. } [Fact] public void UnknownMode_IsTreatedAsOff_NoThrow() { var options = new ObservabilityOptions { Mode = (TelemetryMode)999 }; var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options); sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted)); Assert.Equal(1L, counters.DroppedDisabled); } [Fact] public void OutOfRangePriority_IsDowngraded_NoThrow() { var (sink, queue, counters) = ObservabilityTestHarness.CreatePipeline(); sink.Track(ObservabilityTestHarness.NewEvent( TelemetryEventCodes.MobileAppStarted, priority: (TelemetryPriority)999)); // Rétrogradée vers la file P4 (la moins critique). Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P4)); Assert.Equal(1L, counters.Accepted); } private sealed class ThrowingQueue : ITelemetryQueue { public bool TryEnqueue(OmikaEvent @event) => throw new InvalidOperationException("queue défaillante (test)"); } }