using System.Diagnostics; using System.Net; using Xunit; namespace Elsa.Activities.UnitTests.Http.Helpers; /// /// Shared helper methods for testing SendHttpRequest and FlowSendHttpRequest activities. /// public static class SendHttpRequestTestHelpers { private const string TestActivitySourceName = "Elsa.Tests"; /// /// Creates a response handler that returns a specific HTTP status code and optional content. /// public static Func> CreateResponseHandler( HttpStatusCode statusCode, string? content = null, RequestCapture? requestCapture = null, Dictionary? additionalHeaders = null) { return (request, _) => { if (requestCapture != null) requestCapture.CapturedRequest = request; return Task.FromResult(ActivityTestFixtureHttpExtensions.CreateHttpResponse(statusCode, content, additionalHeaders)); }; } /// /// Creates an exception handler that throws a specific exception type with a message. /// public static Func> CreateExceptionHandler(string message) where TException : Exception { return (_, _) => throw ((TException)Activator.CreateInstance(typeof(TException), message)!); } public static async Task AssertPropagatesCurrentTraceContextAsync( Func>, Task> executeActivityAsync) { using var listener = new ActivityListener { ShouldListenTo = source => source.Name == TestActivitySourceName, Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllDataAndRecorded, SampleUsingParentId = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllDataAndRecorded }; ActivitySource.AddActivityListener(listener); using var source = new ActivitySource(TestActivitySourceName); using var parentActivity = source.StartActivity("parent"); Assert.NotNull(parentActivity); var requestCapture = new RequestCapture(); var responseHandler = CreateResponseHandler(HttpStatusCode.OK, "{}", requestCapture); await executeActivityAsync(new Uri("https://api.example.com/traced"), responseHandler); Assert.NotNull(requestCapture.CapturedRequest); Assert.True(requestCapture.CapturedRequest.Headers.TryGetValues("traceparent", out var traceParents)); var traceParent = Assert.Single(traceParents); var traceParentParts = traceParent.Split('-'); Assert.Equal(4, traceParentParts.Length); Assert.Equal(2, traceParentParts[0].Length); Assert.Equal(parentActivity.TraceId.ToString(), traceParentParts[1]); } /// /// Captures HTTP request details during test execution. /// public sealed class RequestCapture { public HttpRequestMessage? CapturedRequest { get; set; } } }