forked from testcontainers/testcontainers-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMongoDBContainerTest.java
More file actions
146 lines (130 loc) · 5.92 KB
/
MongoDBContainerTest.java
File metadata and controls
146 lines (130 loc) · 5.92 KB
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
139
140
141
142
143
144
145
146
package org.testcontainers.containers;
import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference;
import com.mongodb.TransactionOptions;
import com.mongodb.WriteConcern;
import com.mongodb.client.ClientSession;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.TransactionBody;
import org.bson.Document;
import org.junit.Test;
import org.testcontainers.utility.DockerImageName;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.hamcrest.CoreMatchers.endsWith;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
public class MongoDBContainerTest {
/**
* Taken from <a href="https://docs.mongodb.com/manual/core/transactions/">https://docs.mongodb.com</a>
*/
@Test
public void shouldExecuteTransactions() {
try (
// creatingMongoDBContainer {
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
// }
) {
// startingMongoDBContainer {
mongoDBContainer.start();
// }
final String mongoRsUrl = mongoDBContainer.getReplicaSetUrl();
assertNotNull(mongoRsUrl);
final MongoClient mongoSyncClient = MongoClients.create(mongoRsUrl);
mongoSyncClient.getDatabase("mydb1").getCollection("foo")
.withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("abc", 0));
mongoSyncClient.getDatabase("mydb2").getCollection("bar")
.withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("xyz", 0));
final ClientSession clientSession = mongoSyncClient.startSession();
final TransactionOptions txnOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.LOCAL)
.writeConcern(WriteConcern.MAJORITY)
.build();
final String trxResult = "Inserted into collections in different databases";
TransactionBody<String> txnBody = () -> {
final MongoCollection<Document> coll1 =
mongoSyncClient.getDatabase("mydb1").getCollection("foo");
final MongoCollection<Document> coll2 =
mongoSyncClient.getDatabase("mydb2").getCollection("bar");
coll1.insertOne(clientSession, new Document("abc", 1));
coll2.insertOne(clientSession, new Document("xyz", 999));
return trxResult;
};
try {
final String trxResultActual = clientSession.withTransaction(txnBody, txnOptions);
assertEquals(trxResult, trxResultActual);
} catch (RuntimeException re) {
throw new IllegalStateException(re.getMessage(), re);
} finally {
clientSession.close();
mongoSyncClient.close();
}
}
}
@Test
public void supportsMongoDB_4_4() {
try (
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.4"))
) {
mongoDBContainer.start();
}
}
@Test
public void shouldTestDatabaseName() {
try (
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
) {
mongoDBContainer.start();
final String databaseName = "my-db";
assertThat(mongoDBContainer.getReplicaSetUrl(databaseName), endsWith(databaseName));
}
}
@Test
public void shouldTestLoadAndExecuteJsFiles() {
final String file1 = "mongo_init-1.js";
final String file2 = "mongo_init-2.js";
final String targetDir2 = "my-scripts-2/";
final String targetFile1 = "my-scripts-1/" + file1;
final String targetFile2 = targetDir2 + file2;
try (
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
.withClasspathResourceMapping(file1, targetFile1, BindMode.READ_ONLY)
.withClasspathResourceMapping(file2, targetFile2, BindMode.READ_ONLY)
) {
mongoDBContainer.start();
mongoDBContainer.loadAndExecuteJsFiles(targetFile1, targetDir2);
final String mongoRsUrl = mongoDBContainer.getReplicaSetUrl();
assertThat(mongoRsUrl, notNullValue());
try (
final MongoClient mongoSyncClient = MongoClients.create(mongoRsUrl)
) {
assertThat(
mongoSyncClient.getDatabase("test").getCollection("foo").countDocuments(),
is(3L)
);
assertThat(
mongoSyncClient.getDatabase("test").getCollection("bar").countDocuments(),
is(2L)
);
}
assertThatThrownBy(() -> mongoDBContainer.loadAndExecuteJsFiles("non-existed-file"))
.isExactlyInstanceOf(MongoDBContainer.LoadAndExecuteJsFilesException.class);
}
}
@Test
public void shouldNotStartBecauseOfDockerEntrypointInitDirectoryIsNotEmpty() {
try (
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10"))
.withClasspathResourceMapping("mongo_init-1.js", "/docker-entrypoint-initdb.d/mongo_init-1.js", BindMode.READ_ONLY)
) {
assertThatThrownBy(mongoDBContainer::start)
.isExactlyInstanceOf(ContainerLaunchException.class)
.hasRootCauseExactlyInstanceOf(MongoDBContainer.DockerEntrypointInitDirIsNotEmptyException.class);
}
}
}