Skip to content

Commit 2216b48

Browse files
Match one of multiple names in ContainerConnectionDetailsFactory
Closes gh-41543 Co-Authored-By: Eddú Meléndez <[email protected]>
1 parent 8917c94 commit 2216b48

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.testcontainers.service.connection;
1818

1919
import java.util.Arrays;
20+
import java.util.List;
2021
import java.util.stream.Stream;
2122

2223
import org.apache.commons.logging.Log;
@@ -61,7 +62,7 @@ public abstract class ContainerConnectionDetailsFactory<C extends Container<?>,
6162
*/
6263
protected static final String ANY_CONNECTION_NAME = null;
6364

64-
private final String connectionName;
65+
private final List<String> connectionNames;
6566

6667
private final String[] requiredClassNames;
6768

@@ -80,7 +81,19 @@ protected ContainerConnectionDetailsFactory() {
8081
* @param requiredClassNames the names of classes that must be present
8182
*/
8283
protected ContainerConnectionDetailsFactory(String connectionName, String... requiredClassNames) {
83-
this.connectionName = connectionName;
84+
this(Arrays.asList(connectionName), requiredClassNames);
85+
}
86+
87+
/**
88+
* Create a new {@link ContainerConnectionDetailsFactory} instance with the given
89+
* supported connection names.
90+
* @param connectionNames the supported connection names
91+
* @param requiredClassNames the names of classes that must be present
92+
* @since 3.4.0
93+
*/
94+
protected ContainerConnectionDetailsFactory(List<String> connectionNames, String... requiredClassNames) {
95+
Assert.notEmpty(connectionNames, "ConnectionNames must contain at least one name");
96+
this.connectionNames = connectionNames;
8497
this.requiredClassNames = requiredClassNames;
8598
}
8699

@@ -93,8 +106,10 @@ public final D getConnectionDetails(ContainerConnectionSource<C> source) {
93106
Class<?>[] generics = resolveGenerics();
94107
Class<?> containerType = generics[0];
95108
Class<?> connectionDetailsType = generics[1];
96-
if (source.accepts(this.connectionName, containerType, connectionDetailsType)) {
97-
return getContainerConnectionDetails(source);
109+
for (String connectionName : this.connectionNames) {
110+
if (source.accepts(connectionName, containerType, connectionDetailsType)) {
111+
return getContainerConnectionDetails(source);
112+
}
98113
}
99114
}
100115
catch (NoClassDefFoundError ex) {

spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactoryTests.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

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

19+
import java.util.Collections;
20+
import java.util.List;
1921
import java.util.Map;
2022

2123
import org.junit.jupiter.api.BeforeEach;
@@ -34,6 +36,7 @@
3436
import org.springframework.core.annotation.MergedAnnotation;
3537

3638
import static org.assertj.core.api.Assertions.assertThat;
39+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3740
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
3841
import static org.mockito.ArgumentMatchers.any;
3942
import static org.mockito.BDDMockito.then;
@@ -83,13 +86,29 @@ void getConnectionDetailsWhenTypesMatchAndNameRestrictionMatchesReturnsDetails()
8386
assertThat(connectionDetails).isNotNull();
8487
}
8588

89+
@Test
90+
void getConnectionDetailsWhenTypesMatchAndNameRestrictionsMatchReturnsDetails() {
91+
TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory(
92+
List.of("notmyname", "myname"));
93+
ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source);
94+
assertThat(connectionDetails).isNotNull();
95+
}
96+
8697
@Test
8798
void getConnectionDetailsWhenTypesMatchAndNameRestrictionDoesNotMatchReturnsNull() {
8899
TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory("notmyname");
89100
ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source);
90101
assertThat(connectionDetails).isNull();
91102
}
92103

104+
@Test
105+
void getConnectionDetailsWhenTypesMatchAndNameRestrictionsDoNotMatchReturnsNull() {
106+
TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory(
107+
List.of("notmyname", "alsonotmyname"));
108+
ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source);
109+
assertThat(connectionDetails).isNull();
110+
}
111+
93112
@Test
94113
void getConnectionDetailsWhenContainerTypeDoesNotMatchReturnsNull() {
95114
ElasticsearchContainer container = mock(ElasticsearchContainer.class);
@@ -126,6 +145,18 @@ void getContainerWhenInitializedPublishesEventAndReturnsSuppliedContainer() thro
126145
then(context).should().publishEvent(any(BeforeTestcontainerUsedEvent.class));
127146
}
128147

148+
@Test
149+
void creatingFactoryWithEmptyNamesThrows() {
150+
assertThatIllegalArgumentException()
151+
.isThrownBy(() -> new TestContainerConnectionDetailsFactory(Collections.emptyList()));
152+
}
153+
154+
@Test
155+
void creatingFactoryWithNullNamesThrows() {
156+
assertThatIllegalArgumentException()
157+
.isThrownBy(() -> new TestContainerConnectionDetailsFactory((List<String>) null));
158+
}
159+
129160
@SuppressWarnings({ "rawtypes", "unchecked" })
130161
private TestContainerConnectionDetails getConnectionDetails(ConnectionDetailsFactory<?, ?> factory,
131162
ContainerConnectionSource<?> source) {
@@ -146,6 +177,10 @@ static class TestContainerConnectionDetailsFactory
146177
super(connectionName);
147178
}
148179

180+
TestContainerConnectionDetailsFactory(List<String> connectionNames) {
181+
super(connectionNames);
182+
}
183+
149184
@Override
150185
protected JdbcConnectionDetails getContainerConnectionDetails(
151186
ContainerConnectionSource<JdbcDatabaseContainer<?>> source) {

0 commit comments

Comments
 (0)