mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-22 06:22:50 +08:00
first passing proxy acceptnace test yeyyy!
This commit is contained in:
parent
71b7e7743e
commit
03ef47038a
@ -0,0 +1,16 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Ocelot.Library.Infrastructure.UrlMatcher;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.DownstreamRouteFinder
|
||||||
|
{
|
||||||
|
public class DownstreamRoute
|
||||||
|
{
|
||||||
|
public DownstreamRoute(List<TemplateVariableNameAndValue> templateVariableNameAndValues, string downstreamUrlTemplate)
|
||||||
|
{
|
||||||
|
TemplateVariableNameAndValues = templateVariableNameAndValues;
|
||||||
|
DownstreamUrlTemplate = downstreamUrlTemplate;
|
||||||
|
}
|
||||||
|
public List<TemplateVariableNameAndValue> TemplateVariableNameAndValues { get; private set; }
|
||||||
|
public string DownstreamUrlTemplate { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
using Ocelot.Library.Infrastructure.UrlMatcher;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.DownstreamRouteFinder
|
||||||
|
{
|
||||||
|
public class DownstreamRouteFinder : IDownstreamRouteFinder
|
||||||
|
{
|
||||||
|
private readonly IOptions<Configuration.Configuration> _configuration;
|
||||||
|
private readonly IUrlPathToUrlTemplateMatcher _urlMatcher;
|
||||||
|
|
||||||
|
public DownstreamRouteFinder(IOptions<Configuration.Configuration> configuration, IUrlPathToUrlTemplateMatcher urlMatcher)
|
||||||
|
{
|
||||||
|
_configuration = configuration;
|
||||||
|
_urlMatcher = urlMatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response<DownstreamRoute> FindDownstreamRoute(string upstreamUrlPath)
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (var template in _configuration.Value.ReRoutes)
|
||||||
|
{
|
||||||
|
var urlMatch = _urlMatcher.Match(upstreamUrlPath, template.UpstreamTemplate);
|
||||||
|
|
||||||
|
if (urlMatch.Match)
|
||||||
|
{
|
||||||
|
return new OkResponse<DownstreamRoute>(new DownstreamRoute(urlMatch.TemplateVariableNameAndValues, template.DownstreamTemplate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ErrorResponse<DownstreamRoute>(new List<Error>
|
||||||
|
{
|
||||||
|
new UnableToFindDownstreamRouteError()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.DownstreamRouteFinder
|
||||||
|
{
|
||||||
|
public interface IDownstreamRouteFinder
|
||||||
|
{
|
||||||
|
Response<DownstreamRoute> FindDownstreamRoute(string upstreamUrlPath);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
|
||||||
|
namespace Ocelot.Library.Infrastructure.DownstreamRouteFinder
|
||||||
|
{
|
||||||
|
public class UnableToFindDownstreamRouteError : Error
|
||||||
|
{
|
||||||
|
public UnableToFindDownstreamRouteError() : base("UnableToFindDownstreamRouteError")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,17 +1,17 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Ocelot.Library.Infrastructure.UrlMatcher;
|
using Ocelot.Library.Infrastructure.DownstreamRouteFinder;
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.UrlTemplateReplacer
|
namespace Ocelot.Library.Infrastructure.UrlTemplateReplacer
|
||||||
{
|
{
|
||||||
public class DownstreamUrlTemplateVariableReplacer : IDownstreamUrlTemplateVariableReplacer
|
public class DownstreamUrlTemplateVariableReplacer : IDownstreamUrlTemplateVariableReplacer
|
||||||
{
|
{
|
||||||
public string ReplaceTemplateVariable(UrlMatch urlMatch)
|
public string ReplaceTemplateVariable(DownstreamRoute downstreamRoute)
|
||||||
{
|
{
|
||||||
var upstreamUrl = new StringBuilder();
|
var upstreamUrl = new StringBuilder();
|
||||||
|
|
||||||
upstreamUrl.Append(urlMatch.DownstreamUrlTemplate);
|
upstreamUrl.Append(downstreamRoute.DownstreamUrlTemplate);
|
||||||
|
|
||||||
foreach (var templateVarAndValue in urlMatch.TemplateVariableNameAndValues)
|
foreach (var templateVarAndValue in downstreamRoute.TemplateVariableNameAndValues)
|
||||||
{
|
{
|
||||||
upstreamUrl.Replace(templateVarAndValue.TemplateVariableName, templateVarAndValue.TemplateVariableValue);
|
upstreamUrl.Replace(templateVarAndValue.TemplateVariableName, templateVarAndValue.TemplateVariableValue);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
|
using Ocelot.Library.Infrastructure.DownstreamRouteFinder;
|
||||||
using Ocelot.Library.Infrastructure.UrlMatcher;
|
using Ocelot.Library.Infrastructure.UrlMatcher;
|
||||||
|
|
||||||
namespace Ocelot.Library.Infrastructure.UrlTemplateReplacer
|
namespace Ocelot.Library.Infrastructure.UrlTemplateReplacer
|
||||||
{
|
{
|
||||||
public interface IDownstreamUrlTemplateVariableReplacer
|
public interface IDownstreamUrlTemplateVariableReplacer
|
||||||
{
|
{
|
||||||
string ReplaceTemplateVariable(UrlMatch urlMatch);
|
string ReplaceTemplateVariable(DownstreamRoute downstreamRoute);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,56 +1,62 @@
|
|||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Ocelot.Library.Infrastructure.UrlMatcher;
|
using Microsoft.Extensions.Options;
|
||||||
|
using Ocelot.Library.Infrastructure.Configuration;
|
||||||
|
using Ocelot.Library.Infrastructure.DownstreamRouteFinder;
|
||||||
using Ocelot.Library.Infrastructure.UrlTemplateReplacer;
|
using Ocelot.Library.Infrastructure.UrlTemplateReplacer;
|
||||||
|
|
||||||
namespace Ocelot.Library.Middleware
|
namespace Ocelot.Library.Middleware
|
||||||
{
|
{
|
||||||
using System.Net;
|
|
||||||
using Infrastructure.Configuration;
|
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
|
|
||||||
public class ProxyMiddleware
|
public class ProxyMiddleware
|
||||||
{
|
{
|
||||||
private readonly RequestDelegate _next;
|
private readonly RequestDelegate _next;
|
||||||
private readonly IUrlPathToUrlTemplateMatcher _urlMatcher;
|
|
||||||
private readonly IDownstreamUrlTemplateVariableReplacer _urlReplacer;
|
private readonly IDownstreamUrlTemplateVariableReplacer _urlReplacer;
|
||||||
private readonly IOptions<Configuration> _configuration;
|
private readonly IOptions<Configuration> _configuration;
|
||||||
|
private readonly IDownstreamRouteFinder _downstreamRouteFinder;
|
||||||
|
|
||||||
public ProxyMiddleware(RequestDelegate next,
|
public ProxyMiddleware(RequestDelegate next,
|
||||||
IUrlPathToUrlTemplateMatcher urlMatcher,
|
IDownstreamUrlTemplateVariableReplacer urlReplacer,
|
||||||
IDownstreamUrlTemplateVariableReplacer urlReplacer, IOptions<Configuration> configuration)
|
IOptions<Configuration> configuration,
|
||||||
|
IDownstreamRouteFinder downstreamRouteFinder)
|
||||||
{
|
{
|
||||||
_next = next;
|
_next = next;
|
||||||
_urlMatcher = urlMatcher;
|
|
||||||
_urlReplacer = urlReplacer;
|
_urlReplacer = urlReplacer;
|
||||||
_configuration = configuration;
|
_configuration = configuration;
|
||||||
|
_downstreamRouteFinder = downstreamRouteFinder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Invoke(HttpContext context)
|
public async Task Invoke(HttpContext context)
|
||||||
{
|
{
|
||||||
var upstreamUrlPath = context.Request.Path.ToString();
|
var upstreamUrlPath = context.Request.Path.ToString();
|
||||||
|
|
||||||
UrlMatch urlMatch = null;
|
var downstreamRoute = _downstreamRouteFinder.FindDownstreamRoute(upstreamUrlPath);
|
||||||
|
|
||||||
foreach (var template in _configuration.Value.ReRoutes)
|
if (downstreamRoute.IsError)
|
||||||
{
|
|
||||||
urlMatch = _urlMatcher.Match(upstreamUrlPath, template.UpstreamTemplate);
|
|
||||||
|
|
||||||
if (urlMatch.Match)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (urlMatch == null || !urlMatch.Match)
|
|
||||||
{
|
{
|
||||||
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
|
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var downstreamUrl = _urlReplacer.ReplaceTemplateVariable(urlMatch);
|
var downstreamUrl = _urlReplacer.ReplaceTemplateVariable(downstreamRoute.Data);
|
||||||
|
|
||||||
//make a http request to this endpoint...maybe bring in a library
|
//make a http request to this endpoint...maybe bring in a library
|
||||||
|
using (var httpClient = new HttpClient())
|
||||||
|
{
|
||||||
|
var httpMethod = new HttpMethod(context.Request.Method);
|
||||||
|
|
||||||
|
var httpRequestMessage = new HttpRequestMessage(httpMethod, downstreamUrl);
|
||||||
|
|
||||||
|
var response = await httpClient.SendAsync(httpRequestMessage);
|
||||||
|
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
context.Response.StatusCode = (int)response.StatusCode;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await context.Response.WriteAsync(await response.Content.ReadAsStringAsync());
|
||||||
|
}
|
||||||
|
|
||||||
await _next.Invoke(context);
|
await _next.Invoke(context);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Hosting;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Ocelot.Library.Infrastructure.DownstreamRouteFinder;
|
||||||
using Ocelot.Library.Middleware;
|
using Ocelot.Library.Middleware;
|
||||||
|
|
||||||
namespace Ocelot
|
namespace Ocelot
|
||||||
@ -36,6 +37,7 @@ namespace Ocelot
|
|||||||
// Add framework services.
|
// Add framework services.
|
||||||
services.AddSingleton<IUrlPathToUrlTemplateMatcher, UrlPathToUrlTemplateMatcher>();
|
services.AddSingleton<IUrlPathToUrlTemplateMatcher, UrlPathToUrlTemplateMatcher>();
|
||||||
services.AddSingleton<IDownstreamUrlTemplateVariableReplacer, DownstreamUrlTemplateVariableReplacer>();
|
services.AddSingleton<IDownstreamUrlTemplateVariableReplacer, DownstreamUrlTemplateVariableReplacer>();
|
||||||
|
services.AddSingleton<IDownstreamRouteFinder, DownstreamRouteFinder>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||||
|
@ -90,7 +90,7 @@ namespace Ocelot.AcceptanceTests
|
|||||||
|
|
||||||
private void WhenIRequestTheUrlOnTheApiGateway(string url)
|
private void WhenIRequestTheUrlOnTheApiGateway(string url)
|
||||||
{
|
{
|
||||||
_response = _client.GetAsync("/").Result;
|
_response = _client.GetAsync(url).Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ThenTheStatusCodeShouldBe(HttpStatusCode expectedHttpStatusCode)
|
private void ThenTheStatusCodeShouldBe(HttpStatusCode expectedHttpStatusCode)
|
||||||
|
132
test/Ocelot.UnitTests/DownstreamRouteFinderTests.cs
Normal file
132
test/Ocelot.UnitTests/DownstreamRouteFinderTests.cs
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Moq;
|
||||||
|
using Ocelot.Library.Infrastructure.Configuration;
|
||||||
|
using Ocelot.Library.Infrastructure.DownstreamRouteFinder;
|
||||||
|
using Ocelot.Library.Infrastructure.Responses;
|
||||||
|
using Ocelot.Library.Infrastructure.UrlMatcher;
|
||||||
|
using Shouldly;
|
||||||
|
using TestStack.BDDfy;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Ocelot.UnitTests
|
||||||
|
{
|
||||||
|
public class DownstreamRouteFinderTests
|
||||||
|
{
|
||||||
|
private readonly IDownstreamRouteFinder _downstreamRouteFinder;
|
||||||
|
private readonly Mock<IOptions<Configuration>> _mockConfig;
|
||||||
|
private readonly Mock<IUrlPathToUrlTemplateMatcher> _mockMatcher;
|
||||||
|
private string _upstreamUrlPath;
|
||||||
|
private Response<DownstreamRoute> _result;
|
||||||
|
private Response<DownstreamRoute> _response;
|
||||||
|
private Configuration _configuration;
|
||||||
|
private UrlMatch _match;
|
||||||
|
|
||||||
|
public DownstreamRouteFinderTests()
|
||||||
|
{
|
||||||
|
_mockConfig = new Mock<IOptions<Configuration>>();
|
||||||
|
_mockMatcher = new Mock<IUrlPathToUrlTemplateMatcher>();
|
||||||
|
_downstreamRouteFinder = new DownstreamRouteFinder(_mockConfig.Object, _mockMatcher.Object);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void should_return_route()
|
||||||
|
{
|
||||||
|
this.Given(x => x.GivenThereIsAnUpstreamUrlPath("somePath"))
|
||||||
|
.And(x => x.GivenTheConfigurationIs(new Configuration {
|
||||||
|
ReRoutes = new List<ReRoute>
|
||||||
|
{
|
||||||
|
new ReRoute()
|
||||||
|
{
|
||||||
|
UpstreamTemplate = "somePath",
|
||||||
|
DownstreamTemplate = "somPath"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.And(x => x.GivenTheUrlMatcherReturns(new UrlMatch(true, new List<TemplateVariableNameAndValue>(), "somePath")))
|
||||||
|
.When(x => x.WhenICallTheFinder())
|
||||||
|
.Then(
|
||||||
|
x => x.ThenTheFollowingIsReturned(new DownstreamRoute(new List<TemplateVariableNameAndValue>(), "somePath")))
|
||||||
|
.And(x => x.ThenTheUrlMatcherIsCalledCorrectly())
|
||||||
|
.BDDfy();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void should_not_return_route()
|
||||||
|
{
|
||||||
|
this.Given(x => x.GivenThereIsAnUpstreamUrlPath("somePath"))
|
||||||
|
.And(x => x.GivenTheConfigurationIs(new Configuration
|
||||||
|
{
|
||||||
|
ReRoutes = new List<ReRoute>
|
||||||
|
{
|
||||||
|
new ReRoute()
|
||||||
|
{
|
||||||
|
UpstreamTemplate = "somePath",
|
||||||
|
DownstreamTemplate = "somPath"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.And(x => x.GivenTheUrlMatcherReturns(new UrlMatch(false, new List<TemplateVariableNameAndValue>(), null)))
|
||||||
|
.When(x => x.WhenICallTheFinder())
|
||||||
|
.Then(
|
||||||
|
x => x.ThenAnErrorResponseIsReturned())
|
||||||
|
.And(x => x.ThenTheUrlMatcherIsCalledCorrectly())
|
||||||
|
.BDDfy();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThenAnErrorResponseIsReturned()
|
||||||
|
{
|
||||||
|
_result.IsError.ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThenTheUrlMatcherIsCalledCorrectly()
|
||||||
|
{
|
||||||
|
_mockMatcher
|
||||||
|
.Verify(x => x.Match(_upstreamUrlPath, _configuration.ReRoutes[0].UpstreamTemplate), Times.Once);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenTheUrlMatcherReturns(UrlMatch match)
|
||||||
|
{
|
||||||
|
_match = match;
|
||||||
|
_mockMatcher
|
||||||
|
.Setup(x => x.Match(It.IsAny<string>(), It.IsAny<string>()))
|
||||||
|
.Returns(_match);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenTheConfigurationIs(Configuration configuration)
|
||||||
|
{
|
||||||
|
_configuration = configuration;
|
||||||
|
_mockConfig
|
||||||
|
.Setup(x => x.Value)
|
||||||
|
.Returns(_configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenThereIsAnUpstreamUrlPath(string upstreamUrlPath)
|
||||||
|
{
|
||||||
|
_upstreamUrlPath = upstreamUrlPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WhenICallTheFinder()
|
||||||
|
{
|
||||||
|
_result = _downstreamRouteFinder.FindDownstreamRoute(_upstreamUrlPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThenTheFollowingIsReturned(DownstreamRoute expected)
|
||||||
|
{
|
||||||
|
_result.Data.DownstreamUrlTemplate.ShouldBe(expected.DownstreamUrlTemplate);
|
||||||
|
for (int i = 0; i < _result.Data.TemplateVariableNameAndValues.Count; i++)
|
||||||
|
{
|
||||||
|
_result.Data.TemplateVariableNameAndValues[i].TemplateVariableName.ShouldBe(
|
||||||
|
expected.TemplateVariableNameAndValues[i].TemplateVariableName);
|
||||||
|
|
||||||
|
_result.Data.TemplateVariableNameAndValues[i].TemplateVariableValue.ShouldBe(
|
||||||
|
expected.TemplateVariableNameAndValues[i].TemplateVariableValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
_result.IsError.ShouldBeFalse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Ocelot.Library.Infrastructure.DownstreamRouteFinder;
|
||||||
using Ocelot.Library.Infrastructure.UrlMatcher;
|
using Ocelot.Library.Infrastructure.UrlMatcher;
|
||||||
using Ocelot.Library.Infrastructure.UrlTemplateReplacer;
|
using Ocelot.Library.Infrastructure.UrlTemplateReplacer;
|
||||||
using Shouldly;
|
using Shouldly;
|
||||||
@ -10,7 +11,7 @@ namespace Ocelot.UnitTests
|
|||||||
|
|
||||||
public class UpstreamUrlPathTemplateVariableReplacerTests
|
public class UpstreamUrlPathTemplateVariableReplacerTests
|
||||||
{
|
{
|
||||||
private UrlMatch _urlMatch;
|
private DownstreamRoute _downstreamRoute;
|
||||||
private string _result;
|
private string _result;
|
||||||
private readonly IDownstreamUrlTemplateVariableReplacer _downstreamUrlPathReplacer;
|
private readonly IDownstreamUrlTemplateVariableReplacer _downstreamUrlPathReplacer;
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ namespace Ocelot.UnitTests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_no_template_variables()
|
public void can_replace_no_template_variables()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, new List<TemplateVariableNameAndValue>(), "")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<TemplateVariableNameAndValue>(), "")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned(""))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned(""))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -31,7 +32,7 @@ namespace Ocelot.UnitTests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_no_template_variables_with_slash()
|
public void can_replace_no_template_variables_with_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, new List<TemplateVariableNameAndValue>(), "/")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<TemplateVariableNameAndValue>(), "/")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -40,7 +41,7 @@ namespace Ocelot.UnitTests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_url_no_slash()
|
public void can_replace_url_no_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, new List<TemplateVariableNameAndValue>(), "api")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<TemplateVariableNameAndValue>(), "api")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -49,7 +50,7 @@ namespace Ocelot.UnitTests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_url_one_slash()
|
public void can_replace_url_one_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, new List<TemplateVariableNameAndValue>(), "api/")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<TemplateVariableNameAndValue>(), "api/")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -58,7 +59,7 @@ namespace Ocelot.UnitTests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void can_replace_url_multiple_slash()
|
public void can_replace_url_multiple_slash()
|
||||||
{
|
{
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, new List<TemplateVariableNameAndValue>(), "api/product/products/")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(new List<TemplateVariableNameAndValue>(), "api/product/products/")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/product/products/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("api/product/products/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -72,7 +73,7 @@ namespace Ocelot.UnitTests
|
|||||||
new TemplateVariableNameAndValue("{productId}", "1")
|
new TemplateVariableNameAndValue("{productId}", "1")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, templateVariables, "productservice/products/{productId}/")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, "productservice/products/{productId}/")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -86,7 +87,7 @@ namespace Ocelot.UnitTests
|
|||||||
new TemplateVariableNameAndValue("{productId}", "1")
|
new TemplateVariableNameAndValue("{productId}", "1")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, templateVariables, "productservice/products/{productId}/variants")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, "productservice/products/{productId}/variants")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -101,7 +102,7 @@ namespace Ocelot.UnitTests
|
|||||||
new TemplateVariableNameAndValue("{variantId}", "12")
|
new TemplateVariableNameAndValue("{variantId}", "12")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, templateVariables, "productservice/products/{productId}/variants/{variantId}")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, "productservice/products/{productId}/variants/{variantId}")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants/12"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/products/1/variants/12"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
@ -117,20 +118,20 @@ namespace Ocelot.UnitTests
|
|||||||
new TemplateVariableNameAndValue("{categoryId}", "34")
|
new TemplateVariableNameAndValue("{categoryId}", "34")
|
||||||
};
|
};
|
||||||
|
|
||||||
this.Given(x => x.GivenThereIsAUrlMatch(new UrlMatch(true, templateVariables, "productservice/category/{categoryId}/products/{productId}/variants/{variantId}")))
|
this.Given(x => x.GivenThereIsAUrlMatch(new DownstreamRoute(templateVariables, "productservice/category/{categoryId}/products/{productId}/variants/{variantId}")))
|
||||||
.When(x => x.WhenIReplaceTheTemplateVariables())
|
.When(x => x.WhenIReplaceTheTemplateVariables())
|
||||||
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/category/34/products/1/variants/12"))
|
.Then(x => x.ThenTheDownstreamUrlPathIsReturned("productservice/category/34/products/1/variants/12"))
|
||||||
.BDDfy();
|
.BDDfy();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenThereIsAUrlMatch(UrlMatch urlMatch)
|
private void GivenThereIsAUrlMatch(DownstreamRoute downstreamRoute)
|
||||||
{
|
{
|
||||||
_urlMatch = urlMatch;
|
_downstreamRoute = downstreamRoute;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WhenIReplaceTheTemplateVariables()
|
private void WhenIReplaceTheTemplateVariables()
|
||||||
{
|
{
|
||||||
_result = _downstreamUrlPathReplacer.ReplaceTemplateVariable(_urlMatch);
|
_result = _downstreamUrlPathReplacer.ReplaceTemplateVariable(_downstreamRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ThenTheDownstreamUrlPathIsReturned(string expected)
|
private void ThenTheDownstreamUrlPathIsReturned(string expected)
|
||||||
|
@ -24,7 +24,8 @@
|
|||||||
"dotnet-test-xunit": "2.2.0-preview2-build1029",
|
"dotnet-test-xunit": "2.2.0-preview2-build1029",
|
||||||
"Shouldly": "2.8.0",
|
"Shouldly": "2.8.0",
|
||||||
"TestStack.BDDfy": "4.3.1",
|
"TestStack.BDDfy": "4.3.1",
|
||||||
"YamlDotNet": "3.9.0"
|
"YamlDotNet": "3.9.0",
|
||||||
|
"Moq": "4.6.38-alpha"
|
||||||
},
|
},
|
||||||
|
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user