Skip to content

Commit 0d9d152

Browse files
committed
Refactor KeycloakRealmResource and enhance validation
The `KeycloakRealmResource` class has been refactored to include null checks in its constructor for parameters `name`, `realmName`, and `parent`. A private field `_parentEndpoint` and a property `ParentEndpoint` have been added. The `Parent` and `RealmName` properties now rely on the constructor for initialization. New unit tests in `KeycloakPublicApiTests.cs` ensure that the constructor throws an `ArgumentNullException` for null parameters. Additional tests validate that the `AddRealm` method correctly handles null values for the builder and realm name, improving input validation across the API.
1 parent 19838eb commit 0d9d152

File tree

2 files changed

+87
-6
lines changed

2 files changed

+87
-6
lines changed

src/Aspire.Hosting.Keycloak/KeycloakRealmResource.cs

+19-6
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,25 @@ namespace Aspire.Hosting.Keycloak;
88
/// <summary>
99
/// Represents a Keycloak Realm resource.
1010
/// </summary>
11-
/// <param name="name">The name of the realm resource.</param>
12-
/// <param name="realmName">The name of the realm.</param>
13-
/// <param name="parent">The Keycloak server resource associated with this database.</param>
14-
public sealed class KeycloakRealmResource(string name, string realmName, KeycloakResource parent) : Resource(name), IResourceWithParent<KeycloakResource>, IResourceWithConnectionString
11+
public sealed class KeycloakRealmResource : Resource, IResourceWithParent<KeycloakResource>, IResourceWithConnectionString
1512
{
1613
private EndpointReference? _parentEndpoint;
14+
15+
/// <summary>
16+
/// Initializes a new instance of the <see cref="KeycloakRealmResource"/> class.
17+
/// </summary>
18+
/// <param name="name">The name of the realm resource.</param>
19+
/// <param name="realmName">The name of the realm.</param>
20+
/// <param name="parent">The Keycloak server resource associated with this database.</param>
21+
public KeycloakRealmResource(string name, string realmName, KeycloakResource parent) : base(name)
22+
{
23+
ArgumentNullException.ThrowIfNull(realmName);
24+
ArgumentNullException.ThrowIfNull(parent);
25+
26+
RealmName = realmName;
27+
Parent = parent;
28+
}
29+
1730
private EndpointReference ParentEndpoint => _parentEndpoint ??= new(Parent, "http");
1831

1932
/// <inheritdoc/>
@@ -96,10 +109,10 @@ public sealed class KeycloakRealmResource(string name, string realmName, Keycloa
96109
public ReferenceExpression RegistrationEndpointExpression => ReferenceExpression.Create($"{ConnectionStringExpression}{RegistrationEndpoint}");
97110

98111
/// <inheritdoc/>
99-
public KeycloakResource Parent { get; } = parent;
112+
public KeycloakResource Parent { get; }
100113

101114
/// <summary>
102115
/// Gets the name of the realm.
103116
/// </summary>
104-
public string RealmName { get; } = realmName;
117+
public string RealmName { get; }
105118
}

tests/Aspire.Hosting.Keycloak.Tests/KeycloakPublicApiTests.cs

+68
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,49 @@ public void CtorKeycloakResourceShouldThrowWhenAdminPasswordIsNull()
3434
Assert.Equal(nameof(adminPassword), exception.ParamName);
3535
}
3636

37+
[Fact]
38+
public void CtorKeycloakRealmResourceShouldThrowWhenNameIsNull()
39+
{
40+
string name = null!;
41+
var realmName = "realm1";
42+
var builder = TestDistributedApplicationBuilder.Create();
43+
var adminPassword = builder.AddParameter("Password");
44+
var parent = new KeycloakResource("keycloak", default(ParameterResource?), adminPassword.Resource);
45+
46+
var action = () => new KeycloakRealmResource(name, realmName, parent);
47+
48+
var exception = Assert.Throws<ArgumentNullException>(action);
49+
Assert.Equal(nameof(name), exception.ParamName);
50+
}
51+
52+
[Fact]
53+
public void CtorMongoKeycloakRealmResourceShouldThrowWhenRealmNameIsNull()
54+
{
55+
var name = "keycloak";
56+
string realmName = null!;
57+
var builder = TestDistributedApplicationBuilder.Create();
58+
var adminPassword = builder.AddParameter("Password");
59+
var parent = new KeycloakResource("keycloak", default(ParameterResource?), adminPassword.Resource);
60+
61+
var action = () => new KeycloakRealmResource(name, realmName, parent);
62+
63+
var exception = Assert.Throws<ArgumentNullException>(action);
64+
Assert.Equal(nameof(realmName), exception.ParamName);
65+
}
66+
67+
[Fact]
68+
public void CtorMongoKeycloakRealmResourceShouldThrowWhenDatabaseParentIsNull()
69+
{
70+
var name = "keycloak";
71+
var realmName = "realm1";
72+
KeycloakResource parent = null!;
73+
74+
var action = () => new KeycloakRealmResource(name, realmName, parent);
75+
76+
var exception = Assert.Throws<ArgumentNullException>(action);
77+
Assert.Equal(nameof(parent), exception.ParamName);
78+
}
79+
3780
[Fact]
3881
public void AddKeycloakContainerShouldThrowWhenBuilderIsNull()
3982
{
@@ -195,4 +238,29 @@ public void WithRealmImportFileAddsBindMountAnnotation(bool? isReadOnly)
195238
Assert.Equal(ContainerMountType.BindMount, containerAnnotation.Type);
196239
Assert.Equal(isReadOnly ?? false, containerAnnotation.IsReadOnly);
197240
}
241+
242+
[Fact]
243+
public void AddRealmShouldThrowWhenBuilderIsNull()
244+
{
245+
IResourceBuilder<KeycloakResource> builder = null!;
246+
const string name = "realm1";
247+
248+
var action = () => builder.AddRealm(name);
249+
250+
var exception = Assert.Throws<ArgumentNullException>(action);
251+
Assert.Equal(nameof(builder), exception.ParamName);
252+
}
253+
254+
[Fact]
255+
public void AddRealmShouldThrowWhenNameIsNull()
256+
{
257+
var builderResource = TestDistributedApplicationBuilder.Create();
258+
var MongoDB = builderResource.AddKeycloak("realm1");
259+
string name = null!;
260+
261+
var action = () => MongoDB.AddRealm(name);
262+
263+
var exception = Assert.Throws<ArgumentNullException>(action);
264+
Assert.Equal(nameof(name), exception.ParamName);
265+
}
198266
}

0 commit comments

Comments
 (0)