using Elsa.Workflows.Runtime.Options; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Elsa.Workflows.Runtime.UnitTests.Options; public class GracefulShutdownOptionsValidationTests { public static TheoryData, string> InvalidConfigurations => new() { { options => options.DrainDeadline = TimeSpan.Zero, nameof(GracefulShutdownOptions.DrainDeadline) }, { options => options.IngressPauseTimeout = TimeSpan.Zero, nameof(GracefulShutdownOptions.IngressPauseTimeout) }, { options => options.StimulusQueueMaxDepthWhilePaused = 0, nameof(GracefulShutdownOptions.StimulusQueueMaxDepthWhilePaused) }, { options => options.MaxForceCancelledInstanceIdsReported = 0, nameof(GracefulShutdownOptions.MaxForceCancelledInstanceIdsReported) }, }; [Fact] public void AllowsUnlimitedPausedStimulusQueue() { using var serviceProvider = CreateServiceProvider(options => options.StimulusQueueMaxDepthWhilePaused = null); var options = serviceProvider.GetRequiredService>().Value; Assert.Null(options.StimulusQueueMaxDepthWhilePaused); } [Theory] [MemberData(nameof(InvalidConfigurations))] public void RejectsInvalidConfiguration(Action configure, string expectedFailure) { using var serviceProvider = CreateServiceProvider(configure); var exception = Assert.Throws(() => _ = serviceProvider.GetRequiredService>().Value); Assert.Contains(exception.Failures, failure => failure.Contains(expectedFailure)); } [Theory] [MemberData(nameof(InvalidConfigurations))] public void RejectsInvalidConfigurationDuringStartupValidation(Action configure, string expectedFailure) { using var serviceProvider = CreateServiceProvider(configure); var startupValidator = serviceProvider.GetRequiredService(); var exception = Assert.Throws(startupValidator.Validate); Assert.Contains(exception.Failures, failure => failure.Contains(expectedFailure)); } private static ServiceProvider CreateServiceProvider(Action? configure = null) { var services = new ServiceCollection(); services.AddGracefulShutdownOptions(configure); return services.BuildServiceProvider(); } }