using System.Net; using AvParser.Core.Proxies; using AvParser.Infrastructure.Proxies; namespace AvParser.Infrastructure.Tests; public class ProxyHandlerFactoryTests { [Theory] [InlineData(ProxyProtocol.Http, "http://1.2.3.4:8080/")] [InlineData(ProxyProtocol.Https, "http://1.2.3.4:8080/")] [InlineData(ProxyProtocol.Socks4, "socks4://1.2.3.4:8080/")] [InlineData(ProxyProtocol.Socks5, "socks5://1.2.3.4:8080/")] public void Maps_the_protocol_onto_a_scheme_dotnet_understands(ProxyProtocol protocol, string expected) { var proxy = ProxyHandlerFactory.CreateWebProxy(new ProxyEndpoint(protocol, "1.2.3.4", 8080)); proxy.Address!.ToString().ShouldBe(expected); } [Fact] public void Attaches_credentials_when_present() { var endpoint = new ProxyEndpoint(ProxyProtocol.Http, "1.2.3.4", 8080) { Username = "alice", Password = "s3cret", }; var credentials = ProxyHandlerFactory.CreateWebProxy(endpoint).Credentials.ShouldBeOfType(); credentials.UserName.ShouldBe("alice"); credentials.Password.ShouldBe("s3cret"); } [Fact] public void Leaves_credentials_alone_when_there_are_none() => ProxyHandlerFactory .CreateWebProxy(new ProxyEndpoint(ProxyProtocol.Http, "1.2.3.4", 8080)) .Credentials.ShouldBeNull(); [Fact] public void A_null_endpoint_produces_a_direct_handler() { using var handler = ProxyHandlerFactory.CreateHandler(null, TimeSpan.FromSeconds(5)); handler.UseProxy.ShouldBeFalse(); handler.Proxy.ShouldBeNull(); } [Fact] public void An_endpoint_produces_a_proxied_handler() { using var handler = ProxyHandlerFactory.CreateHandler( new ProxyEndpoint(ProxyProtocol.Socks5, "1.2.3.4", 1080), TimeSpan.FromSeconds(5) ); handler.UseProxy.ShouldBeTrue(); handler.Proxy.ShouldNotBeNull(); handler.ConnectTimeout.ShouldBe(TimeSpan.FromSeconds(5)); } [Fact] public void The_client_factory_honours_the_requested_timeout() { var factory = new ProxiedHttpClientFactory(new ProxyPool([], new NeverProbe(), new ProxyOptions())); using var client = factory.Create(null, TimeSpan.FromSeconds(3)); client.Timeout.ShouldBe(TimeSpan.FromSeconds(3)); } private sealed class NeverProbe : IProxyProbe { public Task ProbeAsync( ProxyEndpoint endpoint, ProxyOptions options, CancellationToken cancellationToken = default ) => Task.FromResult(ProxyProbeResult.Failure("not used")); } }