Get rest of unit tests working

This commit is contained in:
Philip Wood 2017-04-18 15:16:27 +01:00
parent 7c1a277147
commit a1c6ab4ce4
7 changed files with 75 additions and 116 deletions

View File

@ -43,20 +43,6 @@ namespace Ocelot.DownstreamUrlCreator.Middleware
return; return;
} }
//var dsScheme = DownstreamRoute.ReRoute.DownstreamScheme;
//var dsHostAndPort = HostAndPort;
//var dsUrl = _urlBuilder.Build(dsPath.Data.Value, dsScheme, dsHostAndPort);
//if (dsUrl.IsError)
//{
// _logger.LogDebug("IUrlBuilder returned an error, setting pipeline error");
// SetPipelineError(dsUrl.Errors);
// return;
//}
var uriBuilder = new UriBuilder(DownstreamRequest.RequestUri) var uriBuilder = new UriBuilder(DownstreamRequest.RequestUri)
{ {
Path = dsPath.Data.Value, Path = dsPath.Data.Value,
@ -67,8 +53,6 @@ namespace Ocelot.DownstreamUrlCreator.Middleware
_logger.LogDebug("downstream url is {downstreamUrl.Data.Value}", DownstreamRequest.RequestUri); _logger.LogDebug("downstream url is {downstreamUrl.Data.Value}", DownstreamRequest.RequestUri);
//SetDownstreamUrlForThisRequest(dsUrl.Data.Value);
_logger.LogDebug("calling next middleware"); _logger.LogDebug("calling next middleware");
await _next.Invoke(context); await _next.Invoke(context);

View File

@ -43,17 +43,6 @@ namespace Ocelot.Request.Middleware
return; return;
} }
//var buildResult = await _requestCreator
// .Build(context.Request.Method,
// DownstreamUrl,
// context.Request.Body,
// context.Request.Headers,
// context.Request.QueryString,
// context.Request.ContentType,
// new RequestId.RequestId(DownstreamRoute?.ReRoute?.RequestIdKey, context.TraceIdentifier),
// DownstreamRoute.ReRoute.IsQos,
// qosProvider.Data);
var buildResult = await _requestCreator.Build( var buildResult = await _requestCreator.Build(
DownstreamRequest, DownstreamRequest,
DownstreamRoute.ReRoute.IsQos, DownstreamRoute.ReRoute.IsQos,

View File

@ -18,6 +18,7 @@ using Ocelot.Responses;
using Ocelot.Values; using Ocelot.Values;
using TestStack.BDDfy; using TestStack.BDDfy;
using Xunit; using Xunit;
using Shouldly;
namespace Ocelot.UnitTests.DownstreamUrlCreator namespace Ocelot.UnitTests.DownstreamUrlCreator
{ {
@ -30,10 +31,9 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator
private readonly TestServer _server; private readonly TestServer _server;
private readonly HttpClient _client; private readonly HttpClient _client;
private Response<DownstreamRoute> _downstreamRoute; private Response<DownstreamRoute> _downstreamRoute;
private HttpResponseMessage _result;
private OkResponse<DownstreamPath> _downstreamPath; private OkResponse<DownstreamPath> _downstreamPath;
private OkResponse<DownstreamUrl> _downstreamUrl; private HttpRequestMessage _downstreamRequest;
private HostAndPort _hostAndPort; private HttpResponseMessage _result;
public DownstreamUrlCreatorMiddlewareTests() public DownstreamUrlCreatorMiddlewareTests()
{ {
@ -60,69 +60,34 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator
app.UseDownstreamUrlCreatorMiddleware(); app.UseDownstreamUrlCreatorMiddleware();
}); });
_downstreamRequest = new HttpRequestMessage(HttpMethod.Get, "https://my.url/abc/?q=123");
_scopedRepository _scopedRepository
.Setup(sr => sr.Get<HttpRequestMessage>("DownstreamRequest")) .Setup(sr => sr.Get<HttpRequestMessage>("DownstreamRequest"))
.Returns(new OkResponse<HttpRequestMessage>(new HttpRequestMessage(HttpMethod.Get, "https://my.url/abc/?q=123"))); .Returns(new OkResponse<HttpRequestMessage>(_downstreamRequest));
_server = new TestServer(builder); _server = new TestServer(builder);
_client = _server.CreateClient(); _client = _server.CreateClient();
} }
[Fact] [Fact]
public void should_call_dependencies_correctly() public void should_replace_scheme_and_path()
{ {
var hostAndPort = new HostAndPort("127.0.0.1", 80);
this.Given(x => x.GivenTheDownStreamRouteIs( this.Given(x => x.GivenTheDownStreamRouteIs(
new DownstreamRoute( new DownstreamRoute(
new List<UrlPathPlaceholderNameAndValue>(), new List<UrlPathPlaceholderNameAndValue>(),
new ReRouteBuilder() new ReRouteBuilder()
.WithDownstreamPathTemplate("any old string") .WithDownstreamPathTemplate("any old string")
.WithUpstreamHttpMethod("Get") .WithUpstreamHttpMethod("Get")
.WithDownstreamScheme("https")
.Build()))) .Build())))
.And(x => x.GivenTheHostAndPortIs(hostAndPort)) .And(x => x.GivenTheDownstreamRequestUriIs("http://my.url/abc?q=123"))
.And(x => x.TheUrlReplacerReturns("/api/products/1")) .And(x => x.GivenTheUrlReplacerWillReturn("/api/products/1"))
.And(x => x.TheUrlBuilderReturns("http://127.0.0.1:80/api/products/1"))
.When(x => x.WhenICallTheMiddleware()) .When(x => x.WhenICallTheMiddleware())
.Then(x => x.ThenTheScopedDataRepositoryIsCalledCorrectly()) .Then(x => x.ThenTheDownstreamRequestUriIs("https://my.url:80/api/products/1?q=123"))
.BDDfy(); .BDDfy();
} }
private void GivenTheHostAndPortIs(HostAndPort hostAndPort)
{
_hostAndPort = hostAndPort;
_scopedRepository
.Setup(x => x.Get<HostAndPort>("HostAndPort"))
.Returns(new OkResponse<HostAndPort>(_hostAndPort));
}
private void TheUrlBuilderReturns(string dsUrl)
{
_downstreamUrl = new OkResponse<DownstreamUrl>(new DownstreamUrl(dsUrl));
_urlBuilder
.Setup(x => x.Build(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<HostAndPort>()))
.Returns(_downstreamUrl);
}
private void TheUrlReplacerReturns(string downstreamUrl)
{
_downstreamPath = new OkResponse<DownstreamPath>(new DownstreamPath(downstreamUrl));
_downstreamUrlTemplateVariableReplacer
.Setup(x => x.Replace(It.IsAny<PathTemplate>(), It.IsAny<List<UrlPathPlaceholderNameAndValue>>()))
.Returns(_downstreamPath);
}
private void ThenTheScopedDataRepositoryIsCalledCorrectly()
{
_scopedRepository
.Verify(x => x.Add("DownstreamUrl", _downstreamUrl.Data.Value), Times.Once());
}
private void WhenICallTheMiddleware()
{
_result = _client.GetAsync(_url).Result;
}
private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute) private void GivenTheDownStreamRouteIs(DownstreamRoute downstreamRoute)
{ {
_downstreamRoute = new OkResponse<DownstreamRoute>(downstreamRoute); _downstreamRoute = new OkResponse<DownstreamRoute>(downstreamRoute);
@ -131,6 +96,29 @@ namespace Ocelot.UnitTests.DownstreamUrlCreator
.Returns(_downstreamRoute); .Returns(_downstreamRoute);
} }
private void GivenTheDownstreamRequestUriIs(string uri)
{
_downstreamRequest.RequestUri = new Uri(uri);
}
private void GivenTheUrlReplacerWillReturn(string path)
{
_downstreamPath = new OkResponse<DownstreamPath>(new DownstreamPath(path));
_downstreamUrlTemplateVariableReplacer
.Setup(x => x.Replace(It.IsAny<PathTemplate>(), It.IsAny<List<UrlPathPlaceholderNameAndValue>>()))
.Returns(_downstreamPath);
}
private void WhenICallTheMiddleware()
{
_result = _client.GetAsync(_url).Result;
}
private void ThenTheDownstreamRequestUriIs(string expectedUri)
{
_downstreamRequest.RequestUri.OriginalString.ShouldBe(expectedUri);
}
public void Dispose() public void Dispose()
{ {
_client.Dispose(); _client.Dispose();

View File

@ -1,7 +1,5 @@
using System; using System;
using Ocelot.Configuration;
using Ocelot.DownstreamUrlCreator; using Ocelot.DownstreamUrlCreator;
using Ocelot.DownstreamUrlCreator.UrlTemplateReplacer;
using Ocelot.Responses; using Ocelot.Responses;
using Ocelot.Values; using Ocelot.Values;
using Shouldly; using Shouldly;

View File

@ -12,6 +12,7 @@ using Ocelot.Responses;
using Shouldly; using Shouldly;
using TestStack.BDDfy; using TestStack.BDDfy;
using Xunit; using Xunit;
using System.Net.Http;
namespace Ocelot.UnitTests.Headers namespace Ocelot.UnitTests.Headers
{ {
@ -19,6 +20,8 @@ namespace Ocelot.UnitTests.Headers
{ {
private readonly AddHeadersToRequest _addHeadersToRequest; private readonly AddHeadersToRequest _addHeadersToRequest;
private readonly Mock<IClaimsParser> _parser; private readonly Mock<IClaimsParser> _parser;
private readonly HttpRequestMessage _downstreamRequest;
private List<Claim> _claims;
private List<ClaimToThing> _configuration; private List<ClaimToThing> _configuration;
private HttpContext _context; private HttpContext _context;
private Response _result; private Response _result;
@ -28,17 +31,15 @@ namespace Ocelot.UnitTests.Headers
{ {
_parser = new Mock<IClaimsParser>(); _parser = new Mock<IClaimsParser>();
_addHeadersToRequest = new AddHeadersToRequest(_parser.Object); _addHeadersToRequest = new AddHeadersToRequest(_parser.Object);
_downstreamRequest = new HttpRequestMessage();
} }
[Fact] [Fact]
public void should_add_headers_to_context() public void should_add_headers_to_downstreamRequest()
{ {
var context = new DefaultHttpContext var claims = new List<Claim>
{ {
User = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> new Claim("test", "data")
{
new Claim("test", "data")
}))
}; };
this.Given( this.Given(
@ -46,7 +47,7 @@ namespace Ocelot.UnitTests.Headers
{ {
new ClaimToThing("header-key", "", "", 0) new ClaimToThing("header-key", "", "", 0)
})) }))
.Given(x => x.GivenHttpContext(context)) .Given(x => x.GivenClaims(claims))
.And(x => x.GivenTheClaimParserReturns(new OkResponse<string>("value"))) .And(x => x.GivenTheClaimParserReturns(new OkResponse<string>("value")))
.When(x => x.WhenIAddHeadersToTheRequest()) .When(x => x.WhenIAddHeadersToTheRequest())
.Then(x => x.ThenTheResultIsSuccess()) .Then(x => x.ThenTheResultIsSuccess())
@ -55,25 +56,19 @@ namespace Ocelot.UnitTests.Headers
} }
[Fact] [Fact]
public void if_header_exists_should_replace_it() public void should_replace_existing_headers_on_request()
{ {
var context = new DefaultHttpContext
{
User = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim>
{
new Claim("test", "data")
})),
};
context.Request.Headers.Add("header-key", new StringValues("initial"));
this.Given( this.Given(
x => x.GivenConfigurationHeaderExtractorProperties(new List<ClaimToThing> x => x.GivenConfigurationHeaderExtractorProperties(new List<ClaimToThing>
{ {
new ClaimToThing("header-key", "", "", 0) new ClaimToThing("header-key", "", "", 0)
})) }))
.Given(x => x.GivenHttpContext(context)) .Given(x => x.GivenClaims(new List<Claim>
{
new Claim("test", "data")
}))
.And(x => x.GivenTheClaimParserReturns(new OkResponse<string>("value"))) .And(x => x.GivenTheClaimParserReturns(new OkResponse<string>("value")))
.And(x => x.GivenThatTheRequestContainsHeader("header-key", "initial"))
.When(x => x.WhenIAddHeadersToTheRequest()) .When(x => x.WhenIAddHeadersToTheRequest())
.Then(x => x.ThenTheResultIsSuccess()) .Then(x => x.ThenTheResultIsSuccess())
.And(x => x.ThenTheHeaderIsAdded()) .And(x => x.ThenTheHeaderIsAdded())
@ -88,7 +83,7 @@ namespace Ocelot.UnitTests.Headers
{ {
new ClaimToThing("", "", "", 0) new ClaimToThing("", "", "", 0)
})) }))
.Given(x => x.GivenHttpContext(new DefaultHttpContext())) .Given(x => x.GivenClaims(new List<Claim>()))
.And(x => x.GivenTheClaimParserReturns(new ErrorResponse<string>(new List<Error> .And(x => x.GivenTheClaimParserReturns(new ErrorResponse<string>(new List<Error>
{ {
new AnyError() new AnyError()
@ -98,10 +93,9 @@ namespace Ocelot.UnitTests.Headers
.BDDfy(); .BDDfy();
} }
private void ThenTheHeaderIsAdded() private void GivenClaims(List<Claim> claims)
{ {
var header = _context.Request.Headers.First(x => x.Key == "header-key"); _claims = claims;
header.Value.First().ShouldBe(_claimValue.Data);
} }
private void GivenConfigurationHeaderExtractorProperties(List<ClaimToThing> configuration) private void GivenConfigurationHeaderExtractorProperties(List<ClaimToThing> configuration)
@ -109,9 +103,9 @@ namespace Ocelot.UnitTests.Headers
_configuration = configuration; _configuration = configuration;
} }
private void GivenHttpContext(HttpContext context) private void GivenThatTheRequestContainsHeader(string key, string value)
{ {
_context = context; _downstreamRequest.Headers.Add(key, value);
} }
private void GivenTheClaimParserReturns(Response<string> claimValue) private void GivenTheClaimParserReturns(Response<string> claimValue)
@ -129,9 +123,7 @@ namespace Ocelot.UnitTests.Headers
private void WhenIAddHeadersToTheRequest() private void WhenIAddHeadersToTheRequest()
{ {
//_result = _addHeadersToRequest.SetHeadersOnContext(_configuration, _context); _result = _addHeadersToRequest.SetHeadersOnDownstreamRequest(_configuration, _claims, _downstreamRequest);
//TODO: pass in DownstreamRequest
_result = _addHeadersToRequest.SetHeadersOnDownstreamRequest(_configuration, _context.User.Claims, null);
} }
private void ThenTheResultIsSuccess() private void ThenTheResultIsSuccess()
@ -145,6 +137,12 @@ namespace Ocelot.UnitTests.Headers
_result.IsError.ShouldBe(true); _result.IsError.ShouldBe(true);
} }
private void ThenTheHeaderIsAdded()
{
var header = _downstreamRequest.Headers.First(x => x.Key == "header-key");
header.Value.First().ShouldBe(_claimValue.Data);
}
class AnyError : Error class AnyError : Error
{ {
public AnyError() public AnyError()

View File

@ -3,16 +3,13 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net.Http; using System.Net.Http;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost; using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Moq; using Moq;
using Ocelot.Configuration; using Ocelot.Configuration;
using Ocelot.Configuration.Builder; using Ocelot.Configuration.Builder;
using Ocelot.DownstreamRouteFinder; using Ocelot.DownstreamRouteFinder;
using Ocelot.DownstreamRouteFinder.UrlMatcher; using Ocelot.DownstreamRouteFinder.UrlMatcher;
using Ocelot.DownstreamUrlCreator.Middleware;
using Ocelot.Headers; using Ocelot.Headers;
using Ocelot.Headers.Middleware; using Ocelot.Headers.Middleware;
using Ocelot.Infrastructure.RequestData; using Ocelot.Infrastructure.RequestData;
@ -27,6 +24,7 @@ namespace Ocelot.UnitTests.Headers
{ {
private readonly Mock<IRequestScopedDataRepository> _scopedRepository; private readonly Mock<IRequestScopedDataRepository> _scopedRepository;
private readonly Mock<IAddHeadersToRequest> _addHeaders; private readonly Mock<IAddHeadersToRequest> _addHeaders;
private readonly HttpRequestMessage _downstreamRequest;
private readonly string _url; private readonly string _url;
private readonly TestServer _server; private readonly TestServer _server;
private readonly HttpClient _client; private readonly HttpClient _client;
@ -58,6 +56,10 @@ namespace Ocelot.UnitTests.Headers
app.UseHttpRequestHeadersBuilderMiddleware(); app.UseHttpRequestHeadersBuilderMiddleware();
}); });
_scopedRepository
.Setup(sr => sr.Get<HttpRequestMessage>("DownstreamRequest"))
.Returns(new OkResponse<HttpRequestMessage>(_downstreamRequest));
_server = new TestServer(builder); _server = new TestServer(builder);
_client = _server.CreateClient(); _client = _server.CreateClient();
} }
@ -76,18 +78,14 @@ namespace Ocelot.UnitTests.Headers
.Build()); .Build());
this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute)) this.Given(x => x.GivenTheDownStreamRouteIs(downstreamRoute))
.And(x => x.GivenTheAddHeadersToRequestReturns()) .And(x => x.GivenTheAddHeadersToDownstreamRequestReturnsOk())
.When(x => x.WhenICallTheMiddleware()) .When(x => x.WhenICallTheMiddleware())
.Then(x => x.ThenTheAddHeadersToRequestIsCalledCorrectly()) .Then(x => x.ThenTheAddHeadersToRequestIsCalledCorrectly())
.BDDfy(); .BDDfy();
} }
private void GivenTheAddHeadersToRequestReturns() private void GivenTheAddHeadersToDownstreamRequestReturnsOk()
{ {
//_addHeaders
// .Setup(x => x.SetHeadersOnContext(It.IsAny<List<ClaimToThing>>(),
// It.IsAny<HttpContext>()))
// .Returns(new OkResponse());
_addHeaders _addHeaders
.Setup(x => x.SetHeadersOnDownstreamRequest( .Setup(x => x.SetHeadersOnDownstreamRequest(
It.IsAny<List<ClaimToThing>>(), It.IsAny<List<ClaimToThing>>(),
@ -98,14 +96,11 @@ namespace Ocelot.UnitTests.Headers
private void ThenTheAddHeadersToRequestIsCalledCorrectly() private void ThenTheAddHeadersToRequestIsCalledCorrectly()
{ {
//_addHeaders
// .Verify(x => x.SetHeadersOnContext(It.IsAny<List<ClaimToThing>>(),
// It.IsAny<HttpContext>()), Times.Once);
_addHeaders _addHeaders
.Verify(x => x.SetHeadersOnDownstreamRequest( .Verify(x => x.SetHeadersOnDownstreamRequest(
It.IsAny<List<ClaimToThing>>(), It.IsAny<List<ClaimToThing>>(),
It.IsAny<IEnumerable<System.Security.Claims.Claim>>(), It.IsAny<IEnumerable<System.Security.Claims.Claim>>(),
It.IsAny<HttpRequestMessage>()), Times.Once); _downstreamRequest), Times.Once);
} }
private void WhenICallTheMiddleware() private void WhenICallTheMiddleware()

View File

@ -25,6 +25,7 @@ namespace Ocelot.UnitTests.Request
private readonly Mock<IRequestCreator> _requestBuilder; private readonly Mock<IRequestCreator> _requestBuilder;
private readonly Mock<IRequestScopedDataRepository> _scopedRepository; private readonly Mock<IRequestScopedDataRepository> _scopedRepository;
private readonly Mock<IQosProviderHouse> _qosProviderHouse; private readonly Mock<IQosProviderHouse> _qosProviderHouse;
private readonly HttpRequestMessage _downstreamRequest;
private readonly string _url; private readonly string _url;
private readonly TestServer _server; private readonly TestServer _server;
private readonly HttpClient _client; private readonly HttpClient _client;
@ -58,6 +59,12 @@ namespace Ocelot.UnitTests.Request
app.UseHttpRequestBuilderMiddleware(); app.UseHttpRequestBuilderMiddleware();
}); });
_downstreamRequest = new HttpRequestMessage();
_scopedRepository
.Setup(sr => sr.Get<HttpRequestMessage>("DownstreamRequest"))
.Returns(new OkResponse<HttpRequestMessage>(_downstreamRequest));
_server = new TestServer(builder); _server = new TestServer(builder);
_client = _server.CreateClient(); _client = _server.CreateClient();
} }