fix: update mongo test container setup process (#28775)

This commit is contained in:
Sumit Kumar 2023-11-10 09:09:48 +05:30 committed by GitHub
parent 72858bf1a2
commit 5c9840eb4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 157 additions and 169 deletions

View File

@ -14,4 +14,20 @@
<name>mongoPlugin</name>
<dependencies>
<!-- Test dependencies -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<version>1.19.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

View File

@ -18,7 +18,7 @@ import com.mongodb.reactivestreams.client.MongoClient;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.core.publisher.Mono;
@ -47,6 +47,7 @@ import static com.external.plugins.utils.DatasourceUtils.extractInfoFromConnecti
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
@ -66,11 +67,11 @@ public class MongoPluginDatasourceTest {
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer mongoContainer = new MongoTestContainer();
public static MongoDBContainer mongoContainer = MongoTestDBContainerManager.getMongoDBForTest();
@BeforeAll
public static void setUp() {
address = mongoContainer.getContainerIpAddress();
address = mongoContainer.getHost();
port = mongoContainer.getFirstMappedPort();
}
@ -99,10 +100,7 @@ public class MongoPluginDatasourceTest {
Mono<MongoClient> dsConnectionMono = pluginExecutor.datasourceCreate(dsConfig);
StepVerifier.create(dsConnectionMono)
.assertNext(obj -> {
MongoClient client = obj;
assertNotNull(client);
})
.assertNext(Assertions::assertNotNull)
.verifyComplete();
}
@ -268,7 +266,7 @@ public class MongoPluginDatasourceTest {
.assertNext(invalids -> {
String expectedError = "Appsmith server has failed to fetch SSL configuration from datasource "
+ "configuration form. Please reach out to Appsmith customer support to resolve this.";
assertTrue(invalids.stream().anyMatch(error -> expectedError.equals(error)));
assertTrue(invalids.stream().anyMatch(expectedError::equals));
})
.verifyComplete();
}
@ -420,8 +418,8 @@ public class MongoPluginDatasourceTest {
+ "&minpoolsize=0";
Map extractedInfo = extractInfoFromConnectionStringURI(uri, MONGO_URI_REGEX);
assertEquals("mongodb://", extractedInfo.get(KEY_URI_HEAD));
assertEquals(null, extractedInfo.get(KEY_USERNAME));
assertEquals(null, extractedInfo.get(KEY_PASSWORD));
assertNull(extractedInfo.get(KEY_USERNAME));
assertNull(extractedInfo.get(KEY_PASSWORD));
assertEquals("localhost:28017", extractedInfo.get(KEY_HOST_PORT));
assertEquals("mongo_samples", extractedInfo.get(KEY_URI_DEFAULT_DBNAME));
assertEquals("w=majority&retrywrites=true&authsource=admin&minpoolsize=0", extractedInfo.get(KEY_URI_TAIL));
@ -433,8 +431,8 @@ public class MongoPluginDatasourceTest {
+ "&minpoolsize=0";
Map extractedInfo = extractInfoFromConnectionStringURI(uri, MONGO_URI_REGEX);
assertEquals("mongodb://", extractedInfo.get(KEY_URI_HEAD));
assertEquals(null, extractedInfo.get(KEY_USERNAME));
assertEquals(null, extractedInfo.get(KEY_PASSWORD));
assertNull(extractedInfo.get(KEY_USERNAME));
assertNull(extractedInfo.get(KEY_PASSWORD));
assertEquals("localhost:28017", extractedInfo.get(KEY_HOST_PORT));
assertEquals("mongo_samples", extractedInfo.get(KEY_URI_DEFAULT_DBNAME));
assertEquals("w=majority&retrywrites=true&authsource=admin&minpoolsize=0", extractedInfo.get(KEY_URI_TAIL));

View File

@ -14,16 +14,14 @@ import com.appsmith.external.models.Property;
import com.appsmith.external.models.SSLDetails;
import com.external.plugins.exceptions.MongoPluginError;
import com.external.plugins.exceptions.MongoPluginErrorMessages;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.mongodb.MongoCommandException;
import com.mongodb.MongoSecurityException;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoDatabase;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.core.publisher.Mono;
@ -70,19 +68,15 @@ public class MongoPluginErrorsTest {
private static String address;
private static Integer port;
private JsonNode value;
private static MongoClient mongoClient;
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer mongoContainer = new MongoTestContainer();
public static MongoDBContainer mongoContainer = MongoTestDBContainerManager.getMongoDBForTest();
@BeforeAll
public static void setUp() {
address = mongoContainer.getContainerIpAddress();
address = mongoContainer.getHost();
port = mongoContainer.getFirstMappedPort();
String uri = "mongodb://" + address + ":" + port;
mongoClient = MongoClients.create(uri);
}
private DatasourceConfiguration createDatasourceConfiguration() {

View File

@ -21,7 +21,7 @@ import com.mongodb.reactivestreams.client.MongoCollection;
import org.bson.Document;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.core.publisher.Flux;
@ -73,11 +73,11 @@ public class MongoPluginFormsTest {
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer mongoContainer = new MongoTestContainer();
public static MongoDBContainer mongoContainer = MongoTestDBContainerManager.getMongoDBForTest();
@BeforeAll
public static void setUp() {
address = mongoContainer.getContainerIpAddress();
address = mongoContainer.getHost();
port = mongoContainer.getFirstMappedPort();
String uri = "mongodb://" + address + ":" + port;
mongoClient = MongoClients.create(uri);

View File

@ -18,10 +18,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.core.publisher.Mono;
@ -71,18 +70,15 @@ public class MongoPluginQueriesTest {
private static String address;
private static Integer port;
private JsonNode value;
private static MongoClient mongoClient;
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer mongoContainer = new MongoTestContainer();
public static MongoDBContainer mongoContainer = MongoTestDBContainerManager.getMongoDBForTest();
@BeforeAll
public static void setUp() {
address = mongoContainer.getContainerIpAddress();
address = mongoContainer.getHost();
port = mongoContainer.getFirstMappedPort();
String uri = "mongodb://" + address + ":" + port;
mongoClient = MongoClients.create(uri);
}
private DatasourceConfiguration createDatasourceConfiguration() {

View File

@ -9,13 +9,11 @@ import com.appsmith.external.models.Endpoint;
import com.appsmith.external.models.Param;
import com.appsmith.external.models.ParsedDataType;
import com.appsmith.external.models.SSLDetails;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.core.publisher.Mono;
@ -44,19 +42,15 @@ public class MongoPluginRegexTest {
private static String address;
private static Integer port;
private JsonNode value;
private static MongoClient mongoClient;
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer mongoContainer = new MongoTestContainer();
public static MongoDBContainer mongoContainer = MongoTestDBContainerManager.getMongoDBForTest();
@BeforeAll
public static void setUp() {
address = mongoContainer.getContainerIpAddress();
address = mongoContainer.getHost();
port = mongoContainer.getFirstMappedPort();
String uri = "mongodb://" + address + ":" + port;
mongoClient = MongoClients.create(uri);
}
private DatasourceConfiguration createDatasourceConfiguration() {

View File

@ -8,14 +8,12 @@ import com.appsmith.external.models.DatasourceConfiguration;
import com.appsmith.external.models.DatasourceStructure;
import com.appsmith.external.models.Endpoint;
import com.appsmith.external.models.SSLDetails;
import com.fasterxml.jackson.databind.JsonNode;
import com.mongodb.MongoSocketWriteException;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoDatabase;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.core.publisher.Mono;
@ -44,19 +42,15 @@ public class MongoPluginStaleConnTest {
private static String address;
private static Integer port;
private JsonNode value;
private static MongoClient mongoClient;
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer mongoContainer = new MongoTestContainer();
public static MongoDBContainer mongoContainer = MongoTestDBContainerManager.getMongoDBForTest();
@BeforeAll
public static void setUp() {
address = mongoContainer.getContainerIpAddress();
address = mongoContainer.getHost();
port = mongoContainer.getFirstMappedPort();
String uri = "mongodb://" + address + ":" + port;
mongoClient = MongoClients.create(uri);
}
private DatasourceConfiguration createDatasourceConfiguration() {

View File

@ -1,120 +0,0 @@
package com.external.plugins;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.mongodb.DBRef;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoCollection;
import org.bson.Document;
import org.bson.types.BSONTimestamp;
import org.bson.types.Decimal128;
import org.testcontainers.containers.GenericContainer;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.math.BigDecimal;
import java.sql.Date;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
public class MongoTestContainer extends GenericContainer {
private static MongoClient mongoClient;
public MongoTestContainer() {
super(CompletableFuture.completedFuture("mongo:4.4"));
addExposedPorts(27017);
}
/*
* this is overridden to prepare Mongo with sample dataset after the test container is started
*/
@Override
protected void containerIsStarted(InspectContainerResponse containerInfo) {
String uri = "mongodb://" + getHost() + ":" + getFirstMappedPort();
mongoClient = MongoClients.create(uri);
Flux.from(mongoClient.getDatabase("test").listCollectionNames())
.collectList()
.flatMap(collectionNamesList -> {
if (collectionNamesList.size() == 0) {
final MongoCollection<Document> usersCollection =
mongoClient.getDatabase("test").getCollection("users");
Mono.from(usersCollection.insertMany(List.of(
new Document(Map.of(
"name",
"Cierra Vega",
"gender",
"F",
"age",
20,
"luckyNumber",
987654321L,
"dob",
LocalDate.of(2018, 12, 31),
"netWorth",
new BigDecimal("123456.789012"),
"updatedByCommand",
false)),
new Document(Map.of(
"name",
"Alden Cantrell",
"gender",
"M",
"age",
30,
"dob",
new Date(0),
"netWorth",
Decimal128.parse("123456.789012"),
"updatedByCommand",
false,
"aLong",
9_000_000_000_000_000_000L,
"ts",
new BSONTimestamp(1421006159, 4))),
new Document(Map.of("name", "Kierra Gentry", "gender", "F", "age", 40)))))
.block();
final MongoCollection<Document> addressCollection =
mongoClient.getDatabase("test").getCollection("address");
Mono.from(addressCollection.insertMany(List.of(
new Document(Map.of(
"user", new DBRef("test", "users", "1"),
"street", "First Street",
"city", "Line One",
"state", "UP")),
new Document(Map.of(
"user", new DBRef("AAA", "BBB", "2000"),
"street", "Second Street",
"city", "Line Two",
"state", "UP")))))
.block();
final MongoCollection<Document> teamCollection =
mongoClient.getDatabase("test").getCollection("teams");
Mono.from(teamCollection.insertMany(List.of(
new Document(Map.of(
"name", "Noisy Neighbours 2",
"goals_allowed", "20",
"goals_forwarded", "41",
"goal_difference", "+21",
"xGD", "-2.5",
"best_scoreline", "5-2")),
new Document(Map.of(
"name", "Red Side of the city",
"goals_allowed", "35",
"goals_forwarded", "28",
"goal_difference", "-7",
"xGD", "+3.6",
"best_scoreline", "8-3")))))
.block();
}
return Mono.empty();
})
.block();
}
}

View File

@ -0,0 +1,116 @@
package com.external.plugins;
import com.mongodb.DBRef;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoCollection;
import org.bson.Document;
import org.bson.types.BSONTimestamp;
import org.bson.types.Decimal128;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.utility.DockerImageName;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.math.BigDecimal;
import java.sql.Date;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class MongoTestDBContainerManager {
public static final String MONGO_DOCKER_HUB_CONTAINER = "mongo:4.4";
public static MongoDBContainer getMongoDBForTest() {
MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse(MONGO_DOCKER_HUB_CONTAINER));
mongoDBContainer.start();
initialSetup(mongoDBContainer);
return mongoDBContainer;
}
private static void initialSetup(MongoDBContainer mongoDBContainer) {
String uri = "mongodb://" + mongoDBContainer.getHost() + ":" + mongoDBContainer.getFirstMappedPort();
try (MongoClient mongoClient = MongoClients.create(uri)) {
Flux.from(mongoClient.getDatabase("test").listCollectionNames())
.collectList()
.flatMap(collectionNamesList -> {
if (collectionNamesList.isEmpty()) {
final MongoCollection<Document> usersCollection =
mongoClient.getDatabase("test").getCollection("users");
Mono.from(usersCollection.insertMany(List.of(
new Document(Map.of(
"name",
"Cierra Vega",
"gender",
"F",
"age",
20,
"luckyNumber",
987654321L,
"dob",
LocalDate.of(2018, 12, 31),
"netWorth",
new BigDecimal("123456.789012"),
"updatedByCommand",
false)),
new Document(Map.of(
"name",
"Alden Cantrell",
"gender",
"M",
"age",
30,
"dob",
new Date(0),
"netWorth",
Decimal128.parse("123456.789012"),
"updatedByCommand",
false,
"aLong",
9_000_000_000_000_000_000L,
"ts",
new BSONTimestamp(1421006159, 4))),
new Document(Map.of("name", "Kierra Gentry", "gender", "F", "age", 40)))))
.block();
final MongoCollection<Document> addressCollection =
mongoClient.getDatabase("test").getCollection("address");
Mono.from(addressCollection.insertMany(List.of(
new Document(Map.of(
"user", new DBRef("test", "users", "1"),
"street", "First Street",
"city", "Line One",
"state", "UP")),
new Document(Map.of(
"user", new DBRef("AAA", "BBB", "2000"),
"street", "Second Street",
"city", "Line Two",
"state", "UP")))))
.block();
final MongoCollection<Document> teamCollection =
mongoClient.getDatabase("test").getCollection("teams");
Mono.from(teamCollection.insertMany(List.of(
new Document(Map.of(
"name", "Noisy Neighbours 2",
"goals_allowed", "20",
"goals_forwarded", "41",
"goal_difference", "+21",
"xGD", "-2.5",
"best_scoreline", "5-2")),
new Document(Map.of(
"name", "Red Side of the city",
"goals_allowed", "35",
"goals_forwarded", "28",
"goal_difference", "-7",
"xGD", "+3.6",
"best_scoreline", "8-3")))))
.block();
}
return Mono.empty();
})
.block();
}
}
}