namespace Ocelot.UnitTests.Requester { using Microsoft.AspNetCore.Http; using System.Net.Http; using Moq; using Ocelot.Logging; using Ocelot.Requester; using Ocelot.Requester.Middleware; using Ocelot.Responses; using TestStack.BDDfy; using Xunit; using Shouldly; using System.Threading.Tasks; using Ocelot.Configuration.Builder; using Ocelot.Middleware; using System; using System.Linq; using Ocelot.UnitTests.Responder; public class HttpRequesterMiddlewareTests { private readonly Mock _requester; private Response _response; private Mock _loggerFactory; private Mock _logger; private readonly HttpRequesterMiddleware _middleware; private DownstreamContext _downstreamContext; private OcelotRequestDelegate _next; public HttpRequesterMiddlewareTests() { _requester = new Mock(); _loggerFactory = new Mock(); _logger = new Mock(); _loggerFactory.Setup(x => x.CreateLogger()).Returns(_logger.Object); _next = context => Task.CompletedTask; _middleware = new HttpRequesterMiddleware(_next, _loggerFactory.Object, _requester.Object); } [Fact] public void should_call_services_correctly() { this.Given(x => x.GivenTheRequestIs()) .And(x => x.GivenTheRequesterReturns(new OkResponse(new HttpResponseMessage()))) .When(x => x.WhenICallTheMiddleware()) .Then(x => x.ThenTheDownstreamResponseIsSet()) .BDDfy(); } [Fact] public void should_set_error() { this.Given(x => x.GivenTheRequestIs()) .And(x => x.GivenTheRequesterReturns(new ErrorResponse(new AnyError()))) .When(x => x.WhenICallTheMiddleware()) .Then(x => x.ThenTheErrorIsSet()) .BDDfy(); } private void ThenTheErrorIsSet() { _downstreamContext.IsError.ShouldBeTrue(); } private void WhenICallTheMiddleware() { _middleware.Invoke(_downstreamContext).GetAwaiter().GetResult(); } private void GivenTheRequestIs() { _downstreamContext = new DownstreamContext(new DefaultHttpContext()) { DownstreamReRoute = new DownstreamReRouteBuilder().Build() }; } private void GivenTheRequesterReturns(Response response) { _response = response; _requester .Setup(x => x.GetResponse(It.IsAny())) .ReturnsAsync(_response); } private void ThenTheDownstreamResponseIsSet() { foreach (var httpResponseHeader in _response.Data.Headers) { if (_downstreamContext.DownstreamResponse.Headers.Any(x => x.Key == httpResponseHeader.Key)) { throw new Exception("Header in response not in downstreamresponse headers"); } } _downstreamContext.DownstreamResponse.Content.ShouldBe(_response.Data.Content); _downstreamContext.DownstreamResponse.StatusCode.ShouldBe(_response.Data.StatusCode); } } }