-
-
Notifications
You must be signed in to change notification settings - Fork 298
/
Copy pathMongoDbContainerTest.cs
138 lines (118 loc) · 4.15 KB
/
MongoDbContainerTest.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
namespace Testcontainers.MongoDb;
public abstract class MongoDbContainerTest : IAsyncLifetime
{
private readonly MongoDbContainer _mongoDbContainer;
private readonly bool _replicaSetEnabled;
private MongoDbContainerTest(MongoDbContainer mongoDbContainer, bool replicaSetEnabled = false)
{
_mongoDbContainer = mongoDbContainer;
_replicaSetEnabled = replicaSetEnabled;
}
// # --8<-- [start:UseMongoDbContainer]
public Task InitializeAsync()
{
return _mongoDbContainer.StartAsync();
}
public Task DisposeAsync()
{
return _mongoDbContainer.DisposeAsync().AsTask();
}
[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public void ConnectionStateReturnsOpen()
{
// Given
var client = new MongoClient(_mongoDbContainer.GetConnectionString());
// When
using var databases = client.ListDatabases();
// Then
Assert.Contains(databases.ToEnumerable(), database => database.TryGetValue("name", out var name) && "admin".Equals(name.AsString));
}
[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public async Task ExecScriptReturnsSuccessful()
{
// Given
const string scriptContent = "printjson(db.adminCommand({listDatabases:1,nameOnly:true,filter:{\"name\":/^admin/}}));";
// When
var execResult = await _mongoDbContainer.ExecScriptAsync(scriptContent)
.ConfigureAwait(true);
// Then
Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr);
Assert.Empty(execResult.Stderr);
}
// # --8<-- [end:UseMongoDbContainer]
[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public async Task ReplicaSetStatus()
{
// Given
const string scriptContent = "rs.status().ok;";
// When
var execResult = await _mongoDbContainer.ExecScriptAsync(scriptContent)
.ConfigureAwait(true);
// Then
if (_replicaSetEnabled)
{
Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr);
Assert.Empty(execResult.Stderr);
}
else
{
Assert.Equal(1L, execResult.ExitCode);
Assert.Equal("MongoServerError: not running with --replSet\n", execResult.Stderr);
}
}
// # --8<-- [start:CreateMongoDbContainer]
[UsedImplicitly]
public sealed class MongoDbDefaultConfiguration : MongoDbContainerTest
{
public MongoDbDefaultConfiguration()
: base(new MongoDbBuilder().Build())
{
}
}
[UsedImplicitly]
public sealed class MongoDbNoAuthConfiguration : MongoDbContainerTest
{
public MongoDbNoAuthConfiguration()
: base(new MongoDbBuilder().WithUsername(string.Empty).WithPassword(string.Empty).Build())
{
}
}
// # --8<-- [end:CreateMongoDbContainer]
[UsedImplicitly]
public sealed class MongoDbV5Configuration : MongoDbContainerTest
{
public MongoDbV5Configuration()
: base(new MongoDbBuilder().WithImage("mongo:5.0").Build())
{
}
}
[UsedImplicitly]
public sealed class MongoDbV4Configuration : MongoDbContainerTest
{
public MongoDbV4Configuration()
: base(new MongoDbBuilder().WithImage("mongo:4.4").Build(), true /* Replica set status returns "ok" in MongoDB 4.4 without initialization. */)
{
}
}
[UsedImplicitly]
public sealed class MongoDbReplicaSetDefaultConfiguration : MongoDbContainerTest
{
public MongoDbReplicaSetDefaultConfiguration()
: base(new MongoDbBuilder().WithReplicaSet().Build(), true)
{
}
}
// # --8<-- [start:ReplicaSetContainerConfiguration]
[UsedImplicitly]
public sealed class MongoDbNamedReplicaSetConfiguration : MongoDbContainerTest
{
public MongoDbNamedReplicaSetConfiguration()
: base(new MongoDbBuilder().WithReplicaSet("rs1").Build(), true)
{
}
}
// # --8<-- [end:ReplicaSetContainerConfiguration]
}