// Copyright (c) The Geekeey Authors // SPDX-License-Identifier: EUPL-1.2 using Microsoft.Extensions.DependencyInjection; namespace Geekeey.Request.Dispatcher.Tests; internal sealed class StackTraceTests { [Test] public async Task I_can_not_see_pipeline_internals_are_hidden_from_stack_trace_scalar() { // Arrange var sc = new ServiceCollection(); sc.AddSingleton(); sc.AddRequestDispatcher(builder => builder .Add(typeof(FailingScalarHandler)) .Add(typeof(ScalarOpenBehavior<,>))); var provider = sc.BuildServiceProvider(); var dispatcher = provider.GetRequiredService(); var request = new FailingScalarRequest(); // Act var exception = await Assert.ThrowsAsync(() => dispatcher.DispatchAsync(request)); // Assert await Assert.That(exception).IsNotNull(); var stackTrace = await Assert.That(exception.StackTrace).IsNotNull(); await Assert.That(stackTrace).Contains(nameof(FailingScalarHandler)); await Assert.That(stackTrace).Contains(nameof(ScalarOpenBehavior<,>)); // 3. Verify that the internal lambda from ScalarRequestInvoker.Chain is HIDDEN. // In C#, these lambdas usually appear as "ScalarRequestInvoker`2.<>c__DisplayClass..." or similar. // Since we added [StackTraceHidden], this frame should be omitted. await Assert.That(stackTrace).DoesNotContain("ScalarRequestInvoker+<>"); } [Test] public async Task I_can_not_see_pipeline_internals_are_hidden_from_stack_trace_stream() { // Arrange var sc = new ServiceCollection(); sc.AddSingleton(); sc.AddRequestDispatcher(builder => builder .Add(typeof(FailingStreamHandler)) .Add(typeof(StreamOpenBehavior<,>))); var provider = sc.BuildServiceProvider(); var dispatcher = provider.GetRequiredService(); var request = new FailingStreamRequest(); // Act var exception = await Assert.ThrowsAsync(() => dispatcher.DispatchAsync(request).ToListAsync().AsTask()); // Assert await Assert.That(exception).IsNotNull(); var stackTrace = await Assert.That(exception.StackTrace).IsNotNull(); await Assert.That(stackTrace).Contains(nameof(FailingStreamHandler)); await Assert.That(stackTrace).Contains(nameof(StreamOpenBehavior<,>)); // 3. Verify that the internal lambda from ScalarRequestInvoker.Chain is HIDDEN. // In C#, these lambdas usually appear as "ScalarRequestInvoker`2.<>c__DisplayClass..." or similar. // Since we added [StackTraceHidden], this frame should be omitted. await Assert.That(stackTrace).DoesNotContain("StreamRequestInvoker+<>"); } }