Use MongoDBAtlasLocalContainer from Testcontainers 1.20.2

Testcontainers 1.20.2 offers `MongoDBAtlasLocalContainer`. Previous
image used during tests was pulling images in every execution. The
new image is cached locally and can be executed offline.
This commit is contained in:
Eddú Meléndez
2024-09-30 18:19:32 -06:00
committed by Mark Pollack
parent bb88e2f2de
commit e58341a447
6 changed files with 23 additions and 56 deletions

View File

@@ -494,6 +494,13 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<version>1.20.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>qdrant</artifactId>

View File

@@ -18,13 +18,10 @@ package org.springframework.ai.autoconfigure.vectorstore.mongo;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.ai.autoconfigure.vectorstore.observation.ObservationTestUtil.assertObservationRegistry;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration;
@@ -33,7 +30,6 @@ import org.springframework.ai.document.Document;
import org.springframework.ai.observation.conventions.VectorStoreProvider;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.filter.Filter;
import org.springframework.ai.vectorstore.filter.FilterExpressionBuilder;
import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -44,12 +40,11 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import io.micrometer.observation.tck.TestObservationRegistry;
import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
/**
* @author Eddú Meléndez
@@ -62,12 +57,7 @@ import io.micrometer.observation.tck.TestObservationRegistry;
class MongoDBAtlasVectorStoreAutoConfigurationIT {
@Container
static GenericContainer<?> mongo = new GenericContainer<>("mongodb/atlas:v1.24.0").withPrivilegedMode(true)
.withCommand("/bin/bash", "-c",
"atlas deployments setup local-test --type local --port 27778 --bindIpAll --username root --password root --force && tail -f /dev/null")
.withExposedPorts(27778)
.waitingFor(Wait.forLogMessage(".*Deployment created!.*\\n", 1))
.withStartupTimeout(Duration.ofMinutes(5));
static MongoDBAtlasLocalContainer mongo = new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9");
List<Document> documents = List.of(
new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!",
@@ -94,9 +84,7 @@ class MongoDBAtlasVectorStoreAutoConfigurationIT {
// "spring.ai.vectorstore.mongodb.path-name=testembedding",
"spring.ai.vectorstore.mongodb.index-name=text_index",
"spring.ai.openai.api-key=" + System.getenv("OPENAI_API_KEY"),
String.format(
"spring.data.mongodb.uri=" + String.format("mongodb://root:root@%s:%s/?directConnection=true",
mongo.getHost(), mongo.getMappedPort(27778))));
String.format("spring.data.mongodb.uri=" + mongo.getConnectionString()));
@Test
public void addAndSearch() {

View File

@@ -53,6 +53,11 @@
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency><dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<version>1.20.2</version>
<scope>test</scope>
</dependency>
<dependency>

View File

@@ -1,39 +0,0 @@
/*
* Copyright 2023 - 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.vectorstore;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import java.time.Duration;
public class MongoDBAtlasContainer extends GenericContainer<MongoDBAtlasContainer> {
public MongoDBAtlasContainer() {
super("mongodb/atlas:v1.15.1");
withPrivilegedMode(true);
withCommand("/bin/bash", "-c",
"atlas deployments setup local-test --type local --port 27778 --bindIpAll --username root --password root --force && tail -f /dev/null");
withExposedPorts(27778);
waitingFor(Wait.forLogMessage(".*Deployment created!.*\\n", 1));
withStartupTimeout(Duration.ofMinutes(5));
}
public String getConnectionString() {
return String.format("mongodb://root:root@%s:%s/?directConnection=true", getHost(), getMappedPort(27778));
}
}

View File

@@ -36,6 +36,7 @@ import org.springframework.util.MimeType;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
import java.util.Arrays;
import java.util.Collections;
@@ -49,12 +50,14 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Chris Smith
* @author Soby Chacko
* @author Eddú Meléndez
*/
@Testcontainers
class MongoDBAtlasVectorStoreIT {
@Container
private static MongoDBAtlasContainer container = new MongoDBAtlasContainer();
private static MongoDBAtlasLocalContainer container = new MongoDBAtlasLocalContainer(
"mongodb/mongodb-atlas-local:7.0.9");
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(TestApplication.class)

View File

@@ -56,18 +56,21 @@ import com.mongodb.client.MongoClient;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.tck.TestObservationRegistry;
import io.micrometer.observation.tck.TestObservationRegistryAssert;
import org.testcontainers.mongodb.MongoDBAtlasLocalContainer;
/**
* @author Christian Tzolov
* @author Soby Chacko
* @author Thomas Vitale
* @author Eddú Meléndez
*/
@Testcontainers
@EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
public class MongoDbVectorStoreObservationIT {
@Container
private static MongoDBAtlasContainer container = new MongoDBAtlasContainer();
private static MongoDBAtlasLocalContainer container = new MongoDBAtlasLocalContainer(
"mongodb/mongodb-atlas-local:7.0.9");
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(Config.class)