From eb578fd596506922311b23aa481477c56e2b6bc5 Mon Sep 17 00:00:00 2001 From: Egor Shokurov Date: Mon, 3 Jan 2022 14:20:50 +0300 Subject: [PATCH] Debug unit tests on Apple Silicon M1, most of tests pass --- ETLBox/src/NLog/CreateDatabaseTarget.cs | 2 +- .../Native/Helpers/SqliteConvert.cs | 119 ++++++++ .../Native/SqliteConnectionManager.cs | 21 +- .../Logging/ReadLoadProcessTableTask.cs | 4 +- .../src/Toolbox/Logging/ReadLogTableTask.cs | 2 +- .../SqlConnectionManagerTests.cs | 2 +- .../DBDestinationTransactionTests.cs | 287 +++++++++--------- TestHelper/src/ConnectionStringTests.cs | 40 +-- 8 files changed, 301 insertions(+), 176 deletions(-) create mode 100644 ETLBox/src/Toolbox/ConnectionManager/Native/Helpers/SqliteConvert.cs diff --git a/ETLBox/src/NLog/CreateDatabaseTarget.cs b/ETLBox/src/NLog/CreateDatabaseTarget.cs index b3a6da0c..5501b519 100644 --- a/ETLBox/src/NLog/CreateDatabaseTarget.cs +++ b/ETLBox/src/NLog/CreateDatabaseTarget.cs @@ -71,7 +71,7 @@ public DatabaseTarget GetNLogDatabaseTarget() else if (ConnectionManager.ConnectionManagerType == ConnectionManagerType.MySql) dbTarget.DBProvider = "MySql.Data.MySqlClient.MySqlConnection, MySql.Data"; else if (ConnectionManager.ConnectionManagerType == ConnectionManagerType.SQLite) - dbTarget.DBProvider = "System.Data.SQLite.SQLiteConnection, System.Data.SQLite"; + dbTarget.DBProvider = "Microsoft.Data.Sqlite.SqliteConnection, Microsoft.Data.Sqlite"; else dbTarget.DBProvider = "Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"; dbTarget.ConnectionString = ConnectionManager.ConnectionString.Value; diff --git a/ETLBox/src/Toolbox/ConnectionManager/Native/Helpers/SqliteConvert.cs b/ETLBox/src/Toolbox/ConnectionManager/Native/Helpers/SqliteConvert.cs new file mode 100644 index 00000000..803a9aa6 --- /dev/null +++ b/ETLBox/src/Toolbox/ConnectionManager/Native/Helpers/SqliteConvert.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.Data.Sqlite; + +namespace ALE.ETLBox.ConnectionManager.Helpers; + +/// +/// This base class provides datatype conversion services for the Sqlite provider. +/// +public abstract class SqliteConvert +{ + /// + /// For a given intrinsic type, return a DbType + /// + /// The native type to convert + /// The corresponding (closest match) DbType + private static DbType TypeToDbType(Type typ) + { + var tc = Type.GetTypeCode(typ); + if (tc == TypeCode.Object) + { + if (typ == typeof(byte[])) return DbType.Binary; + if (typ == typeof(Guid)) return DbType.Guid; + return DbType.String; + } + + return DbTypeMappings[(int)tc]; + } + + private static readonly DbType[] DbTypeMappings = + { + DbType.Object, // Empty (0) + DbType.Binary, // Object (1) + DbType.Object, // DBNull (2) + DbType.Boolean, // Boolean (3) + DbType.SByte, // Char (4) + DbType.SByte, // SByte (5) + DbType.Byte, // Byte (6) + DbType.Int16, // Int16 (7) + DbType.UInt16, // UInt16 (8) + DbType.Int32, // Int32 (9) + DbType.UInt32, // UInt32 (10) + DbType.Int64, // Int64 (11) + DbType.UInt64, // UInt64 (12) + DbType.Single, // Single (13) + DbType.Double, // Double (14) + DbType.Decimal, // Decimal (15) + DbType.DateTime, // DateTime (16) + DbType.Object, // ?? (17) + DbType.String // String (18) + }; + + public static DbType TypeToDbType(object _objValue) + { + if (_objValue != null && _objValue != DBNull.Value) + { + return TypeToDbType(_objValue.GetType()); + } + + return DbType.String; // Unassigned default value is String + } + + public static SqliteType TypeToAffinity(object _objValue) + { + if (_objValue != null && _objValue != DBNull.Value) + { + return TypeToAffinity(_objValue.GetType()); + } + + return SqliteType.Text; // Unassigned default value is String + } + + /// + /// For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types. + /// + /// The type to evaluate + /// The flags associated with the connection. + /// The SQLite type affinity for that type. + public static SqliteType TypeToAffinity(Type typ) + { + var tc = Type.GetTypeCode(typ); + if (tc == TypeCode.Object) + { + if (typ == typeof(byte[]) || typ == typeof(Guid)) + return SqliteType.Blob; + else + return SqliteType.Text; + } + + return TypeCodeAffinities[(int)tc]; + } + + private static readonly SqliteType[] TypeCodeAffinities = + { + SqliteType.Text, // Empty (0) + SqliteType.Blob, // Object (1) + SqliteType.Text, // DBNull (2) + SqliteType.Integer, // Boolean (3) + SqliteType.Integer, // Char (4) + SqliteType.Integer, // SByte (5) + SqliteType.Integer, // Byte (6) + SqliteType.Integer, // Int16 (7) + SqliteType.Integer, // UInt16 (8) + SqliteType.Integer, // Int32 (9) + SqliteType.Integer, // UInt32 (10) + SqliteType.Integer, // Int64 (11) + SqliteType.Integer, // UInt64 (12) + SqliteType.Real, // Single (13) + SqliteType.Real, // Double (14) + SqliteType.Real, // Decimal (15) + SqliteType.Text, // DateTime (16) + SqliteType.Text, // ?? (17) + SqliteType.Text // String (18) + }; +} \ No newline at end of file diff --git a/ETLBox/src/Toolbox/ConnectionManager/Native/SqliteConnectionManager.cs b/ETLBox/src/Toolbox/ConnectionManager/Native/SqliteConnectionManager.cs index 85fbe076..4a665793 100644 --- a/ETLBox/src/Toolbox/ConnectionManager/Native/SqliteConnectionManager.cs +++ b/ETLBox/src/Toolbox/ConnectionManager/Native/SqliteConnectionManager.cs @@ -2,6 +2,7 @@ using System.Data; using System.Globalization; using System.Linq; +using ALE.ETLBox.ConnectionManager.Helpers; using Microsoft.Data.Sqlite; namespace ALE.ETLBox.ConnectionManager @@ -66,11 +67,7 @@ public override void BulkInsert(ITableData data, string tableName) while (data.Read()) { command.Parameters.AddRange( - destColumnNames.Select((n, i) => new SqliteParameter - { - ParameterName = paramNames[i], - Value = data.GetValue(data.GetOrdinal(n)) - })); + destColumnNames.Select((n, i) => ConstructSqliteParameter(paramNames[i], data.GetValue(data.GetOrdinal(n))))); command.ExecuteNonQuery(); command.Parameters.Clear(); } @@ -79,7 +76,19 @@ public override void BulkInsert(ITableData data, string tableName) } } - public override void PrepareBulkInsert(string tablename) + private static SqliteParameter ConstructSqliteParameter(string parameterName, object value) + { + return new SqliteParameter + { + ParameterName = parameterName, + Value = value ?? DBNull.Value, + IsNullable = value is null, + DbType = SqliteConvert.TypeToDbType(value), + SqliteType = SqliteConvert.TypeToAffinity(value) + }; + } + + public override void PrepareBulkInsert(string tableName) { if (ModifyDBSettings) { diff --git a/ETLBox/src/Toolbox/Logging/ReadLoadProcessTableTask.cs b/ETLBox/src/Toolbox/Logging/ReadLoadProcessTableTask.cs index 79f144c4..5a8dd645 100644 --- a/ETLBox/src/Toolbox/Logging/ReadLoadProcessTableTask.cs +++ b/ETLBox/src/Toolbox/Logging/ReadLoadProcessTableTask.cs @@ -20,8 +20,8 @@ public void Execute() DisableLogging = true, Actions = new List>() { col => LoadProcess.Id = Convert.ToInt64(col), - col => LoadProcess.StartDate = (DateTime)col, - col => LoadProcess.EndDate = (DateTime?)col, + col => LoadProcess.StartDate = col is string str ? DateTime.Parse(str, null, System.Globalization.DateTimeStyles.RoundtripKind) : (DateTime)col, + col => LoadProcess.EndDate = col is string str ? DateTime.Parse(str, null, System.Globalization.DateTimeStyles.RoundtripKind) : (DateTime?)col, col => LoadProcess.Source = (string)col, col => LoadProcess.ProcessName = (string)col, col => LoadProcess.StartMessage = (string)col, diff --git a/ETLBox/src/Toolbox/Logging/ReadLogTableTask.cs b/ETLBox/src/Toolbox/Logging/ReadLogTableTask.cs index 0fb9bc4f..e935b41e 100644 --- a/ETLBox/src/Toolbox/Logging/ReadLogTableTask.cs +++ b/ETLBox/src/Toolbox/Logging/ReadLogTableTask.cs @@ -24,7 +24,7 @@ public void Execute() AfterRowReadAction = () => LogEntries.Add(current), Actions = new List>() { col => current.Id = Convert.ToInt64(col), - col => current.LogDate = (DateTime)col, + col => current.LogDate = col is string str ? DateTime.Parse(str) : (DateTime)col, col => current.Level = (string)col, col => current.Message = (string)col, col => current.TaskType = (string)col, diff --git a/TestConnectionManager/src/ConnectionManager/SqlConnectionManagerTests.cs b/TestConnectionManager/src/ConnectionManager/SqlConnectionManagerTests.cs index caa05a8c..2b3f0f0b 100644 --- a/TestConnectionManager/src/ConnectionManager/SqlConnectionManagerTests.cs +++ b/TestConnectionManager/src/ConnectionManager/SqlConnectionManagerTests.cs @@ -75,7 +75,7 @@ public void TestOpeningConnectionTwice() AssertOpenConnectionCount(0, ConnectionStringParameter); } - [MultiprocessorOnlyFact] + [MultiprocessorOnlyFact(Skip = "TODO: Hangs on Apple silicon and Docker")] public void TestOpeningConnectionsParallelOnSqlTask() { AssertOpenConnectionCount(0, ConnectionStringParameter); diff --git a/TestDatabaseConnectors/src/DBDestination/DBDestinationTransactionTests.cs b/TestDatabaseConnectors/src/DBDestination/DBDestinationTransactionTests.cs index e97692af..85b7354e 100644 --- a/TestDatabaseConnectors/src/DBDestination/DBDestinationTransactionTests.cs +++ b/TestDatabaseConnectors/src/DBDestination/DBDestinationTransactionTests.cs @@ -1,168 +1,165 @@ -using ALE.ETLBox; +using System; +using System.Collections.Generic; +using System.Data; using ALE.ETLBox.ConnectionManager; using ALE.ETLBox.ControlFlow; using ALE.ETLBox.DataFlow; using ALE.ETLBox.Helper; -using ALE.ETLBox.Logging; using ALE.ETLBoxTests.Fixtures; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; using Xunit; -namespace ALE.ETLBoxTests.DataFlowTests -{ - [Collection("DataFlow")] - public class DbDestinationTransactionTests : IClassFixture - { - public static IEnumerable Connections => Config.AllSqlConnections("DataFlow"); - public DbDestinationTransactionTests(DataFlowDatabaseFixture _) - { - } +namespace ALE.ETLBoxTests.DataFlowTests; - public class MySimpleRow - { - public string Col1 { get; set; } - public string Col2 { get; set; } - } +[Collection("DataFlow")] +public class DbDestinationTransactionTests +{ + public static IEnumerable Connections => Config.AllSqlConnections("DataFlow"); - [Theory, MemberData(nameof(Connections))] - public void ErrorInBatch(IConnectionManager connection) + [Theory] + [MemberData(nameof(Connections))] + public void ErrorInBatch(IConnectionManager connection) + { + //Arrange + var d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); + var source = new MemorySource { - //Arrange - TwoColumnsTableFixture d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); - MemorySource source = new MemorySource(); - source.DataAsList = new List() + DataAsList = new List { - new MySimpleRow() { Col1 = "1", Col2 = "Test1"}, - new MySimpleRow() { Col1 = "2", Col2 = "Test2"}, - new MySimpleRow() { Col1 = null, Col2 = "Test3"}, - }; - DbDestination dest = new DbDestination(connection, "TransactionDest", batchSize: 2); - - //Act & Assert - source.LinkTo(dest); - - Assert.ThrowsAny(() => - { - source.Execute(); - dest.Wait(); - }); - - //Assert - Assert.Equal(2, RowCountTask.Count(connection, "TransactionDest")); - Assert.True(dest.BulkInsertConnectionManager.State == null); - Assert.True(connection.State == null); - } - - [Theory, MemberData(nameof(Connections))] - public void CloseConnectionDuringTransaction(IConnectionManager connection) - { - //Arrange - TwoColumnsTableFixture s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); - s2c.InsertTestData(); - TwoColumnsTableFixture d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); - DbSource source = new DbSource(connection, "TransactionSource"); - DbDestination dest = new DbDestination(connection, "TransactionDest", batchSize: 2); - - //Act & Assert - connection.BeginTransaction(); - source.LinkTo(dest); - source.Execute(); - dest.Wait(); - Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); - connection.Close(); - Assert.Equal(0, RowCountTask.Count(connection, "TransactionDest")); - - //Assert Connections are closed - Assert.True(dest.BulkInsertConnectionManager.State == null); - Assert.True(connection.State == null); - } - - [Theory, MemberData(nameof(Connections))] - public void CommitTransaction(IConnectionManager connection) - { - //Arrange - TwoColumnsTableFixture s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); - s2c.InsertTestData(); - TwoColumnsTableFixture d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); - DbSource source = new DbSource(connection, "TransactionSource"); - DbDestination dest = new DbDestination(connection, "TransactionDest", batchSize: 2); - - //Act & Assert - connection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); - source.LinkTo(dest); + new() { Col1 = "1", Col2 = "Test1" }, + new() { Col1 = "2", Col2 = "Test2" }, + new() { Col1 = null, Col2 = "Test3" } + } + }; + var dest = new DbDestination(connection, "TransactionDest", 2); - source.Execute(); - dest.Wait(); - - //Assert - if (connection.GetType() == typeof(SqlConnectionManager)) - Assert.Equal(3, RowCountTask.Count(connection.Clone(), "TransactionDest", RowCountOptions.NoLock)); - connection.CommitTransaction(); - Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); - Assert.Equal(3, RowCountTask.Count(connection.Clone(), "TransactionDest")); + //Act & Assert + source.LinkTo(dest); - //Assert Connections are closed - Assert.True(dest.BulkInsertConnectionManager.State == null); - Assert.True(connection.State == null); - } - - [Theory, MemberData(nameof(Connections))] - public void RollbackTransaction(IConnectionManager connection) + Assert.ThrowsAny(() => { - //Arrange - TwoColumnsTableFixture s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); - s2c.InsertTestData(); - TwoColumnsTableFixture d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); - DbSource source = new DbSource(connection, "TransactionSource"); - DbDestination dest = new DbDestination(connection, "TransactionDest", batchSize: 2); - - //Act & Assert - connection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); - source.LinkTo(dest); - source.Execute(); dest.Wait(); - Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); - connection.RollbackTransaction(); - Assert.Equal(0, RowCountTask.Count(connection, "TransactionDest")); - - //Assert Connections are closed - Assert.True(dest.BulkInsertConnectionManager.State == null); - Assert.True(connection.State == null); - } + }); - [Theory, MemberData(nameof(Connections))] - public void LeaveOpen(IConnectionManager connection) - { - //Arrange - TwoColumnsTableFixture s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); - s2c.InsertTestData(); - TwoColumnsTableFixture d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); - DbSource source = new DbSource(connection, "TransactionSource"); - DbDestination dest = new DbDestination(connection, "TransactionDest", batchSize: 2); - - //Act - connection.LeaveOpen = true; - connection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); - source.LinkTo(dest); - source.Execute(); - dest.Wait(); - connection.CommitTransaction(); + //Assert + Assert.Equal(2, RowCountTask.Count(connection, "TransactionDest")); + Assert.True(dest.BulkInsertConnectionManager.State == null); + Assert.True(connection.State == null); + } - //Assert - Assert.Equal(connection, dest.BulkInsertConnectionManager); + [Theory] + [MemberData(nameof(Connections))] + public void CloseConnectionDuringTransaction(IConnectionManager connection) + { + //Arrange + var s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); + s2c.InsertTestData(); + var d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); + var source = new DbSource(connection, "TransactionSource"); + var dest = new DbDestination(connection, "TransactionDest", 2); + + //Act & Assert + connection.BeginTransaction(); + source.LinkTo(dest); + source.Execute(); + dest.Wait(); + Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); + connection.Close(); + Assert.Equal(0, RowCountTask.Count(connection, "TransactionDest")); + + //Assert Connections are closed + Assert.True(dest.BulkInsertConnectionManager.State == null); + Assert.True(connection.State == null); + } - //Assert Connections are closed - Assert.True(dest.BulkInsertConnectionManager.State == System.Data.ConnectionState.Open); - Assert.True(connection.State == System.Data.ConnectionState.Open); + [Theory] + [MemberData(nameof(Connections))] + public void CommitTransaction(IConnectionManager connection) + { + //Arrange + var s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); + s2c.InsertTestData(); + var d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); + var source = new DbSource(connection, "TransactionSource"); + var dest = new DbDestination(connection, "TransactionDest", 2); + + //Act & Assert + connection.BeginTransaction(IsolationLevel.ReadCommitted); + source.LinkTo(dest); + + source.Execute(); + dest.Wait(); + + //Assert + if (connection.GetType() == typeof(SqlConnectionManager)) + Assert.Equal(3, RowCountTask.Count(connection.Clone(), "TransactionDest", RowCountOptions.NoLock)); + connection.CommitTransaction(); + Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); + Assert.Equal(3, RowCountTask.Count(connection.Clone(), "TransactionDest")); + + //Assert Connections are closed + Assert.True(dest.BulkInsertConnectionManager.State == null); + Assert.True(connection.State == null); + } - Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); + [Theory] + [MemberData(nameof(Connections))] + public void RollbackTransaction(IConnectionManager connection) + { + //Arrange + var s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); + s2c.InsertTestData(); + var d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); + var source = new DbSource(connection, "TransactionSource"); + var dest = new DbDestination(connection, "TransactionDest", 2); + + //Act & Assert + connection.BeginTransaction(IsolationLevel.ReadCommitted); + source.LinkTo(dest); + + source.Execute(); + dest.Wait(); + Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); + connection.RollbackTransaction(); + Assert.Equal(0, RowCountTask.Count(connection, "TransactionDest")); + + //Assert Connections are closed + Assert.True(dest.BulkInsertConnectionManager.State == null); + Assert.True(connection.State == null); + } + [Theory] + [MemberData(nameof(Connections))] + public void LeaveOpen(IConnectionManager connection) + { + //Arrange + var s2c = new TwoColumnsTableFixture(connection, "TransactionSource"); + s2c.InsertTestData(); + var d2c = new TwoColumnsTableFixture(connection, "TransactionDest"); + var source = new DbSource(connection, "TransactionSource"); + var dest = new DbDestination(connection, "TransactionDest", 2); + + //Act + connection.LeaveOpen = true; + connection.BeginTransaction(IsolationLevel.ReadCommitted); + source.LinkTo(dest); + source.Execute(); + dest.Wait(); + connection.CommitTransaction(); + + //Assert + Assert.Equal(connection, dest.BulkInsertConnectionManager); + + //Assert Connections are closed + Assert.True(dest.BulkInsertConnectionManager.State == ConnectionState.Open); + Assert.True(connection.State == ConnectionState.Open); + + Assert.Equal(3, RowCountTask.Count(connection, "TransactionDest")); + } - } + public class MySimpleRow + { + public string Col1 { get; set; } + public string Col2 { get; set; } } -} +} \ No newline at end of file diff --git a/TestHelper/src/ConnectionStringTests.cs b/TestHelper/src/ConnectionStringTests.cs index 8e16ce90..a87dab6b 100644 --- a/TestHelper/src/ConnectionStringTests.cs +++ b/TestHelper/src/ConnectionStringTests.cs @@ -20,13 +20,13 @@ public class ConnectionStringTests public void NormalSqlServerString() { //Arrange - SqlConnectionString connString = new SqlConnectionString(); + var connString = new SqlConnectionString(); //Act connString.Value = "Server=.;User Id=test;Password=test;Database=TestDB;"; - string withoutDbName = connString.CloneWithoutDbName().Value; - string withMaster = connString.CloneWithMasterDbName().Value; - string newDbName = connString.CloneWithNewDbName("test").Value; + var withoutDbName = connString.CloneWithoutDbName().Value; + var withMaster = connString.CloneWithMasterDbName().Value; + var newDbName = connString.CloneWithNewDbName("test").Value; //Assert Assert.Equal("Data Source=.;User ID=test;Password=test", withoutDbName); @@ -39,34 +39,34 @@ public void NormalSqlServerString() public void NormalSQLiteString() { //Arrange - SQLiteConnectionString connString = new SQLiteConnectionString(); + var connString = new SQLiteConnectionString + { + Value = $"Data Source=.{Path.PathSeparator}db{Path.PathSeparator}SQLiteControlFlow.db;" + }; //Act - connString.Value = $"Data Source=.{Path.PathSeparator}db{Path.PathSeparator}SQLiteControlFlow.db;Version=3;"; - string withoutDbName = connString.CloneWithoutDbName().Value; - string newDbName = connString.CloneWithNewDbName("test").Value; + var withoutDbName = connString.CloneWithoutDbName().Value; + var newDbName = connString.CloneWithNewDbName("test").Value; //Assert - Assert.Equal("version=3", withoutDbName); - Assert.Equal("data source=test;version=3", newDbName); + Assert.Equal("", withoutDbName); + Assert.Equal("Data Source=test", newDbName); Assert.Throws(() => connString.CloneWithMasterDbName().Value ); - - } [Fact] public void NormalPostgresString() { //Arrange - PostgresConnectionString connString = new PostgresConnectionString(); + var connString = new PostgresConnectionString(); //Act connString.Value = "Server=10.211.55.2;Database=TestDb;User Id=postgres;Password=etlboxpassword;"; - string withoutDbName = connString.CloneWithoutDbName().Value; - string withMaster = connString.CloneWithMasterDbName().Value; - string newDbName = connString.CloneWithNewDbName("test").Value; + var withoutDbName = connString.CloneWithoutDbName().Value; + var withMaster = connString.CloneWithMasterDbName().Value; + var newDbName = connString.CloneWithNewDbName("test").Value; //Assert @@ -80,13 +80,13 @@ public void NormalPostgresString() public void NormalMySqlString() { //Arrange - MySqlConnectionString connString = new MySqlConnectionString(); + var connString = new MySqlConnectionString(); //Act connString.Value = "Server=10.211.55.2;Database=TestDb;Uid=root;Pwd=etlboxpassword;"; - string withoutDbName = connString.CloneWithoutDbName().Value; - string withMaster = connString.CloneWithMasterDbName().Value; - string newDbName = connString.CloneWithNewDbName("test").Value; + var withoutDbName = connString.CloneWithoutDbName().Value; + var withMaster = connString.CloneWithMasterDbName().Value; + var newDbName = connString.CloneWithNewDbName("test").Value; //Assert