mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 15:50:49 +08:00 
			
		
		
		
	Rename all ReRoute to Route to move closer to YARP +semver: breaking
This commit is contained in:
		@@ -1,306 +1,306 @@
 | 
			
		||||
namespace Ocelot.UnitTests.DownstreamRouteFinder
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using Moq;
 | 
			
		||||
    using Ocelot.Configuration;
 | 
			
		||||
    using Ocelot.Configuration.Builder;
 | 
			
		||||
    using Ocelot.Configuration.Creator;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder.Finder;
 | 
			
		||||
    using Ocelot.LoadBalancer.LoadBalancers;
 | 
			
		||||
    using Responses;
 | 
			
		||||
    using Shouldly;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
    using System.Net.Http;
 | 
			
		||||
    using TestStack.BDDfy;
 | 
			
		||||
    using Xunit;
 | 
			
		||||
 | 
			
		||||
    public class DownstreamRouteCreatorTests
 | 
			
		||||
    {
 | 
			
		||||
        private readonly DownstreamRouteCreator _creator;
 | 
			
		||||
        private readonly QoSOptions _qoSOptions;
 | 
			
		||||
        private readonly HttpHandlerOptions _handlerOptions;
 | 
			
		||||
        private readonly LoadBalancerOptions _loadBalancerOptions;
 | 
			
		||||
        private Response<DownstreamRoute> _result;
 | 
			
		||||
        private string _upstreamHost;
 | 
			
		||||
        private string _upstreamUrlPath;
 | 
			
		||||
        private string _upstreamHttpMethod;
 | 
			
		||||
        private IInternalConfiguration _configuration;
 | 
			
		||||
        private Mock<IQoSOptionsCreator> _qosOptionsCreator;
 | 
			
		||||
        private Response<DownstreamRoute> _resultTwo;
 | 
			
		||||
        private string _upstreamQuery;
 | 
			
		||||
 | 
			
		||||
        public DownstreamRouteCreatorTests()
 | 
			
		||||
        {
 | 
			
		||||
            _qosOptionsCreator = new Mock<IQoSOptionsCreator>();
 | 
			
		||||
            _qoSOptions = new QoSOptionsBuilder().Build();
 | 
			
		||||
            _handlerOptions = new HttpHandlerOptionsBuilder().Build();
 | 
			
		||||
            _loadBalancerOptions = new LoadBalancerOptionsBuilder().WithType(nameof(NoLoadBalancer)).Build();
 | 
			
		||||
            _qosOptionsCreator
 | 
			
		||||
                .Setup(x => x.Create(It.IsAny<QoSOptions>(), It.IsAny<string>(), It.IsAny<List<string>>()))
 | 
			
		||||
                .Returns(_qoSOptions);
 | 
			
		||||
            _creator = new DownstreamRouteCreator(_qosOptionsCreator.Object);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRouteIsCreated())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_rate_limit_options()
 | 
			
		||||
        {
 | 
			
		||||
            var rateLimitOptions = new RateLimitOptionsBuilder()
 | 
			
		||||
                .WithEnableRateLimiting(true)
 | 
			
		||||
                .WithClientIdHeader("test")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var downstreamReRoute = new DownstreamReRouteBuilder()
 | 
			
		||||
                .WithServiceName("auth")
 | 
			
		||||
                .WithRateLimitOptions(rateLimitOptions)
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var reRoute = new ReRouteBuilder()
 | 
			
		||||
                .WithDownstreamReRoute(downstreamReRoute)
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var reRoutes = new List<ReRoute> { reRoute };
 | 
			
		||||
 | 
			
		||||
            var configuration = new InternalConfiguration(reRoutes, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRouteIsCreated())
 | 
			
		||||
                .And(_ => WithRateLimitOptions(rateLimitOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_cache_downstream_route()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, "/geoffisthebest/"))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .And(_ => GivenTheConfiguration(configuration, "/geoffisthebest/"))
 | 
			
		||||
                .When(_ => WhenICreateAgain())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRoutesAreTheSameReference())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_not_cache_downstream_route()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, "/geoffistheworst/"))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .And(_ => GivenTheConfiguration(configuration, "/geoffisthebest/"))
 | 
			
		||||
                .When(_ => WhenICreateAgain())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRoutesAreTheNotSameReference())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_no_path()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth/";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamPathIsForwardSlash())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_only_first_segment_no_traling_slash()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamPathIsForwardSlash())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_segments_no_traling_slash()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth/test";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenThePathDoesNotHaveTrailingSlash())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_and_remove_query_string()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth/test?test=1&best=2";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheQueryStringIsRemoved())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_for_sticky_sessions()
 | 
			
		||||
        {
 | 
			
		||||
            var loadBalancerOptions = new LoadBalancerOptionsBuilder().WithType(nameof(CookieStickySessions)).WithKey("boom").WithExpiryInMs(1).Build();
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheStickySessionLoadBalancerIsUsed(loadBalancerOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_qos()
 | 
			
		||||
        {
 | 
			
		||||
            var qoSOptions = new QoSOptionsBuilder()
 | 
			
		||||
                .WithExceptionsAllowedBeforeBreaking(1)
 | 
			
		||||
                .WithTimeoutValue(1)
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .And(_ => GivenTheQosCreatorReturns(qoSOptions))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheQosOptionsAreSet(qoSOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_handler_options()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheHandlerOptionsAreSet())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheQosCreatorReturns(QoSOptions options)
 | 
			
		||||
        {
 | 
			
		||||
            _qosOptionsCreator
 | 
			
		||||
                .Setup(x => x.Create(It.IsAny<QoSOptions>(), It.IsAny<string>(), It.IsAny<List<string>>()))
 | 
			
		||||
                .Returns(options);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WithRateLimitOptions(RateLimitOptions expected)
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].EnableEndpointEndpointRateLimiting.ShouldBeTrue();
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].RateLimitOptions.EnableRateLimiting.ShouldBe(expected.EnableRateLimiting);
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].RateLimitOptions.ClientIdHeader.ShouldBe(expected.ClientIdHeader);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamRouteIsCreated()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].DownstreamPathTemplate.Value.ShouldBe("/test");
 | 
			
		||||
            _result.Data.ReRoute.UpstreamHttpMethod[0].ShouldBe(HttpMethod.Get);
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerKey.ShouldBe("/auth/test|GET");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].UseServiceDiscovery.ShouldBeTrue();
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].HttpHandlerOptions.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].QosOptions.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].DownstreamScheme.ShouldBe("http");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerOptions.Type.ShouldBe(nameof(NoLoadBalancer));
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].HttpHandlerOptions.ShouldBe(_handlerOptions);
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].QosOptions.ShouldBe(_qoSOptions);
 | 
			
		||||
            _result.Data.ReRoute.UpstreamTemplatePattern.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].UpstreamPathTemplate.ShouldNotBeNull();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamPathIsForwardSlash()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].DownstreamPathTemplate.Value.ShouldBe("/");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerKey.ShouldBe("/auth/|GET");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenThePathDoesNotHaveTrailingSlash()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].DownstreamPathTemplate.Value.ShouldBe("/test");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerKey.ShouldBe("/auth/test|GET");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheQueryStringIsRemoved()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].DownstreamPathTemplate.Value.ShouldBe("/test");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerKey.ShouldBe("/auth/test|GET");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheStickySessionLoadBalancerIsUsed(LoadBalancerOptions expected)
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerKey.ShouldBe($"{nameof(CookieStickySessions)}:boom");
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerOptions.Type.ShouldBe(nameof(CookieStickySessions));
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].LoadBalancerOptions.ShouldBe(expected);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheQosOptionsAreSet(QoSOptions expected)
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].QosOptions.ShouldBe(expected);
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].QosOptions.UseQos.ShouldBeTrue();
 | 
			
		||||
            _qosOptionsCreator
 | 
			
		||||
                .Verify(x => x.Create(expected, _upstreamUrlPath, It.IsAny<List<string>>()), Times.Once);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheConfiguration(IInternalConfiguration config)
 | 
			
		||||
        {
 | 
			
		||||
            _upstreamHost = "doesnt matter";
 | 
			
		||||
            _upstreamUrlPath = "/auth/test";
 | 
			
		||||
            _upstreamHttpMethod = "GET";
 | 
			
		||||
            _configuration = config;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheConfiguration(IInternalConfiguration config, string upstreamUrlPath)
 | 
			
		||||
        {
 | 
			
		||||
            _upstreamHost = "doesnt matter";
 | 
			
		||||
            _upstreamUrlPath = upstreamUrlPath;
 | 
			
		||||
            _upstreamHttpMethod = "GET";
 | 
			
		||||
            _configuration = config;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheHandlerOptionsAreSet()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.ReRoute.DownstreamReRoute[0].HttpHandlerOptions.ShouldBe(_handlerOptions);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenICreate()
 | 
			
		||||
        {
 | 
			
		||||
            _result = _creator.Get(_upstreamUrlPath, _upstreamQuery, _upstreamHttpMethod, _configuration, _upstreamHost);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenICreateAgain()
 | 
			
		||||
        {
 | 
			
		||||
            _resultTwo = _creator.Get(_upstreamUrlPath, _upstreamQuery, _upstreamHttpMethod, _configuration, _upstreamHost);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamRoutesAreTheSameReference()
 | 
			
		||||
        {
 | 
			
		||||
            _result.ShouldBe(_resultTwo);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamRoutesAreTheNotSameReference()
 | 
			
		||||
        {
 | 
			
		||||
            _result.ShouldNotBe(_resultTwo);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
namespace Ocelot.UnitTests.DownstreamRouteFinder
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using Moq;
 | 
			
		||||
    using Ocelot.Configuration;
 | 
			
		||||
    using Ocelot.Configuration.Builder;
 | 
			
		||||
    using Ocelot.Configuration.Creator;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder.Finder;
 | 
			
		||||
    using Ocelot.LoadBalancer.LoadBalancers;
 | 
			
		||||
    using Responses;
 | 
			
		||||
    using Shouldly;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
    using System.Net.Http;
 | 
			
		||||
    using TestStack.BDDfy;
 | 
			
		||||
    using Xunit;
 | 
			
		||||
 | 
			
		||||
    public class DownstreamRouteCreatorTests
 | 
			
		||||
    {
 | 
			
		||||
        private readonly DownstreamRouteCreator _creator;
 | 
			
		||||
        private readonly QoSOptions _qoSOptions;
 | 
			
		||||
        private readonly HttpHandlerOptions _handlerOptions;
 | 
			
		||||
        private readonly LoadBalancerOptions _loadBalancerOptions;
 | 
			
		||||
        private Response<Ocelot.DownstreamRouteFinder.DownstreamRouteHolder> _result;
 | 
			
		||||
        private string _upstreamHost;
 | 
			
		||||
        private string _upstreamUrlPath;
 | 
			
		||||
        private string _upstreamHttpMethod;
 | 
			
		||||
        private IInternalConfiguration _configuration;
 | 
			
		||||
        private Mock<IQoSOptionsCreator> _qosOptionsCreator;
 | 
			
		||||
        private Response<Ocelot.DownstreamRouteFinder.DownstreamRouteHolder> _resultTwo;
 | 
			
		||||
        private string _upstreamQuery;
 | 
			
		||||
 | 
			
		||||
        public DownstreamRouteCreatorTests()
 | 
			
		||||
        {
 | 
			
		||||
            _qosOptionsCreator = new Mock<IQoSOptionsCreator>();
 | 
			
		||||
            _qoSOptions = new QoSOptionsBuilder().Build();
 | 
			
		||||
            _handlerOptions = new HttpHandlerOptionsBuilder().Build();
 | 
			
		||||
            _loadBalancerOptions = new LoadBalancerOptionsBuilder().WithType(nameof(NoLoadBalancer)).Build();
 | 
			
		||||
            _qosOptionsCreator
 | 
			
		||||
                .Setup(x => x.Create(It.IsAny<QoSOptions>(), It.IsAny<string>(), It.IsAny<List<string>>()))
 | 
			
		||||
                .Returns(_qoSOptions);
 | 
			
		||||
            _creator = new DownstreamRouteCreator(_qosOptionsCreator.Object);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRouteIsCreated())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_rate_limit_options()
 | 
			
		||||
        {
 | 
			
		||||
            var rateLimitOptions = new RateLimitOptionsBuilder()
 | 
			
		||||
                .WithEnableRateLimiting(true)
 | 
			
		||||
                .WithClientIdHeader("test")
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var downstreamRoute = new DownstreamRouteBuilder()
 | 
			
		||||
                .WithServiceName("auth")
 | 
			
		||||
                .WithRateLimitOptions(rateLimitOptions)
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var route = new RouteBuilder()
 | 
			
		||||
                .WithDownstreamRoute(downstreamRoute)
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var routes = new List<Route> { route };
 | 
			
		||||
 | 
			
		||||
            var configuration = new InternalConfiguration(routes, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRouteIsCreated())
 | 
			
		||||
                .And(_ => WithRateLimitOptions(rateLimitOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_cache_downstream_route()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, "/geoffisthebest/"))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .And(_ => GivenTheConfiguration(configuration, "/geoffisthebest/"))
 | 
			
		||||
                .When(_ => WhenICreateAgain())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRoutesAreTheSameReference())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_not_cache_downstream_route()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, "/geoffistheworst/"))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .And(_ => GivenTheConfiguration(configuration, "/geoffisthebest/"))
 | 
			
		||||
                .When(_ => WhenICreateAgain())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamRoutesAreTheNotSameReference())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_no_path()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth/";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamPathIsForwardSlash())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_only_first_segment_no_traling_slash()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheDownstreamPathIsForwardSlash())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_segments_no_traling_slash()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth/test";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenThePathDoesNotHaveTrailingSlash())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_and_remove_query_string()
 | 
			
		||||
        {
 | 
			
		||||
            var upstreamUrlPath = "/auth/test?test=1&best=2";
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration, upstreamUrlPath))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheQueryStringIsRemoved())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_for_sticky_sessions()
 | 
			
		||||
        {
 | 
			
		||||
            var loadBalancerOptions = new LoadBalancerOptionsBuilder().WithType(nameof(CookieStickySessions)).WithKey("boom").WithExpiryInMs(1).Build();
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheStickySessionLoadBalancerIsUsed(loadBalancerOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_qos()
 | 
			
		||||
        {
 | 
			
		||||
            var qoSOptions = new QoSOptionsBuilder()
 | 
			
		||||
                .WithExceptionsAllowedBeforeBreaking(1)
 | 
			
		||||
                .WithTimeoutValue(1)
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .And(_ => GivenTheQosCreatorReturns(qoSOptions))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheQosOptionsAreSet(qoSOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_downstream_route_with_handler_options()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new InternalConfiguration(null, "doesnt matter", null, "doesnt matter", _loadBalancerOptions, "http", _qoSOptions, _handlerOptions, new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheConfiguration(configuration))
 | 
			
		||||
                .When(_ => WhenICreate())
 | 
			
		||||
                .Then(_ => ThenTheHandlerOptionsAreSet())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheQosCreatorReturns(QoSOptions options)
 | 
			
		||||
        {
 | 
			
		||||
            _qosOptionsCreator
 | 
			
		||||
                .Setup(x => x.Create(It.IsAny<QoSOptions>(), It.IsAny<string>(), It.IsAny<List<string>>()))
 | 
			
		||||
                .Returns(options);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WithRateLimitOptions(RateLimitOptions expected)
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].EnableEndpointEndpointRateLimiting.ShouldBeTrue();
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].RateLimitOptions.EnableRateLimiting.ShouldBe(expected.EnableRateLimiting);
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].RateLimitOptions.ClientIdHeader.ShouldBe(expected.ClientIdHeader);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamRouteIsCreated()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].DownstreamPathTemplate.Value.ShouldBe("/test");
 | 
			
		||||
            _result.Data.Route.UpstreamHttpMethod[0].ShouldBe(HttpMethod.Get);
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerKey.ShouldBe("/auth/test|GET");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].UseServiceDiscovery.ShouldBeTrue();
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].HttpHandlerOptions.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].QosOptions.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].DownstreamScheme.ShouldBe("http");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerOptions.Type.ShouldBe(nameof(Ocelot.LoadBalancer.LoadBalancers.NoLoadBalancer));
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].HttpHandlerOptions.ShouldBe(_handlerOptions);
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].QosOptions.ShouldBe(_qoSOptions);
 | 
			
		||||
            _result.Data.Route.UpstreamTemplatePattern.ShouldNotBeNull();
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].UpstreamPathTemplate.ShouldNotBeNull();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamPathIsForwardSlash()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].DownstreamPathTemplate.Value.ShouldBe("/");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerKey.ShouldBe("/auth/|GET");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenThePathDoesNotHaveTrailingSlash()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].DownstreamPathTemplate.Value.ShouldBe("/test");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerKey.ShouldBe("/auth/test|GET");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheQueryStringIsRemoved()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].DownstreamPathTemplate.Value.ShouldBe("/test");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].ServiceName.ShouldBe("auth");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerKey.ShouldBe("/auth/test|GET");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheStickySessionLoadBalancerIsUsed(LoadBalancerOptions expected)
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerKey.ShouldBe($"{nameof(Ocelot.LoadBalancer.LoadBalancers.CookieStickySessions)}:boom");
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerOptions.Type.ShouldBe(nameof(Ocelot.LoadBalancer.LoadBalancers.CookieStickySessions));
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].LoadBalancerOptions.ShouldBe(expected);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheQosOptionsAreSet(QoSOptions expected)
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].QosOptions.ShouldBe(expected);
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].QosOptions.UseQos.ShouldBeTrue();
 | 
			
		||||
            _qosOptionsCreator
 | 
			
		||||
                .Verify(x => x.Create(expected, _upstreamUrlPath, It.IsAny<List<string>>()), Times.Once);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheConfiguration(IInternalConfiguration config)
 | 
			
		||||
        {
 | 
			
		||||
            _upstreamHost = "doesnt matter";
 | 
			
		||||
            _upstreamUrlPath = "/auth/test";
 | 
			
		||||
            _upstreamHttpMethod = "GET";
 | 
			
		||||
            _configuration = config;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheConfiguration(IInternalConfiguration config, string upstreamUrlPath)
 | 
			
		||||
        {
 | 
			
		||||
            _upstreamHost = "doesnt matter";
 | 
			
		||||
            _upstreamUrlPath = upstreamUrlPath;
 | 
			
		||||
            _upstreamHttpMethod = "GET";
 | 
			
		||||
            _configuration = config;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheHandlerOptionsAreSet()
 | 
			
		||||
        {
 | 
			
		||||
            _result.Data.Route.DownstreamRoute[0].HttpHandlerOptions.ShouldBe(_handlerOptions);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenICreate()
 | 
			
		||||
        {
 | 
			
		||||
            _result = _creator.Get(_upstreamUrlPath, _upstreamQuery, _upstreamHttpMethod, _configuration, _upstreamHost);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenICreateAgain()
 | 
			
		||||
        {
 | 
			
		||||
            _resultTwo = _creator.Get(_upstreamUrlPath, _upstreamQuery, _upstreamHttpMethod, _configuration, _upstreamHost);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamRoutesAreTheSameReference()
 | 
			
		||||
        {
 | 
			
		||||
            _result.ShouldBe(_resultTwo);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheDownstreamRoutesAreTheNotSameReference()
 | 
			
		||||
        {
 | 
			
		||||
            _result.ShouldNotBe(_resultTwo);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
    {
 | 
			
		||||
        private readonly Mock<IDownstreamRouteProvider> _finder;
 | 
			
		||||
        private readonly Mock<IDownstreamRouteProviderFactory> _factory;
 | 
			
		||||
        private Response<DownstreamRoute> _downstreamRoute;
 | 
			
		||||
        private Response<Ocelot.DownstreamRouteFinder.DownstreamRouteHolder> _downstreamRoute;
 | 
			
		||||
        private IInternalConfiguration _config;
 | 
			
		||||
        private Mock<IOcelotLoggerFactory> _loggerFactory;
 | 
			
		||||
        private Mock<IOcelotLogger> _logger;
 | 
			
		||||
@@ -50,16 +50,16 @@
 | 
			
		||||
        {
 | 
			
		||||
            var config = new InternalConfiguration(null, null, new ServiceProviderConfigurationBuilder().Build(), "", new LoadBalancerOptionsBuilder().Build(), "", new QoSOptionsBuilder().Build(), new HttpHandlerOptionsBuilder().Build(), new Version("1.1"));
 | 
			
		||||
 | 
			
		||||
            var downstreamReRoute = new DownstreamReRouteBuilder()
 | 
			
		||||
            var downstreamRoute = new DownstreamRouteBuilder()
 | 
			
		||||
                .WithDownstreamPathTemplate("any old string")
 | 
			
		||||
                .WithUpstreamHttpMethod(new List<string> { "Get" })
 | 
			
		||||
                .Build();
 | 
			
		||||
 | 
			
		||||
            this.Given(x => x.GivenTheDownStreamRouteFinderReturns(
 | 
			
		||||
                new DownstreamRoute(
 | 
			
		||||
                new DownstreamRouteHolder(
 | 
			
		||||
                    new List<PlaceholderNameAndValue>(),
 | 
			
		||||
                    new ReRouteBuilder()
 | 
			
		||||
                        .WithDownstreamReRoute(downstreamReRoute)
 | 
			
		||||
                    new RouteBuilder()
 | 
			
		||||
                        .WithDownstreamRoute(downstreamRoute)
 | 
			
		||||
                        .WithUpstreamHttpMethod(new List<string> { "Get" })
 | 
			
		||||
                        .Build())))
 | 
			
		||||
                .And(x => GivenTheFollowingConfig(config))
 | 
			
		||||
@@ -79,9 +79,9 @@
 | 
			
		||||
            _httpContext.Items.SetIInternalConfiguration(config);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheDownStreamRouteFinderReturns(DownstreamRoute downstreamRoute)
 | 
			
		||||
        private void GivenTheDownStreamRouteFinderReturns(Ocelot.DownstreamRouteFinder.DownstreamRouteHolder downstreamRoute)
 | 
			
		||||
        {
 | 
			
		||||
            _downstreamRoute = new OkResponse<DownstreamRoute>(downstreamRoute);
 | 
			
		||||
            _downstreamRoute = new OkResponse<Ocelot.DownstreamRouteFinder.DownstreamRouteHolder>(downstreamRoute);
 | 
			
		||||
            _finder
 | 
			
		||||
                .Setup(x => x.Get(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IInternalConfiguration>(), It.IsAny<string>()))
 | 
			
		||||
                .Returns(_downstreamRoute);
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,164 +1,164 @@
 | 
			
		||||
namespace Ocelot.UnitTests.DownstreamRouteFinder
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
    using Moq;
 | 
			
		||||
    using Ocelot.Configuration;
 | 
			
		||||
    using Ocelot.Configuration.Builder;
 | 
			
		||||
    using Ocelot.Configuration.Creator;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder.Finder;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder.UrlMatcher;
 | 
			
		||||
    using Ocelot.Logging;
 | 
			
		||||
    using Shouldly;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
    using TestStack.BDDfy;
 | 
			
		||||
    using Xunit;
 | 
			
		||||
 | 
			
		||||
    public class DownstreamRouteProviderFactoryTests
 | 
			
		||||
    {
 | 
			
		||||
        private readonly DownstreamRouteProviderFactory _factory;
 | 
			
		||||
        private IInternalConfiguration _config;
 | 
			
		||||
        private IDownstreamRouteProvider _result;
 | 
			
		||||
        private Mock<IOcelotLogger> _logger;
 | 
			
		||||
        private Mock<IOcelotLoggerFactory> _loggerFactory;
 | 
			
		||||
 | 
			
		||||
        public DownstreamRouteProviderFactoryTests()
 | 
			
		||||
        {
 | 
			
		||||
            var services = new ServiceCollection();
 | 
			
		||||
            services.AddSingleton<IPlaceholderNameAndValueFinder, UrlPathPlaceholderNameAndValueFinder>();
 | 
			
		||||
            services.AddSingleton<IUrlPathToUrlTemplateMatcher, RegExUrlMatcher>();
 | 
			
		||||
            services.AddSingleton<IQoSOptionsCreator, QoSOptionsCreator>();
 | 
			
		||||
            services.AddSingleton<IDownstreamRouteProvider, DownstreamRouteFinder>();
 | 
			
		||||
            services.AddSingleton<IDownstreamRouteProvider, DownstreamRouteCreator>();
 | 
			
		||||
            var provider = services.BuildServiceProvider();
 | 
			
		||||
            _logger = new Mock<IOcelotLogger>();
 | 
			
		||||
            _loggerFactory = new Mock<IOcelotLoggerFactory>();
 | 
			
		||||
            _loggerFactory.Setup(x => x.CreateLogger<DownstreamRouteProviderFactory>()).Returns(_logger.Object);
 | 
			
		||||
            _factory = new DownstreamRouteProviderFactory(provider, _loggerFactory.Object);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder()
 | 
			
		||||
        {
 | 
			
		||||
            var reRoutes = new List<ReRoute>
 | 
			
		||||
            {
 | 
			
		||||
                new ReRouteBuilder().Build()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_when_not_dynamic_re_route_and_service_discovery_on()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("test").WithPort(50).WithType("test").Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>
 | 
			
		||||
            {
 | 
			
		||||
                new ReRouteBuilder().WithUpstreamPathTemplate(new UpstreamPathTemplateBuilder().WithOriginalValue("woot").Build()).Build()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_as_no_service_discovery_given_no_scheme()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("").WithHost("test").WithPort(50).Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_as_no_service_discovery_given_no_host()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("").WithPort(50).Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_given_no_service_discovery_port()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("localhost").WithPort(0).Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_given_no_service_discovery_type()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("localhost").WithPort(50).WithType("").Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_creator()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("test").WithPort(50).WithType("test").Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteCreator>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_creator_with_dynamic_re_route()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("test").WithPort(50).WithType("test").Build();
 | 
			
		||||
            var reRoutes = new List<ReRoute>
 | 
			
		||||
            {
 | 
			
		||||
                new ReRouteBuilder().Build()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheReRoutes(reRoutes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteCreator>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheResultShouldBe<T>()
 | 
			
		||||
        {
 | 
			
		||||
            _result.ShouldBeOfType<T>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenIGet()
 | 
			
		||||
        {
 | 
			
		||||
            _result = _factory.Get(_config);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheReRoutes(List<ReRoute> reRoutes)
 | 
			
		||||
        {
 | 
			
		||||
            _config = new InternalConfiguration(reRoutes, "", null, "", new LoadBalancerOptionsBuilder().Build(), "", new QoSOptionsBuilder().Build(), new HttpHandlerOptionsBuilder().Build(), new Version("1.1"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheReRoutes(List<ReRoute> reRoutes, ServiceProviderConfiguration config)
 | 
			
		||||
        {
 | 
			
		||||
            _config = new InternalConfiguration(reRoutes, "", config, "", new LoadBalancerOptionsBuilder().Build(), "", new QoSOptionsBuilder().Build(), new HttpHandlerOptionsBuilder().Build(), new Version("1.1"));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
namespace Ocelot.UnitTests.DownstreamRouteFinder
 | 
			
		||||
{
 | 
			
		||||
    using System;
 | 
			
		||||
    using Microsoft.Extensions.DependencyInjection;
 | 
			
		||||
    using Moq;
 | 
			
		||||
    using Ocelot.Configuration;
 | 
			
		||||
    using Ocelot.Configuration.Builder;
 | 
			
		||||
    using Ocelot.Configuration.Creator;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder.Finder;
 | 
			
		||||
    using Ocelot.DownstreamRouteFinder.UrlMatcher;
 | 
			
		||||
    using Ocelot.Logging;
 | 
			
		||||
    using Shouldly;
 | 
			
		||||
    using System.Collections.Generic;
 | 
			
		||||
    using TestStack.BDDfy;
 | 
			
		||||
    using Xunit;
 | 
			
		||||
 | 
			
		||||
    public class DownstreamRouteProviderFactoryTests
 | 
			
		||||
    {
 | 
			
		||||
        private readonly DownstreamRouteProviderFactory _factory;
 | 
			
		||||
        private IInternalConfiguration _config;
 | 
			
		||||
        private IDownstreamRouteProvider _result;
 | 
			
		||||
        private Mock<IOcelotLogger> _logger;
 | 
			
		||||
        private Mock<IOcelotLoggerFactory> _loggerFactory;
 | 
			
		||||
 | 
			
		||||
        public DownstreamRouteProviderFactoryTests()
 | 
			
		||||
        {
 | 
			
		||||
            var services = new ServiceCollection();
 | 
			
		||||
            services.AddSingleton<IPlaceholderNameAndValueFinder, UrlPathPlaceholderNameAndValueFinder>();
 | 
			
		||||
            services.AddSingleton<IUrlPathToUrlTemplateMatcher, RegExUrlMatcher>();
 | 
			
		||||
            services.AddSingleton<IQoSOptionsCreator, QoSOptionsCreator>();
 | 
			
		||||
            services.AddSingleton<IDownstreamRouteProvider, DownstreamRouteFinder>();
 | 
			
		||||
            services.AddSingleton<IDownstreamRouteProvider, DownstreamRouteCreator>();
 | 
			
		||||
            var provider = services.BuildServiceProvider();
 | 
			
		||||
            _logger = new Mock<IOcelotLogger>();
 | 
			
		||||
            _loggerFactory = new Mock<IOcelotLoggerFactory>();
 | 
			
		||||
            _loggerFactory.Setup(x => x.CreateLogger<DownstreamRouteProviderFactory>()).Returns(_logger.Object);
 | 
			
		||||
            _factory = new DownstreamRouteProviderFactory(provider, _loggerFactory.Object);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder()
 | 
			
		||||
        {
 | 
			
		||||
            var routes = new List<Route>
 | 
			
		||||
            {
 | 
			
		||||
                new RouteBuilder().Build()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_when_not_dynamic_re_route_and_service_discovery_on()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("test").WithPort(50).WithType("test").Build();
 | 
			
		||||
            var routes = new List<Route>
 | 
			
		||||
            {
 | 
			
		||||
                new RouteBuilder().WithUpstreamPathTemplate(new UpstreamPathTemplateBuilder().WithOriginalValue("woot").Build()).Build()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_as_no_service_discovery_given_no_scheme()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("").WithHost("test").WithPort(50).Build();
 | 
			
		||||
            var routes = new List<Route>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_as_no_service_discovery_given_no_host()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("").WithPort(50).Build();
 | 
			
		||||
            var routes = new List<Route>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_given_no_service_discovery_port()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("localhost").WithPort(0).Build();
 | 
			
		||||
            var routes = new List<Route>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_finder_given_no_service_discovery_type()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("localhost").WithPort(50).WithType("").Build();
 | 
			
		||||
            var routes = new List<Route>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteFinder>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_creator()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("test").WithPort(50).WithType("test").Build();
 | 
			
		||||
            var routes = new List<Route>();
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteCreator>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_downstream_route_creator_with_dynamic_re_route()
 | 
			
		||||
        {
 | 
			
		||||
            var spConfig = new ServiceProviderConfigurationBuilder().WithScheme("http").WithHost("test").WithPort(50).WithType("test").Build();
 | 
			
		||||
            var routes = new List<Route>
 | 
			
		||||
            {
 | 
			
		||||
                new RouteBuilder().Build()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(_ => GivenTheRoutes(routes, spConfig))
 | 
			
		||||
                .When(_ => WhenIGet())
 | 
			
		||||
                .Then(_ => ThenTheResultShouldBe<DownstreamRouteCreator>())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheResultShouldBe<T>()
 | 
			
		||||
        {
 | 
			
		||||
            _result.ShouldBeOfType<T>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenIGet()
 | 
			
		||||
        {
 | 
			
		||||
            _result = _factory.Get(_config);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheRoutes(List<Route> routes)
 | 
			
		||||
        {
 | 
			
		||||
            _config = new InternalConfiguration(routes, "", null, "", new LoadBalancerOptionsBuilder().Build(), "", new QoSOptionsBuilder().Build(), new HttpHandlerOptionsBuilder().Build(), new Version("1.1"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenTheRoutes(List<Route> routes, ServiceProviderConfiguration config)
 | 
			
		||||
        {
 | 
			
		||||
            _config = new InternalConfiguration(routes, "", config, "", new LoadBalancerOptionsBuilder().Build(), "", new QoSOptionsBuilder().Build(), new HttpHandlerOptionsBuilder().Build(), new Version("1.1"));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user