From 87f0bbb092708b7ed2cb2194a66752b8546039dc Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 31 Oct 2014 16:00:04 -0700 Subject: [PATCH] adding tests --- .../Template/TemplateRouteTest.cs | 117 +++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Routing.Tests/Template/TemplateRouteTest.cs b/test/Microsoft.AspNet.Routing.Tests/Template/TemplateRouteTest.cs index 744471f282..97a46bad8a 100644 --- a/test/Microsoft.AspNet.Routing.Tests/Template/TemplateRouteTest.cs +++ b/test/Microsoft.AspNet.Routing.Tests/Template/TemplateRouteTest.cs @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Routing.Template Assert.Equal("Home/Index/Failure", values.RequestPath); Assert.Equal(template, values.Template); Assert.NotNull(values.DefaultValues); - Assert.Null(values.ProducedValues); + Assert.Empty(values.ProducedValues); Assert.Equal(false, values.MatchedTemplate); Assert.Equal(false, values.MatchedConstraints); Assert.Equal(false, values.Matched); @@ -224,6 +224,68 @@ namespace Microsoft.AspNet.Routing.Template Assert.NotSame(route.DataTokens, context.RouteData.DataTokens); } + [Fact] + public async Task RouteAsync_MergesExistingRouteData_PassedToConstraint() + { + // Arrange + var template = "{controller}/{action}/{id:int}"; + + var context = CreateRouteContext("/Home/Index/5"); + var originalRouteDataValues = context.RouteData.Values; + originalRouteDataValues.Add("country", "USA"); + + var originalDataTokens = context.RouteData.DataTokens; + originalDataTokens.Add("company", "Contoso"); + + IDictionary routeValues = null; + var mockTarget = new Mock(MockBehavior.Strict); + mockTarget + .Setup(s => s.RouteAsync(It.IsAny())) + .Callback(ctx => + { + routeValues = ctx.RouteData.Values; + ctx.IsHandled = true; + }) + .Returns(Task.FromResult(true)); + + var constraint = new CapturingConstraint(); + + var route = new TemplateRoute( + mockTarget.Object, + template, + defaults: null, + constraints: new RouteValueDictionary(new { action = constraint }), + dataTokens: new RouteValueDictionary(new { today = "Friday" }), + inlineConstraintResolver: _inlineConstraintResolver); + + // Act + await route.RouteAsync(context); + + // Assert + Assert.NotNull(routeValues); + + Assert.True(routeValues.ContainsKey("country")); + Assert.Equal("USA", routeValues["country"]); + Assert.True(routeValues.ContainsKey("id")); + Assert.Equal("5", routeValues["id"]); + + Assert.True(constraint.Values.ContainsKey("country")); + Assert.Equal("USA", constraint.Values["country"]); + Assert.True(constraint.Values.ContainsKey("id")); + Assert.Equal("5", constraint.Values["id"]); + + Assert.True(context.RouteData.Values.ContainsKey("country")); + Assert.Equal("USA", context.RouteData.Values["country"]); + Assert.True(context.RouteData.Values.ContainsKey("id")); + Assert.Equal("5", context.RouteData.Values["id"]); + Assert.NotSame(originalRouteDataValues, context.RouteData.Values); + + Assert.Equal("Contoso", context.RouteData.DataTokens["company"]); + Assert.Equal("Friday", context.RouteData.DataTokens["today"]); + Assert.NotSame(originalDataTokens, context.RouteData.DataTokens); + Assert.NotSame(route.DataTokens, context.RouteData.DataTokens); + } + [Fact] public async Task RouteAsync_CleansUpMergedRouteData_IfRouteDoesNotMatch() { @@ -330,6 +392,59 @@ namespace Microsoft.AspNet.Routing.Template Assert.Same(originalDataTokens, context.RouteData.DataTokens); } + [Fact] + public async Task RouteAsync_CleansUpMergedRouteData_IfConstraintThrows() + { + // Arrange + var template = "{controller}/{action}/{id:int}"; + + var context = CreateRouteContext("/Home/Index/5"); + var originalRouteDataValues = context.RouteData.Values; + originalRouteDataValues.Add("country", "USA"); + + var originalDataTokens = context.RouteData.DataTokens; + originalDataTokens.Add("company", "Contoso"); + + var mockTarget = new Mock(MockBehavior.Strict); + mockTarget + .Setup(s => s.RouteAsync(It.IsAny())) + .Callback(ctx => + { + ctx.IsHandled = true; + }) + .Returns(Task.FromResult(true)); + + var constraint = new Mock(MockBehavior.Strict); + constraint + .Setup(c => c.Match( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Callback(() => { throw new Exception(); }); + + var route = new TemplateRoute( + mockTarget.Object, + template, + defaults: null, + constraints: new RouteValueDictionary(new { action = constraint.Object }), + dataTokens: new RouteValueDictionary(new { today = "Friday" }), + inlineConstraintResolver: _inlineConstraintResolver); + + // Act + var ex = await Assert.ThrowsAsync(() => route.RouteAsync(context)); + + // Assert + Assert.True(context.RouteData.Values.ContainsKey("country")); + Assert.Equal("USA", context.RouteData.Values["country"]); + Assert.False(context.RouteData.Values.ContainsKey("id")); + Assert.Same(originalRouteDataValues, context.RouteData.Values); + + Assert.Equal("Contoso", context.RouteData.DataTokens["company"]); + Assert.False(context.RouteData.DataTokens.ContainsKey("today")); + Assert.Same(originalDataTokens, context.RouteData.DataTokens); + } [Fact] public async Task RouteAsync_MatchFailOnConstraints_DoesNotLogWhenDisabled()