diff --git a/app/server/appsmith-plugins/mongoPlugin/pom.xml b/app/server/appsmith-plugins/mongoPlugin/pom.xml index 6e5c8345ba..d355dcf266 100644 --- a/app/server/appsmith-plugins/mongoPlugin/pom.xml +++ b/app/server/appsmith-plugins/mongoPlugin/pom.xml @@ -14,4 +14,20 @@ mongoPlugin + + + + org.testcontainers + mongodb + 1.19.1 + test + + + junit + junit + + + + + diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginDatasourceTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginDatasourceTest.java index cc804950f6..e46c9e774e 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginDatasourceTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginDatasourceTest.java @@ -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 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)); diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginErrorsTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginErrorsTest.java index 43beac875b..feb91e5441 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginErrorsTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginErrorsTest.java @@ -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() { diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginFormsTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginFormsTest.java index 9619c186f7..00b84f9859 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginFormsTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginFormsTest.java @@ -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); diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginQueriesTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginQueriesTest.java index aee5e2c636..fb02c1ca90 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginQueriesTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginQueriesTest.java @@ -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() { diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginRegexTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginRegexTest.java index 782bf80fb4..b290feaed5 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginRegexTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginRegexTest.java @@ -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() { diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginStaleConnTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginStaleConnTest.java index 18b6c0a98c..e99624f152 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginStaleConnTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginStaleConnTest.java @@ -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() { diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoTestContainer.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoTestContainer.java deleted file mode 100644 index 7893b993a4..0000000000 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoTestContainer.java +++ /dev/null @@ -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 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 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 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(); - } -} diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoTestDBContainerManager.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoTestDBContainerManager.java new file mode 100644 index 0000000000..f5bcd5dcb5 --- /dev/null +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoTestDBContainerManager.java @@ -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 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 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 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(); + } + } +}