Skip to content

Commit 6b295c5

Browse files
authored
Adding public API test coverage for Aspire.Hosting.MongoDB (#5201)
1 parent 1e98134 commit 6b295c5

File tree

3 files changed

+248
-9
lines changed

3 files changed

+248
-9
lines changed

src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ public static class MongoDBBuilderExtensions
2424
/// <returns>A reference to the <see cref="IResourceBuilder{T}"/>.</returns>
2525
public static IResourceBuilder<MongoDBServerResource> AddMongoDB(this IDistributedApplicationBuilder builder, string name, int? port = null)
2626
{
27+
ArgumentNullException.ThrowIfNull(builder);
28+
ArgumentNullException.ThrowIfNull(name);
29+
2730
var mongoDBContainer = new MongoDBServerResource(name);
2831

2932
return builder
@@ -42,6 +45,9 @@ public static IResourceBuilder<MongoDBServerResource> AddMongoDB(this IDistribut
4245
/// <returns>A reference to the <see cref="IResourceBuilder{T}"/>.</returns>
4346
public static IResourceBuilder<MongoDBDatabaseResource> AddDatabase(this IResourceBuilder<MongoDBServerResource> builder, string name, string? databaseName = null)
4447
{
48+
ArgumentNullException.ThrowIfNull(builder);
49+
ArgumentNullException.ThrowIfNull(name);
50+
4551
// Use the resource name as the database name if it's not provided
4652
databaseName ??= name;
4753

@@ -61,6 +67,8 @@ public static IResourceBuilder<MongoDBDatabaseResource> AddDatabase(this IResour
6167
/// <returns>A reference to the <see cref="IResourceBuilder{T}"/>.</returns>
6268
public static IResourceBuilder<T> WithMongoExpress<T>(this IResourceBuilder<T> builder, Action<IResourceBuilder<MongoExpressContainerResource>>? configureContainer = null, string? containerName = null) where T : MongoDBServerResource
6369
{
70+
ArgumentNullException.ThrowIfNull(builder);
71+
6472
containerName ??= $"{builder.Resource.Name}-mongoexpress";
6573

6674
var mongoExpressContainer = new MongoExpressContainerResource(containerName);
@@ -84,6 +92,8 @@ public static IResourceBuilder<T> WithMongoExpress<T>(this IResourceBuilder<T> b
8492
/// <returns>The resource builder for PGAdmin.</returns>
8593
public static IResourceBuilder<MongoExpressContainerResource> WithHostPort(this IResourceBuilder<MongoExpressContainerResource> builder, int? port)
8694
{
95+
ArgumentNullException.ThrowIfNull(builder);
96+
8797
return builder.WithEndpoint("http", endpoint =>
8898
{
8999
endpoint.Port = port;
@@ -98,7 +108,11 @@ public static IResourceBuilder<MongoExpressContainerResource> WithHostPort(this
98108
/// <param name="isReadOnly">A flag that indicates if this is a read-only volume.</param>
99109
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
100110
public static IResourceBuilder<MongoDBServerResource> WithDataVolume(this IResourceBuilder<MongoDBServerResource> builder, string? name = null, bool isReadOnly = false)
101-
=> builder.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/data/db", isReadOnly);
111+
{
112+
ArgumentNullException.ThrowIfNull(builder);
113+
114+
return builder.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/data/db", isReadOnly);
115+
}
102116

103117
/// <summary>
104118
/// Adds a bind mount for the data folder to a MongoDB container resource.
@@ -108,7 +122,12 @@ public static IResourceBuilder<MongoDBServerResource> WithDataVolume(this IResou
108122
/// <param name="isReadOnly">A flag that indicates if this is a read-only mount.</param>
109123
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
110124
public static IResourceBuilder<MongoDBServerResource> WithDataBindMount(this IResourceBuilder<MongoDBServerResource> builder, string source, bool isReadOnly = false)
111-
=> builder.WithBindMount(source, "/data/db", isReadOnly);
125+
{
126+
ArgumentNullException.ThrowIfNull(builder);
127+
ArgumentNullException.ThrowIfNull(source);
128+
129+
return builder.WithBindMount(source, "/data/db", isReadOnly);
130+
}
112131

113132
/// <summary>
114133
/// Adds a bind mount for the init folder to a MongoDB container resource.
@@ -118,7 +137,12 @@ public static IResourceBuilder<MongoDBServerResource> WithDataBindMount(this IRe
118137
/// <param name="isReadOnly">A flag that indicates if this is a read-only mount.</param>
119138
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
120139
public static IResourceBuilder<MongoDBServerResource> WithInitBindMount(this IResourceBuilder<MongoDBServerResource> builder, string source, bool isReadOnly = true)
121-
=> builder.WithBindMount(source, "/docker-entrypoint-initdb.d", isReadOnly);
140+
{
141+
ArgumentNullException.ThrowIfNull(builder);
142+
ArgumentNullException.ThrowIfNull(source);
143+
144+
return builder.WithBindMount(source, "/docker-entrypoint-initdb.d", isReadOnly);
145+
}
122146

123147
private static void ConfigureMongoExpressContainer(EnvironmentCallbackContext context, MongoDBServerResource resource)
124148
{

src/Aspire.Hosting.MongoDB/MongoDBDatabaseResource.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,23 @@ namespace Aspire.Hosting.ApplicationModel;
66
/// <summary>
77
/// A resource that represents a MongoDB database. This is a child resource of a <see cref="MongoDBServerResource"/>.
88
/// </summary>
9-
/// <param name="name">The name of the resource.</param>
10-
/// <param name="databaseName">The database name.</param>
11-
/// <param name="parent">The MongoDB server resource associated with this database.</param>
12-
public class MongoDBDatabaseResource(string name, string databaseName, MongoDBServerResource parent) : Resource(name), IResourceWithParent<MongoDBServerResource>, IResourceWithConnectionString
9+
public class MongoDBDatabaseResource : Resource, IResourceWithParent<MongoDBServerResource>, IResourceWithConnectionString
1310
{
11+
/// <summary>
12+
/// A resource that represents a MongoDB database. This is a child resource of a <see cref="MongoDBServerResource"/>.
13+
/// </summary>
14+
/// <param name="name">The name of the resource.</param>
15+
/// <param name="databaseName">The database name.</param>
16+
/// <param name="parent">The MongoDB server resource associated with this database.</param>
17+
public MongoDBDatabaseResource(string name, string databaseName, MongoDBServerResource parent) : base(name)
18+
{
19+
ArgumentNullException.ThrowIfNull(databaseName);
20+
ArgumentNullException.ThrowIfNull(parent);
21+
22+
Parent = parent;
23+
DatabaseName = databaseName;
24+
}
25+
1426
/// <summary>
1527
/// Gets the connection string expression for the MongoDB database.
1628
/// </summary>
@@ -20,10 +32,10 @@ public ReferenceExpression ConnectionStringExpression
2032
/// <summary>
2133
/// Gets the parent MongoDB container resource.
2234
/// </summary>
23-
public MongoDBServerResource Parent => parent;
35+
public MongoDBServerResource Parent { get; }
2436

2537
/// <summary>
2638
/// Gets the database name.
2739
/// </summary>
28-
public string DatabaseName { get; } = databaseName;
40+
public string DatabaseName { get; }
2941
}
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
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.MongoDB.Tests;
9+
10+
public class MongoDBPublicApiTests
11+
{
12+
[Fact]
13+
public void AddMongoDBContainerShouldThrowWhenBuilderIsNull()
14+
{
15+
IDistributedApplicationBuilder builder = null!;
16+
const string name = "MongoDB";
17+
18+
var action = () => builder.AddMongoDB(name);
19+
20+
var exception = Assert.Throws<ArgumentNullException>(action);
21+
Assert.Equal(nameof(builder), exception.ParamName);
22+
}
23+
24+
[Fact]
25+
public void AddMongoDBContainerShouldThrowWhenNameIsNull()
26+
{
27+
var builder = DistributedApplication.CreateBuilder([]);
28+
string name = null!;
29+
30+
var action = () => builder.AddMongoDB(name);
31+
32+
var exception = Assert.Throws<ArgumentNullException>(action);
33+
Assert.Equal(nameof(name), exception.ParamName);
34+
}
35+
36+
[Fact]
37+
public void AddDatabaseShouldThrowWhenBuilderIsNull()
38+
{
39+
IResourceBuilder<MongoDBServerResource> builder = null!;
40+
const string name = "db1";
41+
42+
var action = () => builder.AddDatabase(name);
43+
44+
var exception = Assert.Throws<ArgumentNullException>(action);
45+
Assert.Equal(nameof(builder), exception.ParamName);
46+
}
47+
48+
[Fact]
49+
public void AddDatabaseShouldThrowWhenNameIsNull()
50+
{
51+
var builderResource = TestDistributedApplicationBuilder.Create();
52+
var MongoDB = builderResource.AddMongoDB("MongoDB");
53+
string name = null!;
54+
55+
var action = () => MongoDB.AddDatabase(name);
56+
57+
var exception = Assert.Throws<ArgumentNullException>(action);
58+
Assert.Equal(nameof(name), exception.ParamName);
59+
}
60+
61+
[Fact]
62+
public void WithDataVolumeShouldThrowWhenBuilderIsNull()
63+
{
64+
IResourceBuilder<MongoDBServerResource> builder = null!;
65+
66+
var action = () => builder.WithDataVolume();
67+
68+
var exception = Assert.Throws<ArgumentNullException>(action);
69+
Assert.Equal(nameof(builder), exception.ParamName);
70+
}
71+
72+
[Fact]
73+
public void WithDataBindMountShouldThrowWhenBuilderIsNull()
74+
{
75+
IResourceBuilder<MongoDBServerResource> builder = null!;
76+
const string source = "/MongoDB/storage";
77+
78+
var action = () => builder.WithDataBindMount(source);
79+
80+
var exception = Assert.Throws<ArgumentNullException>(action);
81+
Assert.Equal(nameof(builder), exception.ParamName);
82+
}
83+
84+
[Fact]
85+
public void WithDataBindMountShouldThrowWhenSourceIsNull()
86+
{
87+
var builderResource = TestDistributedApplicationBuilder.Create();
88+
var MongoDB = builderResource.AddMongoDB("MongoDB");
89+
string source = null!;
90+
91+
var action = () => MongoDB.WithDataBindMount(source);
92+
93+
var exception = Assert.Throws<ArgumentNullException>(action);
94+
Assert.Equal(nameof(source), exception.ParamName);
95+
}
96+
97+
[Fact]
98+
public void WithInitBindMountShouldThrowWhenBuilderIsNull()
99+
{
100+
IResourceBuilder<MongoDBServerResource> builder = null!;
101+
102+
var action = () => builder.WithInitBindMount("init.js");
103+
104+
var exception = Assert.Throws<ArgumentNullException>(action);
105+
Assert.Equal(nameof(builder), exception.ParamName);
106+
}
107+
108+
[Fact]
109+
public void WithMongoExpressShouldThrowWhenBuilderIsNull()
110+
{
111+
IResourceBuilder<MongoDBServerResource> builder = null!;
112+
113+
var action = () => builder.WithMongoExpress();
114+
115+
var exception = Assert.Throws<ArgumentNullException>(action);
116+
Assert.Equal(nameof(builder), exception.ParamName);
117+
}
118+
119+
[Fact]
120+
public void WithInitBindMountShouldThrowWhenSourceIsNull()
121+
{
122+
var builderResource = TestDistributedApplicationBuilder.Create();
123+
var MongoDB = builderResource.AddMongoDB("MongoDB");
124+
string source = null!;
125+
126+
var action = () => MongoDB.WithInitBindMount(source);
127+
128+
var exception = Assert.Throws<ArgumentNullException>(action);
129+
Assert.Equal(nameof(source), exception.ParamName);
130+
}
131+
132+
[Fact]
133+
public void WithHostPortShouldThrowWhenBuilderIsNull()
134+
{
135+
IResourceBuilder<MongoExpressContainerResource> builder = null!;
136+
137+
var action = () => builder.WithHostPort(6601);
138+
139+
var exception = Assert.Throws<ArgumentNullException>(action);
140+
Assert.Equal(nameof(builder), exception.ParamName);
141+
}
142+
143+
[Fact]
144+
public void CtorMongoDBServerResourceShouldThrowWhenNameIsNull()
145+
{
146+
string name = null!;
147+
148+
var action = () => new MongoDBServerResource(name);
149+
150+
var exception = Assert.Throws<ArgumentNullException>(action);
151+
Assert.Equal(nameof(name), exception.ParamName);
152+
}
153+
154+
[Fact]
155+
public void CtorMongoMongoDBDatabaseResourceShouldThrowWhenNameIsNull()
156+
{
157+
string name = null!;
158+
var databaseName = "db1";
159+
var parent = new MongoDBServerResource("mongodb");
160+
161+
var action = () => new MongoDBDatabaseResource(name, databaseName, parent);
162+
163+
var exception = Assert.Throws<ArgumentNullException>(action);
164+
Assert.Equal(nameof(name), exception.ParamName);
165+
}
166+
167+
[Fact]
168+
public void CtorMongoMongoDBDatabaseResourceShouldThrowWhenDatabaseNameIsNull()
169+
{
170+
var name = "mongodb";
171+
string databaseName = null!;
172+
var parent = new MongoDBServerResource(name);
173+
174+
var action = () => new MongoDBDatabaseResource(name, databaseName, parent);
175+
176+
var exception = Assert.Throws<ArgumentNullException>(action);
177+
Assert.Equal(nameof(databaseName), exception.ParamName);
178+
}
179+
180+
[Fact]
181+
public void CtorMongoMongoDBDatabaseResourceShouldThrowWhenDatabaseParentIsNull()
182+
{
183+
var name = "mongodb";
184+
var databaseName = "db1";
185+
MongoDBServerResource parent = null!;
186+
187+
var action = () => new MongoDBDatabaseResource(name, databaseName, parent);
188+
189+
var exception = Assert.Throws<ArgumentNullException>(action);
190+
Assert.Equal(nameof(parent), exception.ParamName);
191+
}
192+
193+
[Fact]
194+
public void CtorMongoExpressContainerResourceShouldThrowWhenNameIsNull()
195+
{
196+
string name = null!;
197+
198+
var action = () => new MongoExpressContainerResource(name);
199+
200+
var exception = Assert.Throws<ArgumentNullException>(action);
201+
Assert.Equal(nameof(name), exception.ParamName);
202+
}
203+
}

0 commit comments

Comments
 (0)