Skip to content

Commit fdcc31c

Browse files
authored
Support mongodb/mongodb-community-server and mongodb/mongodb-enterprise-server (#8386)
1 parent 7bedef7 commit fdcc31c

File tree

4 files changed

+146
-89
lines changed

4 files changed

+146
-89
lines changed

modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
/**
1414
* Testcontainers implementation for MongoDB.
1515
* <p>
16-
* Supported image: {@code mongo}
16+
* Supported images: {@code mongo}, {@code mongodb/mongodb-community-server}, {@code mongodb/mongodb-enterprise-server}
1717
* <p>
1818
* Exposed ports: 27017
1919
*/
@@ -22,6 +22,14 @@ public class MongoDBContainer extends GenericContainer<MongoDBContainer> {
2222

2323
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mongo");
2424

25+
private static final DockerImageName COMMUNITY_SERVER_IMAGE = DockerImageName.parse(
26+
"mongodb/mongodb-community-server"
27+
);
28+
29+
private static final DockerImageName ENTERPRISE_SERVER_IMAGE = DockerImageName.parse(
30+
"mongodb/mongodb-enterprise-server"
31+
);
32+
2533
private static final String DEFAULT_TAG = "4.0.10";
2634

2735
private static final int CONTAINER_EXIT_CODE_OK = 0;
@@ -48,7 +56,7 @@ public MongoDBContainer(@NonNull final String dockerImageName) {
4856

4957
public MongoDBContainer(final DockerImageName dockerImageName) {
5058
super(dockerImageName);
51-
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
59+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, COMMUNITY_SERVER_IMAGE, ENTERPRISE_SERVER_IMAGE);
5260
}
5361

5462
@Override
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.testcontainers.containers;
2+
3+
import com.mongodb.ReadConcern;
4+
import com.mongodb.ReadPreference;
5+
import com.mongodb.TransactionOptions;
6+
import com.mongodb.WriteConcern;
7+
import com.mongodb.client.ClientSession;
8+
import com.mongodb.client.MongoClient;
9+
import com.mongodb.client.MongoClients;
10+
import com.mongodb.client.MongoCollection;
11+
import com.mongodb.client.TransactionBody;
12+
import org.bson.Document;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
public class AbstractMongo {
17+
18+
protected void executeTx(MongoDBContainer mongoDBContainer) {
19+
final MongoClient mongoSyncClientBase = MongoClients.create(mongoDBContainer.getConnectionString());
20+
final MongoClient mongoSyncClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl());
21+
mongoSyncClient
22+
.getDatabase("mydb1")
23+
.getCollection("foo")
24+
.withWriteConcern(WriteConcern.MAJORITY)
25+
.insertOne(new Document("abc", 0));
26+
mongoSyncClient
27+
.getDatabase("mydb2")
28+
.getCollection("bar")
29+
.withWriteConcern(WriteConcern.MAJORITY)
30+
.insertOne(new Document("xyz", 0));
31+
mongoSyncClientBase
32+
.getDatabase("mydb3")
33+
.getCollection("baz")
34+
.withWriteConcern(WriteConcern.MAJORITY)
35+
.insertOne(new Document("def", 0));
36+
37+
final ClientSession clientSession = mongoSyncClient.startSession();
38+
final TransactionOptions txnOptions = TransactionOptions
39+
.builder()
40+
.readPreference(ReadPreference.primary())
41+
.readConcern(ReadConcern.LOCAL)
42+
.writeConcern(WriteConcern.MAJORITY)
43+
.build();
44+
45+
final String trxResult = "Inserted into collections in different databases";
46+
47+
TransactionBody<String> txnBody = () -> {
48+
final MongoCollection<Document> coll1 = mongoSyncClient.getDatabase("mydb1").getCollection("foo");
49+
final MongoCollection<Document> coll2 = mongoSyncClient.getDatabase("mydb2").getCollection("bar");
50+
51+
coll1.insertOne(clientSession, new Document("abc", 1));
52+
coll2.insertOne(clientSession, new Document("xyz", 999));
53+
return trxResult;
54+
};
55+
56+
try {
57+
final String trxResultActual = clientSession.withTransaction(txnBody, txnOptions);
58+
assertThat(trxResultActual).isEqualTo(trxResult);
59+
} catch (RuntimeException re) {
60+
throw new IllegalStateException(re.getMessage(), re);
61+
} finally {
62+
clientSession.close();
63+
mongoSyncClient.close();
64+
}
65+
}
66+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.testcontainers.containers;
2+
3+
import com.mongodb.client.MongoClient;
4+
import com.mongodb.client.MongoClients;
5+
import org.bson.Document;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.junit.runners.Parameterized;
9+
10+
import static org.assertj.core.api.Assertions.assertThat;
11+
12+
@RunWith(Parameterized.class)
13+
public class CompatibleImageTest extends AbstractMongo {
14+
15+
private final String image;
16+
17+
public CompatibleImageTest(String image) {
18+
this.image = image;
19+
}
20+
21+
@Parameterized.Parameters(name = "{0}")
22+
public static String[] image() {
23+
return new String[] {
24+
"mongo:7",
25+
"mongodb/mongodb-community-server:7.0.2-ubi8",
26+
"mongodb/mongodb-enterprise-server:7.0.0-ubi8",
27+
};
28+
}
29+
30+
@Test
31+
public void shouldExecuteTransactions() {
32+
try (
33+
// creatingMongoDBContainer {
34+
final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10")
35+
// }
36+
) {
37+
// startingMongoDBContainer {
38+
mongoDBContainer.start();
39+
// }
40+
executeTx(mongoDBContainer);
41+
}
42+
}
43+
44+
@Test
45+
public void shouldSupportSharding() {
46+
try (final MongoDBContainer mongoDBContainer = new MongoDBContainer(this.image).withSharding()) {
47+
mongoDBContainer.start();
48+
final MongoClient mongoClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl());
49+
50+
mongoClient.getDatabase("mydb1").getCollection("foo").insertOne(new Document("abc", 0));
51+
52+
Document shards = mongoClient.getDatabase("config").getCollection("shards").find().first();
53+
assertThat(shards).isNotNull();
54+
assertThat(shards).isNotEmpty();
55+
assertThat(isReplicaSet(mongoClient)).isFalse();
56+
}
57+
}
58+
59+
private boolean isReplicaSet(MongoClient mongoClient) {
60+
return runIsMaster(mongoClient).get("setName") != null;
61+
}
62+
63+
private Document runIsMaster(MongoClient mongoClient) {
64+
return mongoClient.getDatabase("admin").runCommand(new Document("ismaster", 1));
65+
}
66+
}
Lines changed: 4 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
11
package org.testcontainers.containers;
22

3-
import com.mongodb.ReadConcern;
4-
import com.mongodb.ReadPreference;
5-
import com.mongodb.TransactionOptions;
6-
import com.mongodb.WriteConcern;
7-
import com.mongodb.client.ClientSession;
8-
import com.mongodb.client.MongoClient;
9-
import com.mongodb.client.MongoClients;
10-
import com.mongodb.client.MongoCollection;
11-
import com.mongodb.client.TransactionBody;
12-
import org.bson.Document;
133
import org.junit.Test;
14-
import org.testcontainers.utility.DockerImageName;
154

165
import static org.assertj.core.api.Assertions.assertThat;
176

18-
public class MongoDBContainerTest {
7+
public class MongoDBContainerTest extends AbstractMongo {
198

209
/**
2110
* Taken from <a href="https://docs.mongodb.com/manual/core/transactions/">https://docs.mongodb.com</a>
@@ -24,7 +13,7 @@ public class MongoDBContainerTest {
2413
public void shouldExecuteTransactions() {
2514
try (
2615
// creatingMongoDBContainer {
27-
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
16+
final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10")
2817
// }
2918
) {
3019
// startingMongoDBContainer {
@@ -34,91 +23,19 @@ public void shouldExecuteTransactions() {
3423
}
3524
}
3625

37-
private void executeTx(MongoDBContainer mongoDBContainer) {
38-
final MongoClient mongoSyncClientBase = MongoClients.create(mongoDBContainer.getConnectionString());
39-
final MongoClient mongoSyncClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl());
40-
mongoSyncClient
41-
.getDatabase("mydb1")
42-
.getCollection("foo")
43-
.withWriteConcern(WriteConcern.MAJORITY)
44-
.insertOne(new Document("abc", 0));
45-
mongoSyncClient
46-
.getDatabase("mydb2")
47-
.getCollection("bar")
48-
.withWriteConcern(WriteConcern.MAJORITY)
49-
.insertOne(new Document("xyz", 0));
50-
mongoSyncClientBase
51-
.getDatabase("mydb3")
52-
.getCollection("baz")
53-
.withWriteConcern(WriteConcern.MAJORITY)
54-
.insertOne(new Document("def", 0));
55-
56-
final ClientSession clientSession = mongoSyncClient.startSession();
57-
final TransactionOptions txnOptions = TransactionOptions
58-
.builder()
59-
.readPreference(ReadPreference.primary())
60-
.readConcern(ReadConcern.LOCAL)
61-
.writeConcern(WriteConcern.MAJORITY)
62-
.build();
63-
64-
final String trxResult = "Inserted into collections in different databases";
65-
66-
TransactionBody<String> txnBody = () -> {
67-
final MongoCollection<Document> coll1 = mongoSyncClient.getDatabase("mydb1").getCollection("foo");
68-
final MongoCollection<Document> coll2 = mongoSyncClient.getDatabase("mydb2").getCollection("bar");
69-
70-
coll1.insertOne(clientSession, new Document("abc", 1));
71-
coll2.insertOne(clientSession, new Document("xyz", 999));
72-
return trxResult;
73-
};
74-
75-
try {
76-
final String trxResultActual = clientSession.withTransaction(txnBody, txnOptions);
77-
assertThat(trxResultActual).isEqualTo(trxResult);
78-
} catch (RuntimeException re) {
79-
throw new IllegalStateException(re.getMessage(), re);
80-
} finally {
81-
clientSession.close();
82-
mongoSyncClient.close();
83-
}
84-
}
85-
8626
@Test
8727
public void supportsMongoDB_4_4() {
88-
try (final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.4"))) {
28+
try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4")) {
8929
mongoDBContainer.start();
9030
}
9131
}
9232

9333
@Test
9434
public void shouldTestDatabaseName() {
95-
try (final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))) {
35+
try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10")) {
9636
mongoDBContainer.start();
9737
final String databaseName = "my-db";
9838
assertThat(mongoDBContainer.getReplicaSetUrl(databaseName)).endsWith(databaseName);
9939
}
10040
}
101-
102-
@Test
103-
public void shouldSupportSharding() {
104-
try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:6").withSharding()) {
105-
mongoDBContainer.start();
106-
final MongoClient mongoClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl());
107-
108-
mongoClient.getDatabase("mydb1").getCollection("foo").insertOne(new Document("abc", 0));
109-
110-
Document shards = mongoClient.getDatabase("config").getCollection("shards").find().first();
111-
assertThat(shards).isNotNull();
112-
assertThat(shards).isNotEmpty();
113-
assertThat(isReplicaSet(mongoClient)).isFalse();
114-
}
115-
}
116-
117-
private boolean isReplicaSet(MongoClient mongoClient) {
118-
return runIsMaster(mongoClient).get("setName") != null;
119-
}
120-
121-
private Document runIsMaster(MongoClient mongoClient) {
122-
return mongoClient.getDatabase("admin").runCommand(new Document("ismaster", 1));
123-
}
12441
}

0 commit comments

Comments
 (0)