namespace Ocelot.UnitTests.Request { using System.Collections.Generic; using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Moq; using Ocelot.Configuration.Builder; using Ocelot.DownstreamRouteFinder; using Ocelot.DownstreamRouteFinder.UrlMatcher; using Ocelot.Infrastructure.RequestData; using Ocelot.Logging; using Ocelot.Request.Builder; using Ocelot.Request.Middleware; using Ocelot.Responses; using TestStack.BDDfy; using Xunit; using Ocelot.Requester.QoS; using Ocelot.Configuration; using Microsoft.AspNetCore.Builder; public class HttpRequestBuilderMiddlewareTests : ServerHostedMiddlewareTest { private readonly Mock _requestBuilder; private readonly Mock _scopedRepository; private readonly Mock _qosProviderHouse; private readonly HttpRequestMessage _downstreamRequest; private OkResponse _request; private OkResponse _downstreamUrl; private OkResponse _downstreamRoute; public HttpRequestBuilderMiddlewareTests() { _qosProviderHouse = new Mock(); _requestBuilder = new Mock(); _scopedRepository = new Mock(); _downstreamRequest = new HttpRequestMessage(); _scopedRepository .Setup(sr => sr.Get("DownstreamRequest")) .Returns(new OkResponse(_downstreamRequest)); GivenTheTestServerIsConfigured(); } [Fact] public void should_call_scoped_data_repository_correctly() { var downstreamRoute = new DownstreamRoute(new List(), new ReRouteBuilder() .WithRequestIdKey("LSRequestId") .WithUpstreamHttpMethod(new List { "Get" }) .WithHttpHandlerOptions(new HttpHandlerOptions(true, true)) .Build()); this.Given(x => x.GivenTheDownStreamUrlIs("any old string")) .And(x => x.GivenTheQosProviderHouseReturns(new OkResponse(new NoQoSProvider()))) .And(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) .And(x => x.GivenTheRequestBuilderReturns(new Ocelot.Request.Request(new HttpRequestMessage(), true, new NoQoSProvider(), false, false))) .When(x => x.WhenICallTheMiddleware()) .Then(x => x.ThenTheScopedDataRepositoryIsCalledCorrectly()) .BDDfy(); } protected override void GivenTheTestServerServicesAreConfigured(IServiceCollection services) { services.AddSingleton(); services.AddLogging(); services.AddSingleton(_qosProviderHouse.Object); services.AddSingleton(_requestBuilder.Object); services.AddSingleton(_scopedRepository.Object); } protected override void GivenTheTestServerPipelineIsConfigured(IApplicationBuilder app) { app.UseHttpRequestBuilderMiddleware(); } private void GivenTheDownStreamUrlIs(string downstreamUrl) { _downstreamUrl = new OkResponse(downstreamUrl); _scopedRepository .Setup(x => x.Get(It.IsAny())) .Returns(_downstreamUrl); } private void GivenTheQosProviderHouseReturns(Response qosProvider) { _qosProviderHouse .Setup(x => x.Get(It.IsAny())) .Returns(qosProvider); } private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) { _downstreamRoute = new OkResponse(downstreamRoute); _scopedRepository .Setup(x => x.Get(It.IsAny())) .Returns(_downstreamRoute); } private void GivenTheRequestBuilderReturns(Ocelot.Request.Request request) { _request = new OkResponse(request); _requestBuilder .Setup(x => x.Build(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(_request); } private void ThenTheScopedDataRepositoryIsCalledCorrectly() { _scopedRepository .Verify(x => x.Add("Request", _request.Data), Times.Once()); } } }