diff --git a/README.md b/README.md
index 99fc0bb7..047a9d48 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
1. [Introduction](#introduction)
1. [Release Notes](#release-notes)
1. [Implemented Changes](#implemented-changes)
+1. [Connection String Formats](#connection-string)
1. [Getting Started](#getting-started)
1. [Running tests](#running-tests)
1. [Integration](#integration)
@@ -28,9 +29,11 @@ Liquibase turned to be the most feasible tool to extend as it allows to define c
## Release Notes
#### 4.2.2.1
+* Fixed [Issue-64:Support for DNS Seed List Connection Format or Atlas Cluster](https://github.com/liquibase/liquibase-mongodb/issues/66)
* Fixed [Issue-69: Does it support preconditions](https://github.com/liquibase/liquibase-mongodb/issues/69)
* Added DocumentExistsPrecondition, ExpectedDocumentCountPrecondition
* Fixed [Issue-74: createIndex with TTL (expireAfterSeconds) is ignored and normal index created](https://github.com/liquibase/liquibase-mongodb/issues/74)
+* Fixed [Issue-79: CreateCollection silently drops supported options](https://github.com/liquibase/liquibase-mongodb/issues/79)
#### 4.2.2
* Support for Liquibase 4.2.2
@@ -101,6 +104,24 @@ Provides a helper to run specified database commands. This is the preferred meth
* [__adminCommand__](https://docs.mongodb.com/manual/reference/method/db.adminCommand/#db.adminCommand) -
Provides a helper to run specified database commands against the admin database
+
+## Connection String Formats
+
+### [Standard Connection String Format](https://docs.mongodb.com/manual/reference/connection-string/index.html#standard-connection-string-format)
+
+`
+mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
+mongodb://mongodb1.example.com:27317,mongodb2.example.com:27017/?replicaSet=mySet&authSource=authDB
+`
+
+### [DNS Seed List Connection Format](https://docs.mongodb.com/manual/reference/connection-string/index.html#dns-seed-list-connection-format)
+
+`
+mongodb+srv://[username:password@]host[/[database][?options]]
+mongodb+srv://server.example.com/
+mongodb+srv://:@cluster0.example.com/testdb?authSource=$external&authMechanism=MONGODB-AWS
+`
+
## Getting Started
@@ -115,6 +136,10 @@ mongo-java-driver:3.12.7
### Installing
* Clone the project
+
+```shell
+git clone https://github.com/liquibase/liquibase-mongodb
+```
* [Run tests](#running-tests)
@@ -128,7 +153,7 @@ Run Integration tests by enabling `run-its` profile
### Run integration tests
-```shell script
+```shell
mvn clean install -Prun-its
```
diff --git a/src/main/java/liquibase/ext/mongodb/database/MongoClientDriver.java b/src/main/java/liquibase/ext/mongodb/database/MongoClientDriver.java
index 139c5b57..ea66d83a 100644
--- a/src/main/java/liquibase/ext/mongodb/database/MongoClientDriver.java
+++ b/src/main/java/liquibase/ext/mongodb/database/MongoClientDriver.java
@@ -5,6 +5,7 @@
import com.mongodb.client.MongoClients;
import liquibase.Scope;
import liquibase.exception.DatabaseException;
+import liquibase.util.StringUtil;
import java.sql.Connection;
import java.sql.Driver;
@@ -12,10 +13,12 @@
import java.util.Properties;
import java.util.logging.Logger;
+import static java.util.Objects.nonNull;
+
public class MongoClientDriver implements Driver {
@Override
- public Connection connect(String url, Properties info) {
+ public Connection connect(final String url, final Properties info) {
//Not applicable for non JDBC DBs
throw new UnsupportedOperationException("Cannot initiate a SQL Connection for a NoSql DB");
}
@@ -32,8 +35,9 @@ public MongoClient connect(final ConnectionString connectionString) throws Datab
}
@Override
- public boolean acceptsURL(String url) {
- return false;
+ public boolean acceptsURL(final String url) {
+ final String trimmedUrl = StringUtil.trimToEmpty(url);
+ return trimmedUrl.startsWith(MongoConnection.MONGO_DNS_PREFIX) || trimmedUrl.startsWith(MongoConnection.MONGO_PREFIX);
}
@Override
diff --git a/src/main/java/liquibase/ext/mongodb/database/MongoConnection.java b/src/main/java/liquibase/ext/mongodb/database/MongoConnection.java
index 88b05def..673ebc63 100644
--- a/src/main/java/liquibase/ext/mongodb/database/MongoConnection.java
+++ b/src/main/java/liquibase/ext/mongodb/database/MongoConnection.java
@@ -38,8 +38,10 @@
import java.util.Optional;
import java.util.Properties;
+import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static java.util.Optional.ofNullable;
+import static liquibase.ext.mongodb.database.MongoLiquibaseDatabase.MONGODB_PRODUCT_SHORT_NAME;
@Getter
@Setter
@@ -47,8 +49,8 @@
public class MongoConnection extends AbstractNoSqlConnection {
public static final int DEFAULT_PORT = 27017;
- public static final String MONGO_PREFIX = MongoLiquibaseDatabase.MONGODB_PRODUCT_SHORT_NAME + "://";
- public static final String MONGO_CONNECTION_STRING_PATTERN = "%s/%s";
+ public static final String MONGO_PREFIX = MONGODB_PRODUCT_SHORT_NAME + "://";
+ public static final String MONGO_DNS_PREFIX = MONGODB_PRODUCT_SHORT_NAME + "+srv://";
private ConnectionString connectionString;
@@ -80,24 +82,16 @@ public String getConnectionUserName() {
.map(MongoCredential::getUserName).orElse("");
}
+ @Override
+ public boolean isClosed() throws DatabaseException {
+ return isNull(client);
+ }
+
@Override
public void open(final String url, final Driver driverObject, final Properties driverProperties) throws DatabaseException {
try {
-
- String urlWithCredentials = url;
-
- if (nonNull(driverProperties)) {
-
- final Optional user = Optional.ofNullable(StringUtil.trimToNull(driverProperties.getProperty("user")));
- final Optional password = Optional.ofNullable(StringUtil.trimToNull(driverProperties.getProperty("password")));
-
- if (user.isPresent() && password.isPresent()) {
- // injects credentials
- // mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database.collection][?options]]
- urlWithCredentials = MONGO_PREFIX + user.get() + ":" + password.get() + "@" + StringUtil.trimToEmpty(url).replaceFirst(MONGO_PREFIX, "");
- }
- }
+ final String urlWithCredentials = injectCredentials(StringUtil.trimToEmpty(url), driverProperties);
this.connectionString = new ConnectionString(urlWithCredentials);
@@ -111,10 +105,33 @@ public void open(final String url, final Driver driverObject, final Properties d
}
}
+ private String injectCredentials(final String url, final Properties driverProperties) {
+
+ if (nonNull(driverProperties)) {
+
+ final Optional user = Optional.ofNullable(StringUtil.trimToNull(driverProperties.getProperty("user")));
+ final Optional password = Optional.ofNullable(StringUtil.trimToNull(driverProperties.getProperty("password")));
+
+ if (user.isPresent()) {
+ // injects credentials
+ // mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database.collection][?options]]
+ // mongodb+srv://[username:password@]host[:port1][?options]]
+ final String mongoPrefix = url.startsWith(MONGO_DNS_PREFIX) ? MONGO_DNS_PREFIX : MONGO_PREFIX;
+ return mongoPrefix + user.get() + password.map(p -> ":" + p).orElse("") + "@" +
+ url.substring(mongoPrefix.length());
+ }
+ }
+ return url;
+ }
+
+
@Override
public void close() throws DatabaseException {
try {
- client.close();
+ if (!isClosed()) {
+ client.close();
+ client = null;
+ }
} catch (final Exception e) {
throw new DatabaseException(e);
}
diff --git a/src/main/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabase.java b/src/main/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabase.java
index 0d0c55f4..7953f8d7 100644
--- a/src/main/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabase.java
+++ b/src/main/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabase.java
@@ -23,14 +23,13 @@
import liquibase.CatalogAndSchema;
import liquibase.Scope;
import liquibase.changelog.ChangeLogHistoryServiceFactory;
-import liquibase.configuration.GlobalConfiguration;
import liquibase.configuration.LiquibaseConfiguration;
-import liquibase.ext.mongodb.configuration.MongoConfiguration;
-import liquibase.nosql.database.AbstractNoSqlDatabase;
import liquibase.exception.LiquibaseException;
import liquibase.executor.Executor;
import liquibase.executor.ExecutorService;
+import liquibase.ext.mongodb.configuration.MongoConfiguration;
import liquibase.ext.mongodb.statement.DropAllCollectionsStatement;
+import liquibase.nosql.database.AbstractNoSqlDatabase;
import lombok.NoArgsConstructor;
import lombok.Setter;
@@ -41,6 +40,7 @@ public class MongoLiquibaseDatabase extends AbstractNoSqlDatabase {
public static final String MONGODB_PRODUCT_NAME = "MongoDB";
public static final String MONGODB_PRODUCT_SHORT_NAME = "mongodb";
+ public static final String ADMIN_DATABSE_NAME = "admin";
@Setter
private Boolean adjustTrackingTablesOnStartup;
@@ -58,7 +58,7 @@ public void dropDatabaseObjects(final CatalogAndSchema schemaToDrop) throws Liqu
@Override
public String getDefaultDriver(final String url) {
- if (url.startsWith(MongoConnection.MONGO_PREFIX)) {
+ if (url.startsWith(MongoConnection.MONGO_DNS_PREFIX) || url.startsWith(MongoConnection.MONGO_PREFIX)) {
return MongoClientDriver.class.getName();
}
return null;
@@ -90,7 +90,7 @@ protected String getDefaultDatabaseProductName() {
@Override
public String getSystemSchema() {
- return "admin";
+ return ADMIN_DATABSE_NAME;
}
/*********************************
diff --git a/src/main/java/liquibase/nosql/database/AbstractNoSqlConnection.java b/src/main/java/liquibase/nosql/database/AbstractNoSqlConnection.java
index 9cf21659..11676e87 100644
--- a/src/main/java/liquibase/nosql/database/AbstractNoSqlConnection.java
+++ b/src/main/java/liquibase/nosql/database/AbstractNoSqlConnection.java
@@ -23,7 +23,6 @@
import liquibase.database.Database;
import liquibase.database.DatabaseConnection;
import liquibase.exception.DatabaseException;
-import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@@ -51,8 +50,6 @@ public void setAutoCommit(boolean autoCommit) throws DatabaseException {
@Override
public String nativeSQL(String sql) {
- //TODO: Investigate whether can be thrown not applicable
- //throw new UnsupportedOperationException();
return null;
}
@@ -86,9 +83,4 @@ public void rollback() throws DatabaseException {
// Do nothing
}
- @Override
- public boolean isClosed() throws DatabaseException {
- return false;
- }
-
}
diff --git a/src/test/java/liquibase/ext/mongodb/database/MongoClientDriverTest.java b/src/test/java/liquibase/ext/mongodb/database/MongoClientDriverTest.java
new file mode 100644
index 00000000..7299b1ec
--- /dev/null
+++ b/src/test/java/liquibase/ext/mongodb/database/MongoClientDriverTest.java
@@ -0,0 +1,46 @@
+package liquibase.ext.mongodb.database;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
+
+@TestInstance(TestInstance.Lifecycle.PER_METHOD)
+class MongoClientDriverTest {
+
+ protected MongoClientDriver mongoClientDriver;
+
+ @BeforeEach
+ void setUp() {
+ mongoClientDriver = new MongoClientDriver();
+ }
+
+ @Test
+ void acceptsURL() {
+ assertThat(mongoClientDriver.acceptsURL(null)).isFalse();
+ assertThat(mongoClientDriver.acceptsURL("")).isFalse();
+ assertThat(mongoClientDriver.acceptsURL("jdbc:oracle:thin:@localhost:1521:xe")).isFalse();
+ assertThat(mongoClientDriver.acceptsURL("mongodbsuffix://localhost")).isFalse();
+ assertThat(mongoClientDriver.acceptsURL("mongodb://localhost")).isTrue();
+ assertThat(mongoClientDriver.acceptsURL(" mongodb://localhost")).isTrue();
+ assertThat(mongoClientDriver.acceptsURL("mongodb+srv://localhost")).isTrue();
+ assertThat(mongoClientDriver.acceptsURL(" mongodb+srv://localhost")).isTrue();
+ }
+
+ @Test
+ void getMajorVersion() {
+ assertThat(mongoClientDriver.getMajorVersion()).isEqualTo(0);
+ }
+
+ @Test
+ void getMinorVersion() {
+ assertThat(mongoClientDriver.getMinorVersion()).isEqualTo(0);
+ }
+
+ @Test
+ void jdbcCompliant() {
+ assertThat(mongoClientDriver.jdbcCompliant()).isFalse();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/liquibase/ext/mongodb/database/MongoConnectionTest.java b/src/test/java/liquibase/ext/mongodb/database/MongoConnectionTest.java
index 61ae52cf..6fa971c9 100644
--- a/src/test/java/liquibase/ext/mongodb/database/MongoConnectionTest.java
+++ b/src/test/java/liquibase/ext/mongodb/database/MongoConnectionTest.java
@@ -3,9 +3,11 @@
import com.mongodb.ConnectionString;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
+import liquibase.exception.DatabaseException;
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -15,6 +17,7 @@
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -74,38 +77,75 @@ void getDatabaseMinorVersion() {
assertThat(connection.getDatabaseMinorVersion()).isEqualTo(0);
}
+ @SneakyThrows
@Test
void getConnectionUserName() {
+
+ when(driverMock.connect(any(ConnectionString.class))).thenReturn(clientMock);
+ when(clientMock.getDatabase(any())).thenReturn(databaseMock);
+
+ assertThat(connection.getConnectionUserName()).isEmpty();
+
+ connection.open("mongodb://localhost:27017/test_db", driverMock, null);
+ assertThat(connection.getConnectionUserName()).isEmpty();
+
+ connection.open("mongodb://user1:pass1@localhost:27017/test_db", driverMock, null);
+ assertThat(connection.getConnectionUserName()).isEqualTo("user1");
}
+ @SneakyThrows
@Test
void isClosed() {
+
+ when(driverMock.connect(any(ConnectionString.class))).thenReturn(clientMock);
+ when(clientMock.getDatabase(any())).thenReturn(databaseMock);
+
+ assertThat(connection.isClosed()).isTrue();
+
+ connection.open("mongodb://localhost:27017/test_db?socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, null);
+ assertThat(connection.isClosed()).isFalse();
+
+ connection.close();
+ assertThat(connection.isClosed()).isTrue();
+
+ //close a closed connection
+ connection.close();
+ assertThat(connection.isClosed()).isTrue();
}
+ @SneakyThrows
@Test
void getCatalog() {
- }
+ when(driverMock.connect(any(ConnectionString.class))).thenReturn(clientMock);
+ when(clientMock.getDatabase(any())).thenReturn(databaseMock);
+ when(databaseMock.getName()).thenReturn("test_db");
+ when(databaseMock.withCodecRegistry(any())).thenReturn(databaseMock);
- @Test
- void getDatabaseProductName() {
+ assertThatExceptionOfType(DatabaseException.class).isThrownBy(() -> connection.getCatalog()).withCauseInstanceOf(NullPointerException.class);
+
+ connection.open("mongodb://localhost:27017/test_db?socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, null);
+ assertThat(connection.getCatalog()).isEqualTo("test_db");
}
+ @SneakyThrows
@Test
- void getURL() {
+ void getDatabaseProductName() {
+ assertThat(connection.getDatabaseProductName()).isEqualTo("MongoDB");
}
@SneakyThrows
@Test
- @SuppressWarnings("ConstantConditions")
void open() {
when(driverMock.connect(any(ConnectionString.class))).thenReturn(clientMock);
when(clientMock.getDatabase(any())).thenReturn(databaseMock);
when(databaseMock.withCodecRegistry(any())).thenReturn(databaseMock);
connection.open("mongodb://localhost:27017/test_db?socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, null);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isFalse();
assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
assertThat(connection.getConnectionString().getCredential()).isNull();
assertThat(connection.getConnectionUserName()).isEmpty();
+ assertThat(connection.getURL()).isEqualTo("localhost:27017");
verify(driverMock).connect(any(ConnectionString.class));
verify(clientMock).getDatabase(any());
@@ -113,39 +153,119 @@ void open() {
verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
connection.open("mongodb://user1:password1@localhost:27017/test_db?socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, null);
-
+ assertThat(connection.getConnectionString().isSrvProtocol()).isFalse();
assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
-
assertThat(connection.getConnectionString().getCredential()).isNotNull();
assertThat(connection.getConnectionString().getCredential().getUserName()).isEqualTo("user1");
- assertThat(String.valueOf(connection.getConnectionString().getCredential().getPassword())).isEqualTo("password1");
+ assertThat(connection.getConnectionString().getCredential().getPassword()).containsExactly('p','a','s','s','w','o','r','d','1');
assertThat(connection.getConnectionUserName()).isEqualTo("user1");
+ assertThat(connection.getURL()).isEqualTo("localhost:27017");
verify(driverMock, times(2)).connect(any(ConnectionString.class));
verify(clientMock, times(2)).getDatabase(any());
verify(databaseMock, times(2)).withCodecRegistry(any());
verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
- final Properties properties = new Properties();
+ Properties properties = new Properties();
properties.setProperty("user", "user2");
properties.setProperty("password", "password2");
- connection.open("mongodb://localhost:27017/test_db?socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, properties);
-
+ connection.open("mongodb://mongodb1.example.com:27317,mongodb2.example.com:27017/test_db?socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, properties);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isFalse();
assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
assertThat(connection.getConnectionString().getCredential()).isNotNull();
assertThat(connection.getConnectionString().getCredential().getUserName()).isEqualTo("user2");
- assertThat(String.valueOf(connection.getConnectionString().getCredential().getPassword())).isEqualTo("password2");
+ assertThat(connection.getConnectionString().getCredential().getPassword()).containsExactly('p','a','s','s','w','o','r','d','2');
assertThat(connection.getConnectionUserName()).isEqualTo("user2");
+ assertThat(connection.getURL()).isEqualTo("mongodb1.example.com:27317,mongodb2.example.com:27017");
verify(driverMock, times(3)).connect(any(ConnectionString.class));
verify(clientMock, times(3)).getDatabase(any());
verify(databaseMock, times(3)).withCodecRegistry(any());
verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
+ properties = new Properties();
+ properties.setProperty("user", "user3");
+ connection.open("mongodb://localhost:27017/test_db?authMechanism=MONGODB-X509&socketTimeoutMS=1000&connectTimeoutMS=1000&serverSelectionTimeoutMS=1000", driverMock, properties);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isFalse();
+ assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
+ assertThat(connection.getConnectionString().getCredential()).isNotNull();
+ assertThat(connection.getConnectionString().getCredential().getUserName()).isEqualTo("user3");
+ assertThat(connection.getConnectionString().getCredential().getPassword()).isNull();
+ assertThat(connection.getConnectionUserName()).isEqualTo("user3");
+ assertThat(connection.getURL()).isEqualTo("localhost:27017");
+
+ verify(driverMock, times(4)).connect(any(ConnectionString.class));
+ verify(clientMock, times(4)).getDatabase(any());
+ verify(databaseMock, times(4)).withCodecRegistry(any());
+ verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
}
+ @SneakyThrows
@Test
- void close() {
+ @Disabled("Travis - DNS name not found")
+ void openDNS() {
+ when(driverMock.connect(any(ConnectionString.class))).thenReturn(clientMock);
+ when(clientMock.getDatabase(any())).thenReturn(databaseMock);
+ when(databaseMock.withCodecRegistry(any())).thenReturn(databaseMock);
+
+ connection.open("mongodb+srv://localhost/test_db", driverMock, null);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isTrue();
+ assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
+ assertThat(connection.getConnectionString().getCredential()).isNull();
+ assertThat(connection.getConnectionUserName()).isEmpty();
+ assertThat(connection.getURL()).isEqualTo("localhost");
+
+ verify(driverMock).connect(any(ConnectionString.class));
+ verify(clientMock).getDatabase(any());
+ verify(databaseMock).withCodecRegistry(any());
+ verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
+
+ connection.open("mongodb+srv://user1:password1@localhost/test_db", driverMock, null);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isTrue();
+ assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
+ assertThat(connection.getConnectionString().getCredential()).isNotNull();
+ assertThat(connection.getConnectionString().getCredential().getUserName()).isEqualTo("user1");
+ assertThat(connection.getConnectionString().getCredential().getPassword()).containsExactly('p','a','s','s','w','o','r','d','1');
+ assertThat(connection.getConnectionUserName()).isEqualTo("user1");
+ assertThat(connection.getURL()).isEqualTo("localhost");
+
+ verify(driverMock, times(2)).connect(any(ConnectionString.class));
+ verify(clientMock, times(2)).getDatabase(any());
+ verify(databaseMock, times(2)).withCodecRegistry(any());
+ verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
+
+ Properties properties = new Properties();
+ properties.setProperty("user", "user2");
+ properties.setProperty("password", "password2");
+ connection.open("mongodb+srv://localhost/test_db", driverMock, properties);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isTrue();
+ assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
+ assertThat(connection.getConnectionString().getCredential()).isNotNull();
+ assertThat(connection.getConnectionString().getCredential().getUserName()).isEqualTo("user2");
+ assertThat(connection.getConnectionString().getCredential().getPassword()).containsExactly('p','a','s','s','w','o','r','d','2');
+ assertThat(connection.getConnectionUserName()).isEqualTo("user2");
+ assertThat(connection.getURL()).isEqualTo("localhost");
+
+ verify(driverMock, times(3)).connect(any(ConnectionString.class));
+ verify(clientMock, times(3)).getDatabase(any());
+ verify(databaseMock, times(3)).withCodecRegistry(any());
+ verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
+
+ properties = new Properties();
+ properties.setProperty("user", "user3");
+ connection.open("mongodb+srv://localhost/test_db?authMechanism=MONGODB-X509", driverMock, properties);
+ assertThat(connection.getConnectionString().isSrvProtocol()).isTrue();
+ assertThat(connection.getConnectionString().getDatabase()).isEqualTo("test_db");
+ assertThat(connection.getConnectionString().getCredential()).isNotNull();
+ assertThat(connection.getConnectionString().getCredential().getUserName()).isEqualTo("user3");
+ assertThat(connection.getConnectionString().getCredential().getPassword()).isNull();
+ assertThat(connection.getConnectionUserName()).isEqualTo("user3");
+ assertThat(connection.getURL()).isEqualTo("localhost");
+
+ verify(driverMock, times(4)).connect(any(ConnectionString.class));
+ verify(clientMock, times(4)).getDatabase(any());
+ verify(databaseMock, times(4)).withCodecRegistry(any());
+ verifyNoMoreInteractions(driverMock, clientMock, databaseMock);
}
}
\ No newline at end of file
diff --git a/src/test/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabaseTest.java b/src/test/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabaseTest.java
index 7a8fac46..1fa91e26 100644
--- a/src/test/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabaseTest.java
+++ b/src/test/java/liquibase/ext/mongodb/database/MongoLiquibaseDatabaseTest.java
@@ -48,8 +48,9 @@ void getDefaultDriver() {
database = (MongoLiquibaseDatabase) DatabaseFactory.getInstance()
.findCorrectDatabaseImplementation(new MongoConnection());
- assertThat(database.getDefaultDriver("mongodb://qwe")).isEqualTo(MongoClientDriver.class.getName());
assertThat(database.getDefaultDriver("cosmos://qwe")).isNull();
+ assertThat(database.getDefaultDriver("mongodb://qwe")).isEqualTo(MongoClientDriver.class.getName());
+ assertThat(database.getDefaultDriver("mongodb+srv://qwe")).isEqualTo(MongoClientDriver.class.getName());
}
@Test