Skip to content

Commit aa06c0d

Browse files
blancquawilkinsona
authored andcommitted
Add @Serviceconnection support for MongoDBAtlasLocalContainer
Signed-off-by: Wouter Blancquaert <[email protected]> See gh-45310
1 parent 887b064 commit aa06c0d

File tree

5 files changed

+164
-31
lines changed

5 files changed

+164
-31
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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.mongodb.testcontainers;
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.mongodb.autoconfigure.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
32+
* {@link MongoConnectionDetails} from a
33+
* {@link ServiceConnection @ServiceConnection}-annotated {@link T}.
34+
*
35+
* @author Moritz Halbritter
36+
* @author Andy Wilkinson
37+
* @author Phillip Webb
38+
* @author Wouter Blancquaert
39+
*/
40+
abstract class AbstractMongoContainerConnectionDetailsFactory<T extends GenericContainer<T>>
41+
extends ContainerConnectionDetailsFactory<T, MongoConnectionDetails> {
42+
43+
private final Function<T, String> connectionStringFunction;
44+
45+
AbstractMongoContainerConnectionDetailsFactory(Function<T, String> connectionStringFunction) {
46+
super(ANY_CONNECTION_NAME, "com.mongodb.ConnectionString");
47+
this.connectionStringFunction = connectionStringFunction;
48+
}
49+
50+
@Override
51+
protected MongoConnectionDetails getContainerConnectionDetails(ContainerConnectionSource<T> source) {
52+
return new MongoContainerConnectionDetails<>(source, this.connectionStringFunction);
53+
}
54+
55+
/**
56+
* {@link MongoConnectionDetails} backed by a {@link ContainerConnectionSource}.
57+
*/
58+
private static final class MongoContainerConnectionDetails<T extends GenericContainer<T>>
59+
extends ContainerConnectionDetails<T> implements MongoConnectionDetails {
60+
61+
private final Function<T, String> connectionStringFunction;
62+
63+
private MongoContainerConnectionDetails(ContainerConnectionSource<T> source,
64+
Function<T, String> connectionStringFunction) {
65+
super(source);
66+
this.connectionStringFunction = connectionStringFunction;
67+
}
68+
69+
@Override
70+
public ConnectionString getConnectionString() {
71+
return new ConnectionString(this.connectionStringFunction.apply(getContainer()));
72+
}
73+
74+
@Override
75+
public SslBundle getSslBundle() {
76+
return super.getSslBundle();
77+
}
78+
79+
}
80+
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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.mongodb.testcontainers;
18+
19+
import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
20+
21+
import org.springframework.boot.mongodb.autoconfigure.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
28+
* {@link MongoDBAtlasLocalContainer}.
29+
*
30+
* @author Wouter Blancquaert
31+
*/
32+
class MongoAtlasContainerConnectionDetailsFactory
33+
extends AbstractMongoContainerConnectionDetailsFactory<MongoDBAtlasLocalContainer> {
34+
35+
MongoAtlasContainerConnectionDetailsFactory() {
36+
super(MongoDBAtlasLocalContainer::getDatabaseConnectionString);
37+
}
38+
39+
}

spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactory.java

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@
1616

1717
package org.springframework.boot.mongodb.testcontainers;
1818

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

2221
import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails;
2322
import org.springframework.boot.ssl.SslBundle;
2423
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory;
25-
import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource;
2624
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
2725

2826
/**
@@ -34,37 +32,10 @@
3432
* @author Phillip Webb
3533
*/
3634
class MongoContainerConnectionDetailsFactory
37-
extends ContainerConnectionDetailsFactory<MongoDBContainer, MongoConnectionDetails> {
35+
extends AbstractMongoContainerConnectionDetailsFactory<MongoDBContainer> {
3836

3937
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-
38+
super(MongoDBContainer::getReplicaSetUrl);
6839
}
6940

7041
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# Connection Details Factories
22
org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\
33
org.springframework.boot.mongodb.docker.compose.MongoDockerComposeConnectionDetailsFactory,\
4+
org.springframework.boot.mongodb.testcontainers.MongoAtlasContainerConnectionDetailsFactory,\
45
org.springframework.boot.mongodb.testcontainers.MongoContainerConnectionDetailsFactory
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)