From fea2e318dde9b19961a609495c7f2c091a31425a Mon Sep 17 00:00:00 2001 From: gparmigiani Date: Thu, 27 May 2021 13:55:37 +0200 Subject: [PATCH] handling template parse failure --- src/Stubbery/RequestMatching/RouteMatcher.cs | 19 ++++++++++++++- .../MultipleSetupsTest.cs | 23 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Stubbery/RequestMatching/RouteMatcher.cs b/src/Stubbery/RequestMatching/RouteMatcher.cs index 4f87ba5..5da7d28 100644 --- a/src/Stubbery/RequestMatching/RouteMatcher.cs +++ b/src/Stubbery/RequestMatching/RouteMatcher.cs @@ -28,7 +28,12 @@ public RouteValueDictionary Match(string routeTemplate, string requestPath, IQue } } - var template = TemplateParser.Parse(routeTemplate); + var (isSuccess, template) = TryParseTemplate(routeTemplate); + + if (!isSuccess) + { + return null; + } var matcher = new TemplateMatcher(template, GetDefaults(template)); @@ -37,6 +42,18 @@ public RouteValueDictionary Match(string routeTemplate, string requestPath, IQue return matcher.TryMatch(requestPath, values) ? values : null; } + private static (bool IsSuccess, RouteTemplate Template) TryParseTemplate(string routeTemplate) + { + try + { + return (true, TemplateParser.Parse(routeTemplate)); + } + catch + { + return (false, null); + } + } + private RouteValueDictionary GetDefaults(RouteTemplate parsedTemplate) { var result = new RouteValueDictionary(); diff --git a/test/Stubbery.IntegrationTests/MultipleSetupsTest.cs b/test/Stubbery.IntegrationTests/MultipleSetupsTest.cs index f0b6334..839dd5a 100644 --- a/test/Stubbery.IntegrationTests/MultipleSetupsTest.cs +++ b/test/Stubbery.IntegrationTests/MultipleSetupsTest.cs @@ -49,5 +49,28 @@ public async Task MultipleSetups_AllMatch_TheFirstOneReturned() Assert.Equal("testresponse1", resultString); } + + [Fact] + public async Task MultipleSetups_OneHasWrongRoute_OthersStillMatch() + { + using var sut = new ApiStub(); + + sut.Get("/testget/one", (req, args) => "testresponse1"); + sut.Get("/testget//two", (req, args) => "doesn't match"); + sut.Get("/testget/three", (req, args) => "testresponse3"); + + sut.Start(); + + var result3 = await httpClient.GetAsync(new UriBuilder(new Uri(sut.Address)) + { + Path = "/testget/three" + }.Uri); + + Assert.Equal(HttpStatusCode.OK, result3.StatusCode); + + var resultString = await result3.Content.ReadAsStringAsync(); + + Assert.Equal("testresponse3", resultString); + } } }