From 5bf3e23d079f844a7f9c7975b88647274730103a Mon Sep 17 00:00:00 2001 From: Hal Lesesne Date: Tue, 24 Mar 2015 09:08:19 -0400 Subject: [PATCH] Added VersionRouteSegmentConstraint to Nancy.Routing.Constraints --- .../Tests/RouteConstraintTests.cs | 44 ++++++++++++++++--- src/Nancy/Nancy.csproj | 1 + .../VersionRouteSegmentConstraint.cs | 20 +++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/Nancy/Routing/Constraints/VersionRouteSegmentConstraint.cs diff --git a/src/Nancy.Tests.Functional/Tests/RouteConstraintTests.cs b/src/Nancy.Tests.Functional/Tests/RouteConstraintTests.cs index 0a555cdf2a..58774d9610 100644 --- a/src/Nancy.Tests.Functional/Tests/RouteConstraintTests.cs +++ b/src/Nancy.Tests.Functional/Tests/RouteConstraintTests.cs @@ -25,7 +25,7 @@ public RouteConstraintTests() { configuration.ApplicationStartup((c, p) => { }); configuration.Modules(new Type[] { typeof(RouteConstraintsModule) }); - configuration.RouteSegmentConstraints(new[] { typeof(VersionRouteConstraint) }); + configuration.RouteSegmentConstraints(new[] { typeof(UltimateRouteSegmentConstraint), typeof(VersionRouteSegmentConstraint) }); }); this.browser = new Browser(this.bootstrapper); @@ -35,7 +35,7 @@ public RouteConstraintTests() public void multiple_parameters_per_segment_should_support_constraints() { // Given - const string url = @"/4.3...5.3"; + const string url = @"/42...42"; // When var response = this.browser.Get( @@ -50,18 +50,42 @@ public void multiple_parameters_per_segment_should_support_constraints() Assert.True(Invoked); } + [Fact] + public void versionsegmentrouteconstraint_should_match_on_version_numbers() + { + // Given + const string url = @"/4.1.2...4.1.5"; + + // When + var response = this.browser.Get( + url, + with => + { + with.HttpRequest(); + with.Accept("application/json"); + }); - public class VersionRouteConstraint : RouteSegmentConstraintBase + // Then + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(response.Body.AsString(), "{\"left\":\"4.1.2\",\"right\":\"4.1.5\"}"); + } + + + public class UltimateRouteSegmentConstraint : RouteSegmentConstraintBase { public override string Name { - get { return "version"; } + get { return "correctanswer"; } } - protected override bool TryMatch(string constraint, string segment, out Version matchedValue) + protected override bool TryMatch(string constraint, string segment, out int matchedValue) { Invoked = true; - return Version.TryParse(segment, out matchedValue); + if (int.TryParse(segment, out matchedValue)) + { + return matchedValue == 42; + } + return false; } } } @@ -70,11 +94,17 @@ public class RouteConstraintsModule : NancyModule { public RouteConstraintsModule() { - this.Get["/{left:version}...{right:version}"] = _ => + this.Get["/{left:correctanswer}...{right:correctanswer}"] = _ => { return HttpStatusCode.OK; }; + // For testing VersionSegmentRouteConstraint + this.Get["/{left:version}...{right:version}"] = _ => + { + return new {_.left, _.right}; + }; + } } diff --git a/src/Nancy/Nancy.csproj b/src/Nancy/Nancy.csproj index 2e279f20c0..c23f85ed01 100644 --- a/src/Nancy/Nancy.csproj +++ b/src/Nancy/Nancy.csproj @@ -251,6 +251,7 @@ + diff --git a/src/Nancy/Routing/Constraints/VersionRouteSegmentConstraint.cs b/src/Nancy/Routing/Constraints/VersionRouteSegmentConstraint.cs new file mode 100644 index 0000000000..1fd1fa995d --- /dev/null +++ b/src/Nancy/Routing/Constraints/VersionRouteSegmentConstraint.cs @@ -0,0 +1,20 @@ +namespace Nancy.Routing.Constraints +{ + using System; + + /// + /// Constraint for version route segments. + /// + public class VersionRouteSegmentConstraint : RouteSegmentConstraintBase + { + public override string Name + { + get { return "version"; } + } + + protected override bool TryMatch(string constraint, string segment, out Version matchedValue) + { + return Version.TryParse(segment, out matchedValue); + } + } +}