Skip to content

Commit b8f4a41

Browse files
author
Chris Santero
committed
add pascal-case controller selector
1 parent 500fa8c commit b8f4a41

6 files changed

Lines changed: 122 additions & 0 deletions

File tree

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Collections.Generic;
2+
using System.Net.Http;
3+
using System.Web.Http;
4+
using System.Web.Http.Controllers;
5+
using System.Web.Http.Routing;
6+
using FluentAssertions;
7+
using JSONAPI.Http;
8+
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
using Moq;
10+
11+
namespace JSONAPI.Tests.Http
12+
{
13+
[TestClass]
14+
public class PascalizedControllerSelectorTests
15+
{
16+
[TestMethod]
17+
public void Camelizes_controller_name_without_dashes()
18+
{
19+
TestForDefaultString("foo", "Foo");
20+
}
21+
22+
[TestMethod]
23+
public void Camelizes_controller_name_with_underscores()
24+
{
25+
TestForDefaultString("foo_bar_baz", "FooBarBaz");
26+
}
27+
28+
[TestMethod]
29+
public void Camelizes_controller_name_with_dots()
30+
{
31+
TestForDefaultString("foo.bar.baz", "FooBarBaz");
32+
}
33+
34+
[TestMethod]
35+
public void Camelizes_controller_name_with_dashes()
36+
{
37+
TestForDefaultString("foo-bar-baz", "FooBarBaz");
38+
}
39+
40+
[TestMethod]
41+
public void Camelizes_controller_name_with_all_three()
42+
{
43+
TestForDefaultString("foo.bar-baz_qux", "FooBarBazQux");
44+
}
45+
46+
private void TestForDefaultString(string defaultString, string expectedTransformation)
47+
{
48+
// Arrange
49+
var routeDataDict = new Dictionary<string, object>
50+
{
51+
{"controller", defaultString}
52+
};
53+
54+
var mockRouteData = new Mock<IHttpRouteData>(MockBehavior.Strict);
55+
mockRouteData.Setup(m => m.Values).Returns(routeDataDict);
56+
57+
var mockRequestContext = new Mock<HttpRequestContext>(MockBehavior.Strict);
58+
mockRequestContext.Setup(m => m.RouteData).Returns(mockRouteData.Object);
59+
60+
var request = new HttpRequestMessage();
61+
request.SetRequestContext(mockRequestContext.Object);
62+
63+
var mockHttpConfig = new Mock<HttpConfiguration>(MockBehavior.Strict);
64+
65+
var selector = new PascalizedControllerSelector(mockHttpConfig.Object);
66+
67+
// Act
68+
var actual = selector.GetControllerName(request);
69+
70+
// Assert
71+
actual.Should().Be(expectedTransformation);
72+
}
73+
}
74+
}

JSONAPI.Tests/JSONAPI.Tests.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
<HintPath>..\packages\FluentAssertions.3.2.2\lib\net45\FluentAssertions.Core.dll</HintPath>
4646
</Reference>
4747
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
48+
<Reference Include="Moq, Version=4.2.1502.911, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
49+
<SpecificVersion>False</SpecificVersion>
50+
<HintPath>..\packages\Moq.4.2.1502.0911\lib\net40\Moq.dll</HintPath>
51+
</Reference>
4852
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
4953
<SpecificVersion>False</SpecificVersion>
5054
<HintPath>..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
@@ -79,6 +83,7 @@
7983
<Compile Include="Core\MetadataManagerTests.cs" />
8084
<Compile Include="Core\ModelManagerTests.cs" />
8185
<Compile Include="Extensions\TypeExtensionsTests.cs" />
86+
<Compile Include="Http\PascalizedControllerSelectorTests.cs" />
8287
<Compile Include="Json\ErrorSerializerTests.cs" />
8388
<Compile Include="Json\JsonApiMediaFormaterTests.cs" />
8489
<Compile Include="Json\LinkTemplateTests.cs" />

JSONAPI.Tests/packages.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.2" targetFramework="net45" />
55
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.2" targetFramework="net45" />
66
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.2" targetFramework="net45" />
7+
<package id="Moq" version="4.2.1502.0911" targetFramework="net45" />
78
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
89
</packages>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Text.RegularExpressions;
2+
3+
namespace JSONAPI.Extensions
4+
{
5+
internal static class StringExtensions
6+
{
7+
private static readonly Regex PascalizeRegex = new Regex(@"(?:^|_|\-|\.)(.)");
8+
9+
public static string Pascalize(this string word)
10+
{
11+
return PascalizeRegex.Replace(
12+
word,
13+
match => match.Groups[1].Value.ToUpper());
14+
}
15+
}
16+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Net.Http;
2+
using System.Web.Http;
3+
using System.Web.Http.Dispatcher;
4+
using JSONAPI.Extensions;
5+
6+
namespace JSONAPI.Http
7+
{
8+
/// <summary>
9+
/// Chooses a controller based on the pascal-case version of the default controller name
10+
/// </summary>
11+
public class PascalizedControllerSelector : DefaultHttpControllerSelector
12+
{
13+
/// <param name="configuration">The configuration to use</param>
14+
public PascalizedControllerSelector(HttpConfiguration configuration) : base(configuration)
15+
{
16+
}
17+
18+
public override string GetControllerName(HttpRequestMessage request)
19+
{
20+
var baseControllerName = base.GetControllerName(request);
21+
return baseControllerName.Pascalize();
22+
}
23+
}
24+
}

JSONAPI/JSONAPI.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@
7777
<Compile Include="Core\IMaterializer.cs" />
7878
<Compile Include="Core\MetadataManager.cs" />
7979
<Compile Include="Core\ModelManager.cs" />
80+
<Compile Include="Extensions\StringExtensions.cs" />
8081
<Compile Include="Extensions\TypeExtensions.cs" />
8182
<Compile Include="Http\ApiController.cs" />
83+
<Compile Include="Http\PascalizedControllerSelector.cs" />
8284
<Compile Include="Json\ErrorSerializer.cs" />
8385
<Compile Include="Json\GuidErrorIdProvider.cs" />
8486
<Compile Include="Json\IErrorIdProvider.cs" />

0 commit comments

Comments
 (0)