Skip to content

Commit 2916fee

Browse files
committed
Redirect().To() now considers With.Any ignored values (closes #196)
1 parent 291428f commit 2916fee

File tree

4 files changed

+68
-12
lines changed

4 files changed

+68
-12
lines changed

src/MyTested.AspNetCore.Mvc.Abstractions/Utilities/Extensions/DictionaryExtensions.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace MyTested.AspNetCore.Mvc.Utilities.Extensions
22
{
3+
using System;
34
using System.Collections.Generic;
45
using System.Linq;
56
using Internal.TestContexts;
@@ -18,17 +19,27 @@ public static IDictionary<string, MethodArgumentTestContext> ToDetailedValues(th
1819
});
1920
}
2021

21-
public static IDictionary<string, object> ToRouteValues(this IDictionary<string, MethodArgumentTestContext> dictionary)
22+
public static IDictionary<string, object> ToRouteValues(
23+
this IDictionary<string, MethodArgumentTestContext> dictionary,
24+
Func<KeyValuePair<string, MethodArgumentTestContext>, bool> filter = null)
2225
{
23-
return dictionary.ToDictionary(
26+
var result = dictionary.AsEnumerable();
27+
28+
if (filter != null)
29+
{
30+
result = result.Where(filter);
31+
}
32+
33+
return result.ToDictionary(
2434
a => a.Key,
2535
a => a.Value.Value);
2636
}
2737

2838
public static IDictionary<string, object> ToSortedRouteValues(
29-
this IDictionary<string, MethodArgumentTestContext> dictionary)
39+
this IDictionary<string, MethodArgumentTestContext> dictionary,
40+
Func<KeyValuePair<string, MethodArgumentTestContext>, bool> filter = null)
3041
{
31-
return new SortedDictionary<string, object>(dictionary.ToRouteValues());
42+
return new SortedDictionary<string, object>(dictionary.ToRouteValues(filter));
3243
}
3344
}
3445
}

src/MyTested.AspNetCore.Mvc.Controllers/Utilities/Extensions/UrlHelperExtensions.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,49 @@
11
namespace MyTested.AspNetCore.Mvc.Utilities.Extensions
22
{
3+
using System.Collections.Generic;
4+
using System.Linq;
35
using System.Linq.Expressions;
46
using Internal.Routing;
57
using Internal.TestContexts;
68
using Microsoft.AspNetCore.Mvc;
79

810
public static class UrlHelperExtensions
911
{
10-
public static string ExpressionLink(this IUrlHelper urlHelper, LambdaExpression lambdaExpression)
12+
public static string ExpressionLink(
13+
this IUrlHelper urlHelper,
14+
LambdaExpression lambdaExpression,
15+
out ICollection<string> ignoredRouteKeys)
1116
{
1217
var routeValues = RouteExpressionParser.Parse(lambdaExpression, considerParameterDescriptors: true);
18+
19+
var ignoredKeys = routeValues
20+
.ActionArguments
21+
.Where(a => a.Value.Value.ToString() == ExpressionParser.IgnoredExpressionArgument)
22+
.Select(a => a.Key)
23+
.ToList();
24+
25+
ignoredRouteKeys = ignoredKeys;
26+
1327
return urlHelper.Action(
1428
routeValues.Action,
1529
routeValues.ControllerName,
16-
routeValues.ActionArguments.ToSortedRouteValues());
30+
routeValues.ActionArguments.ToSortedRouteValues(kvp => !ignoredKeys.Contains(kvp.Key)));
1731
}
1832

1933
public static string GenerateLink(
2034
this IUrlHelper urlHelper,
2135
LinkGenerationTestContext linkGenerationTestContext,
22-
ControllerTestContext controllerTestContext)
36+
ControllerTestContext controllerTestContext,
37+
ICollection<string> ignoredRouteKeys = null)
2338
{
39+
if (ignoredRouteKeys != null)
40+
{
41+
linkGenerationTestContext.RouteValues = linkGenerationTestContext
42+
.RouteValues
43+
?.Where(kvp => !ignoredRouteKeys.Contains(kvp.Key))
44+
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
45+
}
46+
2447
string uri = null;
2548
if (!string.IsNullOrWhiteSpace(linkGenerationTestContext.Location))
2649
{

src/MyTested.AspNetCore.Mvc.Controllers/Utilities/Validators/RouteActionResultValidator.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,15 @@ public static void ValidateExpressionLink(
279279
.GetRequiredService<IUrlHelperFactory>()
280280
.GetUrlHelper(actionContext);
281281

282-
var expectedUri = urlHelper.ExpressionLink(expectedRouteValuesAsLambdaExpression);
283-
var actualUri = urlHelper.GenerateLink(linkGenerationTestContext, controllerTestContext);
282+
ICollection<string> ignoredRouteKeys;
283+
var expectedUri = urlHelper.ExpressionLink(
284+
expectedRouteValuesAsLambdaExpression,
285+
out ignoredRouteKeys);
286+
287+
var actualUri = urlHelper.GenerateLink(
288+
linkGenerationTestContext,
289+
controllerTestContext,
290+
ignoredRouteKeys);
284291

285292
if (!string.Equals(expectedUri, actualUri, StringComparison.OrdinalIgnoreCase))
286293
{

test/MyTested.AspNetCore.Mvc.Controllers.Test/BuildersTests/ActionResultsTests/RedirectTests/RedirectTestBuilderTests.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ public void EverySpecificMethodShouldThrowExceptionWhenSuchPropertyIsNotFound()
522522
}
523523

524524
[Fact]
525-
public void AtShouldWorkCorrectlyWithCorrectActionCall()
525+
public void ToShouldWorkCorrectlyWithCorrectActionCall()
526526
{
527527
MyApplication.StartsFrom<RoutingStartup>();
528528

@@ -537,7 +537,22 @@ public void AtShouldWorkCorrectlyWithCorrectActionCall()
537537
}
538538

539539
[Fact]
540-
public void AtShouldWorkCorrectlyWithCorrectVoidActionCall()
540+
public void ToShouldWorkCorrectlyWithWithAnyCall()
541+
{
542+
MyApplication.StartsFrom<RoutingStartup>();
543+
544+
MyController<MvcController>
545+
.Instance()
546+
.Calling(c => c.RedirectToRouteAction())
547+
.ShouldReturn()
548+
.Redirect()
549+
.To<NoAttributesController>(c => c.WithParameter(With.Any<int>()));
550+
551+
MyApplication.IsUsingDefaultConfiguration();
552+
}
553+
554+
[Fact]
555+
public void ToShouldWorkCorrectlyWithCorrectVoidActionCall()
541556
{
542557
MyApplication.StartsFrom<RoutingStartup>();
543558

@@ -552,7 +567,7 @@ public void AtShouldWorkCorrectlyWithCorrectVoidActionCall()
552567
}
553568

554569
[Fact]
555-
public void AtShouldWorkCorrectlyWithCorrectTaskActionCall()
570+
public void ToShouldWorkCorrectlyWithCorrectTaskActionCall()
556571
{
557572
MyApplication.StartsFrom<RoutingStartup>();
558573

0 commit comments

Comments
 (0)