Skip to content

Commit 0bac948

Browse files
blancquaWouter Blancquaert
authored and
Wouter Blancquaert
committed
Add @ServiceContext support for MongoDB Atlas
Signed-off-by: Wouter Blancquaert <[email protected]>
1 parent c6045c3 commit 0bac948

File tree

5 files changed

+161
-32
lines changed

5 files changed

+161
-32
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.testcontainers.service.connection.mongo;
18+
19+
import java.util.function.Function;
20+
21+
import com.mongodb.ConnectionString;
22+
import org.testcontainers.containers.GenericContainer;
23+
24+
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
25+
import org.springframework.boot.ssl.SslBundle;
26+
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
27+
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
28+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
29+
30+
/**
31+
* Abstract {@link ContainerConnectionDetailsFactory} to create {@link MongoConnectionDetails} from
32+
* a {@link ServiceConnection @ServiceConnection}-annotated {@link T}.
33+
*
34+
* @author Moritz Halbritter
35+
* @author Andy Wilkinson
36+
* @author Phillip Webb
37+
* @author Wouter Blancquaert
38+
*/
39+
abstract class AbstractMongoContainerConnectionDetailsFactory<T extends GenericContainer<T>>
40+
extends ContainerConnectionDetailsFactory<T, MongoConnectionDetails> {
41+
42+
private final Function<T, String> connectionStringFunction;
43+
44+
AbstractMongoContainerConnectionDetailsFactory(Function<T, String> connectionStringFunction) {
45+
super(ANY_CONNECTION_NAME, "com.mongodb.ConnectionString");
46+
this.connectionStringFunction = connectionStringFunction;
47+
}
48+
49+
@Override
50+
protected MongoConnectionDetails getContainerConnectionDetails(ContainerConnectionSource<T> source) {
51+
return new MongoContainerConnectionDetails<>(source, this.connectionStringFunction);
52+
}
53+
54+
/**
55+
* {@link MongoConnectionDetails} backed by a {@link ContainerConnectionSource}.
56+
*/
57+
private static final class MongoContainerConnectionDetails<T extends GenericContainer<T>> extends ContainerConnectionDetails<T>
58+
implements MongoConnectionDetails {
59+
60+
private final Function<T, String> connectionStringFunction;
61+
62+
private MongoContainerConnectionDetails(ContainerConnectionSource<T> source, Function<T, String> connectionStringFunction) {
63+
super(source);
64+
this.connectionStringFunction = connectionStringFunction;
65+
}
66+
67+
@Override
68+
public ConnectionString getConnectionString() {
69+
return new ConnectionString(this.connectionStringFunction.apply(getContainer()));
70+
}
71+
72+
@Override
73+
public SslBundle getSslBundle() {
74+
return super.getSslBundle();
75+
}
76+
77+
}
78+
79+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.testcontainers.service.connection.mongo;
18+
19+
import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
20+
21+
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
22+
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
23+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
24+
25+
/**
26+
* {@link ContainerConnectionDetailsFactory} to create {@link MongoConnectionDetails} from
27+
* a {@link ServiceConnection @ServiceConnection}-annotated {@link MongoDBAtlasLocalContainer}.
28+
*
29+
* @author Wouter Blancquaert
30+
*/
31+
class MongoAtlasContainerConnectionDetailsFactory
32+
extends AbstractMongoContainerConnectionDetailsFactory<MongoDBAtlasLocalContainer> {
33+
34+
MongoAtlasContainerConnectionDetailsFactory() {
35+
super(MongoDBAtlasLocalContainer::getDatabaseConnectionString);
36+
}
37+
38+
}

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/mongo/MongoContainerConnectionDetailsFactory.java

+2-32
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@
1616

1717
package org.springframework.boot.testcontainers.service.connection.mongo;
1818

19-
import com.mongodb.ConnectionString;
2019
import org.testcontainers.containers.MongoDBContainer;
2120

2221
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
23-
import org.springframework.boot.ssl.SslBundle;
2422
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
25-
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
2623
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
2724

2825
/**
@@ -34,37 +31,10 @@
3431
* @author Phillip Webb
3532
*/
3633
class MongoContainerConnectionDetailsFactory
37-
extends ContainerConnectionDetailsFactory<MongoDBContainer, MongoConnectionDetails> {
34+
extends AbstractMongoContainerConnectionDetailsFactory<MongoDBContainer> {
3835

3936
MongoContainerConnectionDetailsFactory() {
40-
super(ANY_CONNECTION_NAME, "com.mongodb.ConnectionString");
41-
}
42-
43-
@Override
44-
protected MongoConnectionDetails getContainerConnectionDetails(ContainerConnectionSource<MongoDBContainer> source) {
45-
return new MongoContainerConnectionDetails(source);
46-
}
47-
48-
/**
49-
* {@link MongoConnectionDetails} backed by a {@link ContainerConnectionSource}.
50-
*/
51-
private static final class MongoContainerConnectionDetails extends ContainerConnectionDetails<MongoDBContainer>
52-
implements MongoConnectionDetails {
53-
54-
private MongoContainerConnectionDetails(ContainerConnectionSource<MongoDBContainer> source) {
55-
super(source);
56-
}
57-
58-
@Override
59-
public ConnectionString getConnectionString() {
60-
return new ConnectionString(getContainer().getReplicaSetUrl());
61-
}
62-
63-
@Override
64-
public SslBundle getSslBundle() {
65-
return super.getSslBundle();
66-
}
67-
37+
super(MongoDBContainer::getReplicaSetUrl);
6838
}
6939

7040
}

spring-boot-project/spring-boot-testcontainers/src/main/resources/META-INF/spring.factories

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ org.springframework.boot.testcontainers.service.connection.ldap.LLdapContainerCo
2626
org.springframework.boot.testcontainers.service.connection.ldap.OpenLdapContainerConnectionDetailsFactory,\
2727
org.springframework.boot.testcontainers.service.connection.liquibase.LiquibaseContainerConnectionDetailsFactory,\
2828
org.springframework.boot.testcontainers.service.connection.mongo.MongoContainerConnectionDetailsFactory,\
29+
org.springframework.boot.testcontainers.service.connection.mongo.MongoAtlasContainerConnectionDetailsFactory,\
2930
org.springframework.boot.testcontainers.service.connection.neo4j.Neo4jContainerConnectionDetailsFactory,\
3031
org.springframework.boot.testcontainers.service.connection.otlp.GrafanaOpenTelemetryLoggingContainerConnectionDetailsFactory,\
3132
org.springframework.boot.testcontainers.service.connection.otlp.GrafanaOpenTelemetryMetricsContainerConnectionDetailsFactory,\
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.testcontainers.service.connection.mongo;
18+
19+
import com.mongodb.ConnectionString;
20+
import org.junit.jupiter.api.Test;
21+
22+
import org.springframework.aot.hint.RuntimeHints;
23+
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
24+
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactoryHints;
25+
26+
import static org.assertj.core.api.Assertions.assertThat;
27+
28+
/**
29+
* Tests for {@link MongoAtlasContainerConnectionDetailsFactoryTests}.
30+
*
31+
* @author Wouter Blancquaert
32+
*/
33+
class MongoAtlasContainerConnectionDetailsFactoryTests {
34+
35+
@Test
36+
void shouldRegisterHints() {
37+
RuntimeHints hints = ContainerConnectionDetailsFactoryHints.getRegisteredHints(getClass().getClassLoader());
38+
assertThat(RuntimeHintsPredicates.reflection().onType(ConnectionString.class)).accepts(hints);
39+
}
40+
41+
}

0 commit comments

Comments
 (0)