Skip to content

Commit 82660e3

Browse files
authored
Adding public API test coverage for Aspire.Hosting.Nats (#5129)
* CA1062#Aspire.Hosting.Nats * Remove Address
1 parent 7063d81 commit 82660e3

File tree

3 files changed

+121
-6
lines changed

3 files changed

+121
-6
lines changed

src/Aspire.Hosting.Nats/NatsBuilderExtensions.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public static class NatsBuilderExtensions
2121
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
2222
public static IResourceBuilder<NatsServerResource> AddNats(this IDistributedApplicationBuilder builder, string name, int? port = null)
2323
{
24+
ArgumentNullException.ThrowIfNull(builder);
25+
ArgumentNullException.ThrowIfNull(name);
26+
2427
var nats = new NatsServerResource(name);
2528
return builder.AddResource(nats)
2629
.WithEndpoint(targetPort: 4222, port: port, name: NatsServerResource.PrimaryEndpointName)
@@ -54,7 +57,11 @@ public static IResourceBuilder<NatsServerResource> WithJetStream(this IResourceB
5457
/// <param name="builder">The resource builder.</param>
5558
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
5659
public static IResourceBuilder<NatsServerResource> WithJetStream(this IResourceBuilder<NatsServerResource> builder)
57-
=> builder.WithArgs("-js");
60+
{
61+
ArgumentNullException.ThrowIfNull(builder);
62+
63+
return builder.WithArgs("-js");
64+
}
5865

5966
/// <summary>
6067
/// Adds a named volume for the data folder to a NATS container resource.
@@ -64,8 +71,13 @@ public static IResourceBuilder<NatsServerResource> WithJetStream(this IResourceB
6471
/// <param name="isReadOnly">A flag that indicates if this is a read-only volume.</param>
6572
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
6673
public static IResourceBuilder<NatsServerResource> WithDataVolume(this IResourceBuilder<NatsServerResource> builder, string? name = null, bool isReadOnly = false)
67-
=> builder.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/var/lib/nats", isReadOnly)
68-
.WithArgs("-sd", "/var/lib/nats");
74+
{
75+
ArgumentNullException.ThrowIfNull(builder);
76+
77+
return builder.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/var/lib/nats",
78+
isReadOnly)
79+
.WithArgs("-sd", "/var/lib/nats");
80+
}
6981

7082
/// <summary>
7183
/// Adds a bind mount for the data folder to a NATS container resource.
@@ -75,7 +87,11 @@ public static IResourceBuilder<NatsServerResource> WithDataVolume(this IResource
7587
/// <param name="isReadOnly">A flag that indicates if this is a read-only mount.</param>
7688
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
7789
public static IResourceBuilder<NatsServerResource> WithDataBindMount(this IResourceBuilder<NatsServerResource> builder, string source, bool isReadOnly = false)
78-
=> builder.WithBindMount(source, "/var/lib/nats", isReadOnly)
79-
.WithArgs("-sd", "/var/lib/nats");
90+
{
91+
ArgumentNullException.ThrowIfNull(builder);
92+
ArgumentNullException.ThrowIfNull(source);
8093

94+
return builder.WithBindMount(source, "/var/lib/nats", isReadOnly)
95+
.WithArgs("-sd", "/var/lib/nats");
96+
}
8197
}

src/Aspire.Hosting.Nats/NatsServerResource.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics.CodeAnalysis;
5+
using System.Runtime.CompilerServices;
6+
47
namespace Aspire.Hosting.ApplicationModel;
58

69
/// <summary>
710
/// A resource that represents a NATS server container.
811
/// </summary>
912
/// <param name="name">The name of the resource.</param>
1013

11-
public class NatsServerResource(string name) : ContainerResource(name), IResourceWithConnectionString
14+
public class NatsServerResource(string name) : ContainerResource(ThrowIfNull(name)), IResourceWithConnectionString
1215
{
1316
internal const string PrimaryEndpointName = "tcp";
1417
internal const string PrimaryNatsSchemeName = "nats";
@@ -26,4 +29,7 @@ public class NatsServerResource(string name) : ContainerResource(name), IResourc
2629
public ReferenceExpression ConnectionStringExpression =>
2730
ReferenceExpression.Create(
2831
$"{PrimaryNatsSchemeName}://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}");
32+
33+
private static string ThrowIfNull([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null)
34+
=> argument ?? throw new ArgumentNullException(paramName);
2935
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Aspire.Hosting.ApplicationModel;
5+
using Aspire.Hosting.Utils;
6+
using Xunit;
7+
8+
namespace Aspire.Hosting.Nats.Tests;
9+
10+
public class NatsPublicApiTests
11+
{
12+
[Fact]
13+
public void AddNatsContainerShouldThrowWhenBuilderIsNull()
14+
{
15+
IDistributedApplicationBuilder builder = null!;
16+
const string name = "Nats";
17+
18+
var action = () => builder.AddNats(name);
19+
20+
var exception = Assert.Throws<ArgumentNullException>(action);
21+
Assert.Equal(nameof(builder), exception.ParamName);
22+
}
23+
24+
[Fact]
25+
public void AddNatsContainerShouldThrowWhenNameIsNull()
26+
{
27+
var builder = TestDistributedApplicationBuilder.Create();
28+
string name = null!;
29+
30+
var action = () => builder.AddNats(name);
31+
32+
var exception = Assert.Throws<ArgumentNullException>(action);
33+
Assert.Equal(nameof(name), exception.ParamName);
34+
}
35+
36+
[Fact]
37+
public void WithJetStreamShouldThrowWhenBuilderIsNull()
38+
{
39+
IResourceBuilder<NatsServerResource> builder = null!;
40+
41+
var action = () => builder.WithJetStream();
42+
43+
var exception = Assert.Throws<ArgumentNullException>(action);
44+
Assert.Equal(nameof(builder), exception.ParamName);
45+
}
46+
47+
[Fact]
48+
public void WithDataVolumeShouldThrowWhenBuilderIsNull()
49+
{
50+
IResourceBuilder<NatsServerResource> builder = null!;
51+
52+
var action = () => builder.WithDataVolume();
53+
54+
var exception = Assert.Throws<ArgumentNullException>(action);
55+
Assert.Equal(nameof(builder), exception.ParamName);
56+
}
57+
58+
[Fact]
59+
public void WithDataBindMountShouldThrowWhenBuilderIsNull()
60+
{
61+
IResourceBuilder<NatsServerResource> builder = null!;
62+
const string source = "/data";
63+
64+
var action = () => builder.WithDataBindMount(source);
65+
66+
var exception = Assert.Throws<ArgumentNullException>(action);
67+
Assert.Equal(nameof(builder), exception.ParamName);
68+
}
69+
70+
[Fact]
71+
public void WithDataBindMountShouldThrowWhenSourceIsNull()
72+
{
73+
var builder = TestDistributedApplicationBuilder.Create();
74+
var nats = builder.AddNats("Nats");
75+
string source = null!;
76+
77+
var action = () => nats.WithDataBindMount(source);
78+
79+
var exception = Assert.Throws<ArgumentNullException>(action);
80+
Assert.Equal(nameof(source), exception.ParamName);
81+
}
82+
83+
[Fact]
84+
public void CtorNatsServerResourceShouldThrowWhenNameIsNull()
85+
{
86+
string name = null!;
87+
88+
var action = () => new NatsServerResource(name);
89+
90+
var exception = Assert.Throws<ArgumentNullException>(action);
91+
Assert.Equal(nameof(name), exception.ParamName);
92+
}
93+
}

0 commit comments

Comments
 (0)