Match one of multiple names in ContainerConnectionDetailsFactory
Closes gh-41543 Co-Authored-By: Eddú Meléndez <eddu.melendez@gmail.com>
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
package org.springframework.boot.testcontainers.service.connection;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -61,7 +62,7 @@ public abstract class ContainerConnectionDetailsFactory<C extends Container<?>,
|
||||
*/
|
||||
protected static final String ANY_CONNECTION_NAME = null;
|
||||
|
||||
private final String connectionName;
|
||||
private final List<String> connectionNames;
|
||||
|
||||
private final String[] requiredClassNames;
|
||||
|
||||
@@ -80,7 +81,19 @@ public abstract class ContainerConnectionDetailsFactory<C extends Container<?>,
|
||||
* @param requiredClassNames the names of classes that must be present
|
||||
*/
|
||||
protected ContainerConnectionDetailsFactory(String connectionName, String... requiredClassNames) {
|
||||
this.connectionName = connectionName;
|
||||
this(Arrays.asList(connectionName), requiredClassNames);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new {@link ContainerConnectionDetailsFactory} instance with the given
|
||||
* supported connection names.
|
||||
* @param connectionNames the supported connection names
|
||||
* @param requiredClassNames the names of classes that must be present
|
||||
* @since 3.4.0
|
||||
*/
|
||||
protected ContainerConnectionDetailsFactory(List<String> connectionNames, String... requiredClassNames) {
|
||||
Assert.notEmpty(connectionNames, "ConnectionNames must contain at least one name");
|
||||
this.connectionNames = connectionNames;
|
||||
this.requiredClassNames = requiredClassNames;
|
||||
}
|
||||
|
||||
@@ -93,8 +106,10 @@ public abstract class ContainerConnectionDetailsFactory<C extends Container<?>,
|
||||
Class<?>[] generics = resolveGenerics();
|
||||
Class<?> containerType = generics[0];
|
||||
Class<?> connectionDetailsType = generics[1];
|
||||
if (source.accepts(this.connectionName, containerType, connectionDetailsType)) {
|
||||
return getContainerConnectionDetails(source);
|
||||
for (String connectionName : this.connectionNames) {
|
||||
if (source.accepts(connectionName, containerType, connectionDetailsType)) {
|
||||
return getContainerConnectionDetails(source);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (NoClassDefFoundError ex) {
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.boot.testcontainers.service.connection;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -34,6 +36,7 @@ import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.core.annotation.MergedAnnotation;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.BDDMockito.then;
|
||||
@@ -83,6 +86,14 @@ class ContainerConnectionDetailsFactoryTests {
|
||||
assertThat(connectionDetails).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void getConnectionDetailsWhenTypesMatchAndNameRestrictionsMatchReturnsDetails() {
|
||||
TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory(
|
||||
List.of("notmyname", "myname"));
|
||||
ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source);
|
||||
assertThat(connectionDetails).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void getConnectionDetailsWhenTypesMatchAndNameRestrictionDoesNotMatchReturnsNull() {
|
||||
TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory("notmyname");
|
||||
@@ -90,6 +101,14 @@ class ContainerConnectionDetailsFactoryTests {
|
||||
assertThat(connectionDetails).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void getConnectionDetailsWhenTypesMatchAndNameRestrictionsDoNotMatchReturnsNull() {
|
||||
TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory(
|
||||
List.of("notmyname", "alsonotmyname"));
|
||||
ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source);
|
||||
assertThat(connectionDetails).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void getConnectionDetailsWhenContainerTypeDoesNotMatchReturnsNull() {
|
||||
ElasticsearchContainer container = mock(ElasticsearchContainer.class);
|
||||
@@ -126,6 +145,18 @@ class ContainerConnectionDetailsFactoryTests {
|
||||
then(context).should().publishEvent(any(BeforeTestcontainerUsedEvent.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void creatingFactoryWithEmptyNamesThrows() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> new TestContainerConnectionDetailsFactory(Collections.emptyList()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void creatingFactoryWithNullNamesThrows() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> new TestContainerConnectionDetailsFactory((List<String>) null));
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
private TestContainerConnectionDetails getConnectionDetails(ConnectionDetailsFactory<?, ?> factory,
|
||||
ContainerConnectionSource<?> source) {
|
||||
@@ -146,6 +177,10 @@ class ContainerConnectionDetailsFactoryTests {
|
||||
super(connectionName);
|
||||
}
|
||||
|
||||
TestContainerConnectionDetailsFactory(List<String> connectionNames) {
|
||||
super(connectionNames);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JdbcConnectionDetails getContainerConnectionDetails(
|
||||
ContainerConnectionSource<JdbcDatabaseContainer<?>> source) {
|
||||
|
||||
Reference in New Issue
Block a user