namespace Ocelot.UnitTests.Headers { using Xunit; using Ocelot.Logging; using Ocelot.Headers.Middleware; using TestStack.BDDfy; using Microsoft.AspNetCore.Http; using System.Collections.Generic; using Moq; using Ocelot.Configuration; using Ocelot.DownstreamRouteFinder; using Ocelot.Configuration.Builder; using Ocelot.Headers; using System.Net.Http; using Ocelot.Authorisation.Middleware; using Ocelot.Middleware; using Ocelot.Middleware.Multiplexer; using System.Threading.Tasks; using Ocelot.Request.Middleware; public class HttpHeadersTransformationMiddlewareTests { private readonly Mock _preReplacer; private readonly Mock _postReplacer; private Mock _loggerFactory; private Mock _logger; private readonly HttpHeadersTransformationMiddleware _middleware; private readonly DownstreamContext _downstreamContext; private OcelotRequestDelegate _next; private readonly Mock _addHeadersToResponse; private readonly Mock _addHeadersToRequest; public HttpHeadersTransformationMiddlewareTests() { _preReplacer = new Mock(); _postReplacer = new Mock(); _downstreamContext = new DownstreamContext(new DefaultHttpContext()); _loggerFactory = new Mock(); _logger = new Mock(); _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); _next = context => Task.CompletedTask; _addHeadersToResponse = new Mock(); _addHeadersToRequest = new Mock(); _middleware = new HttpHeadersTransformationMiddleware( _next, _loggerFactory.Object, _preReplacer.Object, _postReplacer.Object, _addHeadersToResponse.Object, _addHeadersToRequest.Object); } [Fact] public void should_call_pre_and_post_header_transforms() { this.Given(x => GivenTheFollowingRequest()) .And(x => GivenTheDownstreamRequestIs()) .And(x => GivenTheReRouteHasPreFindAndReplaceSetUp()) .And(x => GivenTheHttpResponseMessageIs()) .When(x => WhenICallTheMiddleware()) .Then(x => ThenTheIHttpContextRequestHeaderReplacerIsCalledCorrectly()) .Then(x => ThenAddHeadersToRequestIsCalledCorrectly()) .And(x => ThenTheIHttpResponseHeaderReplacerIsCalledCorrectly()) .And(x => ThenAddHeadersToResponseIsCalledCorrectly()) .BDDfy(); } private void ThenAddHeadersToResponseIsCalledCorrectly() { _addHeadersToResponse .Verify(x => x.Add(_downstreamContext.DownstreamReRoute.AddHeadersToDownstream, _downstreamContext.DownstreamResponse), Times.Once); } private void ThenAddHeadersToRequestIsCalledCorrectly() { _addHeadersToRequest .Verify(x => x.SetHeadersOnDownstreamRequest(_downstreamContext.DownstreamReRoute.AddHeadersToUpstream, _downstreamContext.HttpContext), Times.Once); } private void WhenICallTheMiddleware() { _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); } private void GivenTheDownstreamRequestIs() { _downstreamContext.DownstreamRequest = new DownstreamRequest(new HttpRequestMessage(HttpMethod.Get, "http://test.com")); } private void GivenTheHttpResponseMessageIs() { _downstreamContext.DownstreamResponse = new DownstreamResponse(new HttpResponseMessage()); } private void GivenTheReRouteHasPreFindAndReplaceSetUp() { var fAndRs = new List(); var reRoute = new ReRouteBuilder() .WithDownstreamReRoute(new DownstreamReRouteBuilder().WithUpstreamHeaderFindAndReplace(fAndRs) .WithDownstreamHeaderFindAndReplace(fAndRs).Build()) .Build(); var dR = new DownstreamRoute(null, reRoute); _downstreamContext.TemplatePlaceholderNameAndValues = dR.TemplatePlaceholderNameAndValues; _downstreamContext.DownstreamReRoute = dR.ReRoute.DownstreamReRoute[0]; } private void ThenTheIHttpContextRequestHeaderReplacerIsCalledCorrectly() { _preReplacer.Verify(x => x.Replace(It.IsAny(), It.IsAny>()), Times.Once); } private void ThenTheIHttpResponseHeaderReplacerIsCalledCorrectly() { _postReplacer.Verify(x => x.Replace(It.IsAny(), It.IsAny>()), Times.Once); } private void GivenTheFollowingRequest() { _downstreamContext.HttpContext.Request.Headers.Add("test", "test"); } } }