diff --git a/pom.xml b/pom.xml index f189ba2..94d27b1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.kapeta nosql-mongodb - 1.1.1 + 1.1.2 ${project.groupId}:${project.artifactId} MongoDB support for Kapeta Spring Boot SDK @@ -158,6 +158,11 @@ [1.0,2.0) provided + + org.junit.jupiter + junit-jupiter + test + \ No newline at end of file diff --git a/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java b/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java index 1b7b079..8940e67 100644 --- a/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java +++ b/src/main/java/com/kapeta/spring/mongo/AbstractMongoDBConfig.java @@ -87,12 +87,25 @@ private MongoProperties createMongoProperties(String databaseName, String dbAuth return properties; } - private MongoProperties createMongoUriProperties(String databaseName, String dbAuthDB, ResourceInfo mongoInfo) { + protected MongoProperties createMongoUriProperties(String databaseName, String dbAuthDB, ResourceInfo mongoInfo) { String username = mongoInfo.getCredentials().get("username"); String password = mongoInfo.getCredentials().getOrDefault("password",""); - String uri = String.format("mongodb+srv://%s:%s@%s/%s?ssl=false&authSource=%s", username, password, mongoInfo.getHost(), databaseName, dbAuthDB); + String ssl = "ssl=false"; + if(mongoInfo.getOptions().containsKey("ssl")) { + if (Boolean.parseBoolean(mongoInfo.getOptions().get("ssl").toString())) { + ssl = "ssl=true"; + } + } + String dbAuthDBStr = String.format("&authSource=%s", dbAuthDB); + if (StringUtils.isEmpty(dbAuthDB)) { + dbAuthDBStr = ""; + } + + String uri = String.format("mongodb+srv://%s:%s@%s/%s?%s%s", username, password, mongoInfo.getHost(), databaseName,ssl, dbAuthDBStr); + // Override with environment variable if set if(!StringUtils.isEmpty(System.getenv("SPRING_DATA_MONGODB_URI"))) { + log.info("Overriding MongoDB URI with environment variable SPRING_DATA_MONGODB_URI"); uri = System.getenv("SPRING_DATA_MONGODB_URI"); } diff --git a/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java b/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java new file mode 100644 index 0000000..7a9ff45 --- /dev/null +++ b/src/test/java/com/kapeta/spring/mongo/AbstractMongoDBConfigTest.java @@ -0,0 +1,110 @@ +/* + * Copyright 2023 Kapeta Inc. + * SPDX-License-Identifier: MIT + */ +package com.kapeta.spring.mongo; + +import com.kapeta.spring.config.providers.TestConfigProvider; +import com.kapeta.spring.config.providers.types.ResourceInfo; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.mongo.MongoProperties; + + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AbstractMongoDBConfigTest { + + + @Test + public void testCreateMongoUriProperties() { + Map credentials = new HashMap<>(); + credentials.put("username", "testUser"); + credentials.put("password", "testPass"); + + Map options = new HashMap<>(); + options.put("ssl", "true"); + + TestMongoDBConfig mongoDBConfig = new TestMongoDBConfig("testResource"); + + ResourceInfo resourceInfo = new ResourceInfo(); + resourceInfo.setCredentials(credentials); + resourceInfo.setOptions(options); + resourceInfo.setHost("testHost"); + + MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "admin", resourceInfo); + + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=true&authSource=admin", properties.getUri()); + } + + + @Test + public void testSSLFalse() { + Map credentials = new HashMap<>(); + credentials.put("username", "testUser"); + credentials.put("password", "testPass"); + + Map options = new HashMap<>(); + options.put("ssl", "false"); + + TestMongoDBConfig mongoDBConfig = new TestMongoDBConfig("testResource"); + + ResourceInfo resourceInfo = new ResourceInfo(); + resourceInfo.setCredentials(credentials); + resourceInfo.setOptions(options); + resourceInfo.setHost("testHost"); + + MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "admin", resourceInfo); + + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=false&authSource=admin", properties.getUri()); + } + + @Test + public void testEmptySSLConfig() { + Map credentials = new HashMap<>(); + credentials.put("username", "testUser"); + credentials.put("password", "testPass"); + + Map options = new HashMap<>(); + + TestMongoDBConfig mongoDBConfig = new TestMongoDBConfig("testResource"); + + ResourceInfo resourceInfo = new ResourceInfo(); + resourceInfo.setCredentials(credentials); + resourceInfo.setOptions(options); + resourceInfo.setHost("testHost"); + + MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "admin", resourceInfo); + + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=false&authSource=admin", properties.getUri()); + } + + @Test + public void testEmptyAuthSource() { + Map credentials = new HashMap<>(); + credentials.put("username", "testUser"); + credentials.put("password", "testPass"); + + Map options = new HashMap<>(); + options.put("ssl", "true"); + + TestMongoDBConfig mongoDBConfig = new TestMongoDBConfig("testResource"); + + ResourceInfo resourceInfo = new ResourceInfo(); + resourceInfo.setCredentials(credentials); + resourceInfo.setOptions(options); + resourceInfo.setHost("testHost"); + + MongoProperties properties = mongoDBConfig.createMongoUriProperties("testDB", "", resourceInfo); + + assertEquals("mongodb+srv://testUser:testPass@testHost/testDB?ssl=true", properties.getUri()); + } + + private class TestMongoDBConfig extends AbstractMongoDBConfig { + public TestMongoDBConfig(String resourceName) { + super(resourceName); + } + } +} \ No newline at end of file