Skip to content

Commit 59d2b51

Browse files
authored
Test controller provider (#969)
Registers only the controllers required for a particular test suite, rather than always registering all controllers from the entire test assembly.
1 parent debe4af commit 59d2b51

File tree

97 files changed

+372
-99
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+372
-99
lines changed

src/JsonApiDotNetCore/Middleware/HeaderConstants.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
using JetBrains.Annotations;
2+
13
#pragma warning disable AV1008 // Class should not be static
24

35
namespace JsonApiDotNetCore.Middleware
46
{
7+
[PublicAPI]
58
public static class HeaderConstants
69
{
710
public const string MediaType = "application/vnd.api+json";

src/JsonApiDotNetCore/Middleware/JsonApiRoutingConvention.cs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class JsonApiRoutingConvention : IJsonApiRoutingConvention
3333
{
3434
private readonly IJsonApiOptions _options;
3535
private readonly IResourceContextProvider _resourceContextProvider;
36-
private readonly HashSet<string> _registeredTemplates = new HashSet<string>();
36+
private readonly Dictionary<string, string> _registeredControllerNameByTemplate = new Dictionary<string, string>();
3737
private readonly Dictionary<Type, ResourceContext> _resourceContextPerControllerTypeMap = new Dictionary<Type, ResourceContext>();
3838

3939
public JsonApiRoutingConvention(IJsonApiOptions options, IResourceContextProvider resourceContextProvider)
@@ -89,11 +89,14 @@ public void Apply(ApplicationModel application)
8989

9090
string template = TemplateFromResource(controller) ?? TemplateFromController(controller);
9191

92-
if (template == null)
92+
if (_registeredControllerNameByTemplate.ContainsKey(template))
9393
{
94-
throw new InvalidConfigurationException($"Controllers with overlapping route templates detected: {controller.ControllerType.FullName}");
94+
throw new InvalidConfigurationException(
95+
$"Cannot register '{controller.ControllerType.FullName}' for template '{template}' because '{_registeredControllerNameByTemplate[template]}' was already registered for this template.");
9596
}
9697

98+
_registeredControllerNameByTemplate.Add(template, controller.ControllerType.FullName);
99+
97100
controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel
98101
{
99102
Template = template
@@ -116,10 +119,7 @@ private string TemplateFromResource(ControllerModel model)
116119
{
117120
string template = $"{_options.Namespace}/{resourceContext.PublicName}";
118121

119-
if (_registeredTemplates.Add(template))
120-
{
121-
return template;
122-
}
122+
return template;
123123
}
124124

125125
return null;
@@ -133,12 +133,7 @@ private string TemplateFromController(ControllerModel model)
133133
string controllerName = _options.SerializerNamingStrategy.GetPropertyName(model.ControllerName, false);
134134
string template = $"{_options.Namespace}/{controllerName}";
135135

136-
if (_registeredTemplates.Add(template))
137-
{
138-
return template;
139-
}
140-
141-
return null;
136+
return template;
142137
}
143138

144139
/// <summary>

src/JsonApiDotNetCore/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
[assembly: InternalsVisibleTo("JsonApiDotNetCoreExampleTests")]
55
[assembly: InternalsVisibleTo("UnitTests")]
66
[assembly: InternalsVisibleTo("DiscoveryTests")]
7+
[assembly: InternalsVisibleTo("TestBuildingBlocks")]

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Controllers/AtomicConstrainedOperationsControllerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public AtomicConstrainedOperationsControllerTests(ExampleIntegrationTestContext<
1919
{
2020
_testContext = testContext;
2121

22-
testContext.ConfigureServicesAfterStartup(services => services.AddControllersFromExampleProject());
22+
testContext.UseController<CreateMusicTrackOperationsController>();
2323
}
2424

2525
[Fact]

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using FluentAssertions;
88
using FluentAssertions.Extensions;
99
using JsonApiDotNetCore.Serialization.Objects;
10+
using JsonApiDotNetCoreExample.Controllers;
1011
using JsonApiDotNetCoreExampleTests.Startups;
1112
using Microsoft.EntityFrameworkCore;
1213
using TestBuildingBlocks;
@@ -23,7 +24,7 @@ public AtomicCreateResourceTests(ExampleIntegrationTestContext<TestableStartup<O
2324
{
2425
_testContext = testContext;
2526

26-
testContext.ConfigureServicesAfterStartup(services => services.AddControllersFromExampleProject());
27+
testContext.UseController<OperationsController>();
2728
}
2829

2930
[Fact]

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using FluentAssertions;
66
using JsonApiDotNetCore.Configuration;
77
using JsonApiDotNetCore.Serialization.Objects;
8+
using JsonApiDotNetCoreExample.Controllers;
89
using JsonApiDotNetCoreExampleTests.Startups;
910
using Microsoft.Extensions.DependencyInjection;
1011
using TestBuildingBlocks;
@@ -23,7 +24,7 @@ public AtomicCreateResourceWithClientGeneratedIdTests(
2324
{
2425
_testContext = testContext;
2526

26-
testContext.ConfigureServicesAfterStartup(services => services.AddControllersFromExampleProject());
27+
testContext.UseController<OperationsController>();
2728

2829
var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService<IJsonApiOptions>();
2930
options.AllowClientGeneratedIds = true;

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToManyRelationshipTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66
using FluentAssertions;
77
using JsonApiDotNetCore.Serialization.Objects;
8+
using JsonApiDotNetCoreExample.Controllers;
89
using JsonApiDotNetCoreExampleTests.Startups;
910
using Microsoft.EntityFrameworkCore;
1011
using TestBuildingBlocks;
@@ -23,7 +24,7 @@ public AtomicCreateResourceWithToManyRelationshipTests(
2324
{
2425
_testContext = testContext;
2526

26-
testContext.ConfigureServicesAfterStartup(services => services.AddControllersFromExampleProject());
27+
testContext.UseController<OperationsController>();
2728
}
2829

2930
[Fact]

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToOneRelationshipTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Threading.Tasks;
77
using FluentAssertions;
88
using JsonApiDotNetCore.Serialization.Objects;
9+
using JsonApiDotNetCoreExample.Controllers;
910
using JsonApiDotNetCoreExampleTests.Startups;
1011
using Microsoft.EntityFrameworkCore;
1112
using Newtonsoft.Json;
@@ -25,7 +26,7 @@ public AtomicCreateResourceWithToOneRelationshipTests(
2526
{
2627
_testContext = testContext;
2728

28-
testContext.ConfigureServicesAfterStartup(services => services.AddControllersFromExampleProject());
29+
testContext.UseController<OperationsController>();
2930
}
3031

3132
[Fact]

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Deleting/AtomicDeleteResourceTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Threading.Tasks;
77
using FluentAssertions;
88
using JsonApiDotNetCore.Serialization.Objects;
9+
using JsonApiDotNetCoreExample.Controllers;
910
using JsonApiDotNetCoreExampleTests.Startups;
1011
using Microsoft.EntityFrameworkCore;
1112
using TestBuildingBlocks;
@@ -22,7 +23,7 @@ public AtomicDeleteResourceTests(ExampleIntegrationTestContext<TestableStartup<O
2223
{
2324
_testContext = testContext;
2425

25-
testContext.ConfigureServicesAfterStartup(services => services.AddControllersFromExampleProject());
26+
testContext.UseController<OperationsController>();
2627
}
2728

2829
[Fact]

test/JsonApiDotNetCoreExampleTests/IntegrationTests/AtomicOperations/Links/AtomicAbsoluteLinksTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using FluentAssertions;
55
using JsonApiDotNetCore.Resources;
66
using JsonApiDotNetCore.Serialization.Objects;
7+
using JsonApiDotNetCoreExample.Controllers;
78
using JsonApiDotNetCoreExampleTests.Startups;
89
using Microsoft.Extensions.DependencyInjection;
910
using TestBuildingBlocks;
@@ -22,10 +23,10 @@ public AtomicAbsoluteLinksTests(ExampleIntegrationTestContext<TestableStartup<Op
2223
{
2324
_testContext = testContext;
2425

26+
testContext.UseController<OperationsController>();
27+
2528
testContext.ConfigureServicesAfterStartup(services =>
2629
{
27-
services.AddControllersFromExampleProject();
28-
2930
services.AddScoped(typeof(IResourceChangeTracker<>), typeof(NeverSameResourceChangeTracker<>));
3031
});
3132
}

0 commit comments

Comments
 (0)