using System.IO; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using TermRemoteCtl.Agent.Configuration; namespace TermRemoteCtl.Agent.Tests.Configuration; public class AgentOptionsPipelineTests { [Fact] public void BuildListenUri_Uses_Https_Scheme_And_HttpsPort() { var options = new AgentOptions { DataRoot = "C:\\ProgramData\\TermRemoteCtl", BindAddress = "127.0.0.1", HttpsPort = 9443, WebSocketFrameFlushMilliseconds = 33, RingBufferLineLimit = 4000 }; var uri = AgentEndpointConfiguration.BuildListenUri(options); Assert.Equal(Uri.UriSchemeHttps, uri.Scheme); Assert.Equal("127.0.0.1", uri.Host); Assert.Equal(9443, uri.Port); } [Fact] public void ResolveOptions_Uses_DataRoot_Fallback_When_Config_Omits_DataRoot() { var configuration = BuildConfiguration(new Dictionary { ["Agent:BindAddress"] = "127.0.0.1", ["Agent:HttpsPort"] = "9443", ["Agent:WebSocketFrameFlushMilliseconds"] = "33", ["Agent:RingBufferLineLimit"] = "4000" }); var services = new ServiceCollection(); services.AddAgentOptions(configuration); using var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; var expectedDataRoot = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "TermRemoteCtl"); Assert.Equal(expectedDataRoot, options.DataRoot); } [Theory] [InlineData("0", "33", "HttpsPort")] [InlineData("9443", "0", "WebSocketFrameFlushMilliseconds")] [InlineData("9443", "33", "RingBufferLineLimit")] public void ResolveOptions_Fails_When_Config_Is_Invalid( string httpsPort, string flushMilliseconds, string expectedFailure) { var configuration = BuildConfiguration(new Dictionary { ["Agent:BindAddress"] = "127.0.0.1", ["Agent:HttpsPort"] = httpsPort, ["Agent:WebSocketFrameFlushMilliseconds"] = flushMilliseconds, ["Agent:RingBufferLineLimit"] = expectedFailure == "RingBufferLineLimit" ? "0" : "4000" }); var services = new ServiceCollection(); services.AddAgentOptions(configuration); using var provider = services.BuildServiceProvider(); var exception = Assert.Throws( () => provider.GetRequiredService>().Value); Assert.Contains(exception.Failures, failure => failure.Contains(expectedFailure)); } private static IConfiguration BuildConfiguration(IReadOnlyDictionary values) { return new ConfigurationBuilder() .AddInMemoryCollection(values) .Build(); } }