using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using SeaHaven.Services.Configuration; using SeaHaven.Services.DependencyInjection; using Xunit; namespace SeaHaven.Services.Tests; public sealed class WorkOrderReconciliationOptionsTests { [Fact] public void Enabled_reconciliation_rejects_a_lease_shorter_than_worst_case_request_budget() { var values = new Dictionary { ["WorkOrderReconciliation:Enabled"] = "true", ["WorkOrderReconciliation:RequestTimeoutSeconds"] = "30", ["WorkOrderReconciliation:MaxRetries"] = "3", ["WorkOrderReconciliation:RetryBaseDelayMilliseconds"] = "100", ["WorkOrderReconciliation:LeaseSeconds"] = "120" }; using var provider = BuildProvider(values); Assert.Throws(() => provider .GetRequiredService>().Value); } [Fact] public void Disabled_reconciliation_does_not_require_a_request_budget_lease() { var values = new Dictionary { ["WorkOrderReconciliation:Enabled"] = "false", ["WorkOrderReconciliation:LeaseSeconds"] = "1" }; using var provider = BuildProvider(values); Assert.False(provider .GetRequiredService>().Value.Enabled); } [Fact] public void Enabled_reconciliation_rejects_a_lease_equal_to_the_request_budget() { var values = new Dictionary { ["WorkOrderReconciliation:Enabled"] = "true", ["WorkOrderReconciliation:RequestTimeoutSeconds"] = "30", ["WorkOrderReconciliation:MaxRetries"] = "0", ["WorkOrderReconciliation:RetryBaseDelayMilliseconds"] = "0", ["WorkOrderReconciliation:LeaseSeconds"] = "30" }; using var provider = BuildProvider(values); Assert.Throws(() => provider .GetRequiredService>().Value); } private static ServiceProvider BuildProvider(IDictionary values) { var configuration = new ConfigurationBuilder() .AddInMemoryCollection(values) .Build(); var services = new ServiceCollection(); services.AddBusinessServices(configuration); return services.BuildServiceProvider(); } }