using Omika.Core.Observability; using Omika.Core.Observability.Diagnostic; namespace Omika.Tests.Observability.Correlation; public class ApiTelemetryContextEnricherTests { private sealed class RecordingTelemetry : IOmikaTelemetry { public OmikaEvent? Last { get; private set; } public void Track(TelemetryEvent telemetryEvent) => Last = telemetryEvent; public void Log(DiagnosticEvent diagnosticEvent) => Last = diagnosticEvent; } private static DeviceInfoSnapshot Snapshot() => new() { AppVersion = "1.0.0.0", Platform = "Windows", OperatingSystem = "Windows 11", OperatingSystemVersion = "10.0" }; [Fact] public void Log_WithinRequestContext_EnrichesTraceSessionIdentityAndDevice() { var recorder = new RecordingTelemetry(); var traceContext = new TraceContext(); var requestContext = new RequestDiagnosticContext(); var enricher = new ApiTelemetryContextEnricher(recorder, traceContext, requestContext, Snapshot()); Guid traceId = Guid.NewGuid(); Guid sessionId = Guid.NewGuid(); using (traceContext.BeginTrace(traceId)) using (requestContext.Begin(traceId, sessionId)) { requestContext.SetIdentity("device-1", "CLIENT01", "42", "7"); enricher.Log(new DiagnosticEvent { EventCode = TelemetryEventCodes.ApiHttpRequestStarted }); } var @event = recorder.Last!; Assert.Equal(traceId, @event.TraceId); Assert.Equal(sessionId, @event.SessionId); Assert.Equal("device-1", @event.DeviceId); Assert.Equal("CLIENT01", @event.ClientId); Assert.Equal("42", @event.UserId); Assert.Equal("7", @event.CollaborateurId); Assert.Equal("1.0.0.0", @event.AppVersion); Assert.Equal("Windows", @event.Platform); } [Fact] public void Track_OutsideRequestContext_StillEnrichesDeviceInfo() { var recorder = new RecordingTelemetry(); var traceContext = new TraceContext(); var requestContext = new RequestDiagnosticContext(); var enricher = new ApiTelemetryContextEnricher(recorder, traceContext, requestContext, Snapshot()); enricher.Track(new TelemetryEvent { EventCode = TelemetryEventCodes.ApiHttpRequestStarted }); var @event = recorder.Last!; Assert.Null(@event.TraceId); Assert.Null(@event.SessionId); Assert.Equal("1.0.0.0", @event.AppVersion); } [Fact] public void Log_ExplicitTraceId_IsNotOverwritten() { var recorder = new RecordingTelemetry(); var traceContext = new TraceContext(); var requestContext = new RequestDiagnosticContext(); var enricher = new ApiTelemetryContextEnricher(recorder, traceContext, requestContext, Snapshot()); Guid explicitTrace = Guid.NewGuid(); enricher.Log(new DiagnosticEvent { EventCode = TelemetryEventCodes.ApiHttpRequestFailed, TraceId = explicitTrace }); Assert.Equal(explicitTrace, recorder.Last!.TraceId); } }