From 73a1f11e997018fec796f7b0388e5e5263ecc1e1 Mon Sep 17 00:00:00 2001 From: Janus Knudsen Date: Mon, 3 Mar 2025 17:40:16 +0100 Subject: [PATCH] WIP --- Core/Entities/Users/{Class1.cs => User.cs} | 0 .../ConnectionFactory/IDbConnectionFactory.cs | 10 ++ .../PostgresConnectionFactory.cs | 65 ++++++++++++ Core/Sql/SqlOperations.cs | 100 ++++++++++++++++++ .../SetupConfiguration.cs | 2 +- .../ConnectionFactory/IDbConnectionFactory.cs | 10 -- .../PostgresConnectionFactory.cs | 65 ------------ Database/Core/DCL/SetupApplicationUser.cs | 10 +- Database/Core/DCL/SetupDbAdmin.cs | 2 +- Database/Core/DCL/SetupOrganizationUser.cs | 4 +- Database/Core/DDL/SetupIdentitySystem.cs | 13 ++- Database/Core/IDbConfigure.cs | 8 +- Database/Core/Sql/SqlOperations.cs | 100 ------------------ Database/ModuleRegistry/DbPostgreSqlModule.cs | 15 +-- .../Create/CreateOrganizationHandler.cs | 12 ++- .../PlanTempus.Components.csproj | 3 + .../FeatureFixtures/AccountSecuritySpecs.cs | 6 +- SetupInfrastructure/Program.cs | 28 ++--- .../SetupConfigurationTests.cs | 2 +- .../SmartConfigProviderTests.cs | 3 +- Tests/PostgresTests.cs | 6 +- 21 files changed, 236 insertions(+), 228 deletions(-) rename Core/Entities/Users/{Class1.cs => User.cs} (100%) create mode 100644 Core/Sql/ConnectionFactory/IDbConnectionFactory.cs create mode 100644 Core/Sql/ConnectionFactory/PostgresConnectionFactory.cs create mode 100644 Core/Sql/SqlOperations.cs delete mode 100644 Database/Core/ConnectionFactory/IDbConnectionFactory.cs delete mode 100644 Database/Core/ConnectionFactory/PostgresConnectionFactory.cs delete mode 100644 Database/Core/Sql/SqlOperations.cs diff --git a/Core/Entities/Users/Class1.cs b/Core/Entities/Users/User.cs similarity index 100% rename from Core/Entities/Users/Class1.cs rename to Core/Entities/Users/User.cs diff --git a/Core/Sql/ConnectionFactory/IDbConnectionFactory.cs b/Core/Sql/ConnectionFactory/IDbConnectionFactory.cs new file mode 100644 index 0000000..06b0dd2 --- /dev/null +++ b/Core/Sql/ConnectionFactory/IDbConnectionFactory.cs @@ -0,0 +1,10 @@ +namespace PlanTempus.Core.Sql.ConnectionFactory +{ + public record ConnectionStringParameters(string user, string pwd); + + public interface IDbConnectionFactory + { + System.Data.IDbConnection Create(); + System.Data.IDbConnection Create(ConnectionStringParameters connectionStringTemplateParameters); + } +} diff --git a/Core/Sql/ConnectionFactory/PostgresConnectionFactory.cs b/Core/Sql/ConnectionFactory/PostgresConnectionFactory.cs new file mode 100644 index 0000000..d40801e --- /dev/null +++ b/Core/Sql/ConnectionFactory/PostgresConnectionFactory.cs @@ -0,0 +1,65 @@ +using Npgsql; +using System.Data; +namespace PlanTempus.Core.Sql.ConnectionFactory +{ + + + public class PostgresConnectionFactory : IDbConnectionFactory, IAsyncDisposable + { + private readonly NpgsqlDataSource _baseDataSource; + private readonly Action _configureDataSource; + private readonly Microsoft.Extensions.Logging.ILoggerFactory _loggerFactory; //this is not tested nor implemented, I just created it as an idea + + public PostgresConnectionFactory( + string connectionString, + Microsoft.Extensions.Logging.ILoggerFactory loggerFactory = null, + Action configureDataSource = null) + { + _loggerFactory = loggerFactory; + _configureDataSource = configureDataSource ?? (builder => { }); + + // Opret base data source med konfiguration + var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString); + ConfigureDataSourceBuilder(dataSourceBuilder); + _baseDataSource = dataSourceBuilder.Build(); + } + + public IDbConnection Create() + { + return _baseDataSource.CreateConnection(); + } + + public IDbConnection Create(ConnectionStringParameters param) + { + var connectionStringBuilder = new NpgsqlConnectionStringBuilder( + _baseDataSource.ConnectionString) + { + Username = param.user, + Password = param.pwd + }; + + var tempDataSourceBuilder = new NpgsqlDataSourceBuilder( + connectionStringBuilder.ToString()); + + ConfigureDataSourceBuilder(tempDataSourceBuilder); + + var tempDataSource = tempDataSourceBuilder.Build(); + return tempDataSource.CreateConnection(); + } + + private void ConfigureDataSourceBuilder(NpgsqlDataSourceBuilder builder) + { + if (_loggerFactory != null) + { + builder.UseLoggerFactory(_loggerFactory); + } + + _configureDataSource?.Invoke(builder); + } + + public async ValueTask DisposeAsync() + { + await _baseDataSource.DisposeAsync(); + } + } +} diff --git a/Core/Sql/SqlOperations.cs b/Core/Sql/SqlOperations.cs new file mode 100644 index 0000000..09bfc9b --- /dev/null +++ b/Core/Sql/SqlOperations.cs @@ -0,0 +1,100 @@ +using Microsoft.ApplicationInsights; +using Microsoft.ApplicationInsights.DataContracts; +using Microsoft.ApplicationInsights.Extensibility; +using PlanTempus.Core.Sql.ConnectionFactory; +using System.Data; + +namespace PlanTempus.Core.Sql +{ + public class DatabaseScope : IDisposable + { + private readonly IDbConnection _connection; + private readonly IOperationHolder _operation; + + public DatabaseScope(IDbConnection connection, IOperationHolder operation) + { + _connection = connection; + _operation = operation; + } + + public IDbConnection Connection => _connection; + + public void Success() + { + _operation.Telemetry.Success = true; + } + + public void Error(Exception ex) + { + _operation.Telemetry.Success = false; + _operation.Telemetry.Properties["Error"] = ex.Message; + } + + public void Dispose() + { + _operation.Dispose(); + _connection.Dispose(); + } + } + + public interface IDatabaseOperations + { + DatabaseScope CreateScope(string operationName); + Task ExecuteAsync(Func> operation, string operationName); + Task ExecuteAsync(Func operation, string operationName); + } + + public class SqlOperations : IDatabaseOperations + { + private readonly IDbConnectionFactory _connectionFactory; + private readonly TelemetryClient _telemetryClient; + + public SqlOperations(IDbConnectionFactory connectionFactory, TelemetryClient telemetryClient) + { + _connectionFactory = connectionFactory; + _telemetryClient = telemetryClient; + } + + public DatabaseScope CreateScope(string operationName) + { + var connection = _connectionFactory.Create(); + var operation = _telemetryClient.StartOperation(operationName); + operation.Telemetry.Type = "SQL"; + operation.Telemetry.Target = "PostgreSQL"; + + return new DatabaseScope(connection, operation); + } + + public async Task ExecuteAsync(Func> operation, string operationName) + { + using var scope = CreateScope(operationName); + try + { + var result = await operation(scope.Connection); + scope.Success(); + return result; + } + catch (Exception ex) + { + scope.Error(ex); + throw; + } + } + + public async Task ExecuteAsync(Func operation, string operationName) + { + using var scope = CreateScope(operationName); + try + { + await operation(scope.Connection); + scope.Success(); + } + catch (Exception ex) + { + scope.Error(ex); + throw; + } + } + + } +} diff --git a/Database/ConfigurationManagementSystem/SetupConfiguration.cs b/Database/ConfigurationManagementSystem/SetupConfiguration.cs index c1b6d4b..4e4450d 100644 --- a/Database/ConfigurationManagementSystem/SetupConfiguration.cs +++ b/Database/ConfigurationManagementSystem/SetupConfiguration.cs @@ -1,6 +1,6 @@ using Insight.Database; +using PlanTempus.Core.Sql.ConnectionFactory; using PlanTempus.Database.Core; -using PlanTempus.Database.Core.ConnectionFactory; using System.Data; namespace PlanTempus.Database.ConfigurationManagementSystem; diff --git a/Database/Core/ConnectionFactory/IDbConnectionFactory.cs b/Database/Core/ConnectionFactory/IDbConnectionFactory.cs deleted file mode 100644 index e7ec864..0000000 --- a/Database/Core/ConnectionFactory/IDbConnectionFactory.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace PlanTempus.Database.Core.ConnectionFactory -{ - public record ConnectionStringParameters(string user, string pwd); - - public interface IDbConnectionFactory - { - System.Data.IDbConnection Create(); - System.Data.IDbConnection Create(ConnectionStringParameters connectionStringTemplateParameters); - } -} diff --git a/Database/Core/ConnectionFactory/PostgresConnectionFactory.cs b/Database/Core/ConnectionFactory/PostgresConnectionFactory.cs deleted file mode 100644 index 1def0ee..0000000 --- a/Database/Core/ConnectionFactory/PostgresConnectionFactory.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Npgsql; -using System.Data; -namespace PlanTempus.Database.Core.ConnectionFactory -{ - - - public class PostgresConnectionFactory : IDbConnectionFactory, IAsyncDisposable - { - private readonly NpgsqlDataSource _baseDataSource; - private readonly Action _configureDataSource; - private readonly Microsoft.Extensions.Logging.ILoggerFactory _loggerFactory; //this is not tested nor implemented, I just created it as an idea - - public PostgresConnectionFactory( - string connectionString, - Microsoft.Extensions.Logging.ILoggerFactory loggerFactory = null, - Action configureDataSource = null) - { - _loggerFactory = loggerFactory; - _configureDataSource = configureDataSource ?? (builder => { }); - - // Opret base data source med konfiguration - var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString); - ConfigureDataSourceBuilder(dataSourceBuilder); - _baseDataSource = dataSourceBuilder.Build(); - } - - public IDbConnection Create() - { - return _baseDataSource.CreateConnection(); - } - - public IDbConnection Create(ConnectionStringParameters param) - { - var connectionStringBuilder = new NpgsqlConnectionStringBuilder( - _baseDataSource.ConnectionString) - { - Username = param.user, - Password = param.pwd - }; - - var tempDataSourceBuilder = new NpgsqlDataSourceBuilder( - connectionStringBuilder.ToString()); - - ConfigureDataSourceBuilder(tempDataSourceBuilder); - - var tempDataSource = tempDataSourceBuilder.Build(); - return tempDataSource.CreateConnection(); - } - - private void ConfigureDataSourceBuilder(NpgsqlDataSourceBuilder builder) - { - if (_loggerFactory != null) - { - builder.UseLoggerFactory(_loggerFactory); - } - - _configureDataSource?.Invoke(builder); - } - - public async ValueTask DisposeAsync() - { - await _baseDataSource.DisposeAsync(); - } - } -} diff --git a/Database/Core/DCL/SetupApplicationUser.cs b/Database/Core/DCL/SetupApplicationUser.cs index 7a84c37..9f14e66 100644 --- a/Database/Core/DCL/SetupApplicationUser.cs +++ b/Database/Core/DCL/SetupApplicationUser.cs @@ -1,14 +1,14 @@ using System.Data; using Insight.Database; +using PlanTempus.Core.Sql.ConnectionFactory; using PlanTempus.Database.Common; -using PlanTempus.Database.Core.ConnectionFactory; namespace PlanTempus.Database.Core.DCL { - /// - /// Only a superadmin or similar can create Application Users - /// - public class SetupApplicationUser : IDbConfigure + /// + /// Only a superadmin or similar can create Application Users + /// + public class SetupApplicationUser : IDbConfigure { public class Command { diff --git a/Database/Core/DCL/SetupDbAdmin.cs b/Database/Core/DCL/SetupDbAdmin.cs index 07fcce1..42746ed 100644 --- a/Database/Core/DCL/SetupDbAdmin.cs +++ b/Database/Core/DCL/SetupDbAdmin.cs @@ -1,8 +1,8 @@ using System.Data; using Insight.Database; +using PlanTempus.Core.Sql.ConnectionFactory; using PlanTempus.Database.Common; using PlanTempus.Database.Core; -using PlanTempus.Database.Core.ConnectionFactory; namespace PlanTempus.Database.Core.DCL { diff --git a/Database/Core/DCL/SetupOrganizationUser.cs b/Database/Core/DCL/SetupOrganizationUser.cs index 6941989..7708888 100644 --- a/Database/Core/DCL/SetupOrganizationUser.cs +++ b/Database/Core/DCL/SetupOrganizationUser.cs @@ -1,12 +1,12 @@ using System.Data; using Insight.Database; +using PlanTempus.Core.Sql.ConnectionFactory; using PlanTempus.Database.Common; using PlanTempus.Database.Core; -using PlanTempus.Database.Core.ConnectionFactory; namespace PlanTempus.Database.Core.DCL { - public class SetupOrganization : IDbConfigure + public class SetupOrganization : IDbConfigure { public class Command { diff --git a/Database/Core/DDL/SetupIdentitySystem.cs b/Database/Core/DDL/SetupIdentitySystem.cs index 942257e..e3da563 100644 --- a/Database/Core/DDL/SetupIdentitySystem.cs +++ b/Database/Core/DDL/SetupIdentitySystem.cs @@ -1,14 +1,14 @@ using Insight.Database; -using PlanTempus.Database.Core.ConnectionFactory; +using PlanTempus.Core.Sql.ConnectionFactory; using System.Data; namespace PlanTempus.Database.Core.DDL { - /// - /// This is by purpose not async await - /// It is intended that this is created with the correct Application User, which is why the schema name is omitted. - /// - public class SetupIdentitySystem : IDbConfigure + /// + /// This is by purpose not async await + /// It is intended that this is created with the correct Application User, which is why the schema name is omitted. + /// + public class SetupIdentitySystem : IDbConfigure { public class Command { @@ -89,7 +89,6 @@ namespace PlanTempus.Database.Core.DDL );"; db.ExecuteSql(sql); - } /// diff --git a/Database/Core/IDbConfigure.cs b/Database/Core/IDbConfigure.cs index 7eb5da4..c2bbf82 100644 --- a/Database/Core/IDbConfigure.cs +++ b/Database/Core/IDbConfigure.cs @@ -1,7 +1,9 @@ -namespace PlanTempus.Database.Core +using PlanTempus.Core.Sql.ConnectionFactory; + +namespace PlanTempus.Database.Core { - public interface IDbConfigure + public interface IDbConfigure { - void With(T command, ConnectionFactory.ConnectionStringParameters parameters = null); + void With(T command, ConnectionStringParameters parameters = null); } } diff --git a/Database/Core/Sql/SqlOperations.cs b/Database/Core/Sql/SqlOperations.cs deleted file mode 100644 index ae96dc0..0000000 --- a/Database/Core/Sql/SqlOperations.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Microsoft.ApplicationInsights; -using Microsoft.ApplicationInsights.DataContracts; -using Microsoft.ApplicationInsights.Extensibility; -using PlanTempus.Database.ModuleRegistry; -using System.Data; - -namespace PlanTempus.Database.Core.Sql -{ - public class DatabaseScope : IDisposable - { - private readonly IDbConnection _connection; - private readonly IOperationHolder _operation; - - public DatabaseScope(IDbConnection connection, IOperationHolder operation) - { - _connection = connection; - _operation = operation; - } - - public IDbConnection Connection => _connection; - - public void Success() - { - _operation.Telemetry.Success = true; - } - - public void Error(Exception ex) - { - _operation.Telemetry.Success = false; - _operation.Telemetry.Properties["Error"] = ex.Message; - } - - public void Dispose() - { - _operation.Dispose(); - _connection.Dispose(); - } - } - - public interface IDatabaseOperations - { - DatabaseScope CreateScope(string operationName); - Task ExecuteAsync(Func> operation, string operationName); - Task ExecuteAsync(Func operation, string operationName); - } - - public class SqlOperations : IDatabaseOperations - { - private readonly ConnectionFactory.IDbConnectionFactory _connectionFactory; - private readonly TelemetryClient _telemetryClient; - - public SqlOperations(ConnectionFactory.IDbConnectionFactory connectionFactory, TelemetryClient telemetryClient) - { - _connectionFactory = connectionFactory; - _telemetryClient = telemetryClient; - } - - public DatabaseScope CreateScope(string operationName) - { - var connection = _connectionFactory.Create(); - var operation = _telemetryClient.StartOperation(operationName); - operation.Telemetry.Type = "SQL"; - operation.Telemetry.Target = "PostgreSQL"; - - return new DatabaseScope(connection, operation); - } - - public async Task ExecuteAsync(Func> operation, string operationName) - { - using var scope = CreateScope(operationName); - try - { - var result = await operation(scope.Connection); - scope.Success(); - return result; - } - catch (Exception ex) - { - scope.Error(ex); - throw; - } - } - - public async Task ExecuteAsync(Func operation, string operationName) - { - using var scope = CreateScope(operationName); - try - { - await operation(scope.Connection); - scope.Success(); - } - catch (Exception ex) - { - scope.Error(ex); - throw; - } - } - - } -} diff --git a/Database/ModuleRegistry/DbPostgreSqlModule.cs b/Database/ModuleRegistry/DbPostgreSqlModule.cs index 07c756c..9427dea 100644 --- a/Database/ModuleRegistry/DbPostgreSqlModule.cs +++ b/Database/ModuleRegistry/DbPostgreSqlModule.cs @@ -1,10 +1,11 @@ using Autofac; -using Npgsql; -using System.Data; +using PlanTempus.Core.Sql; +using PlanTempus.Core.Sql.ConnectionFactory; + namespace PlanTempus.Database.ModuleRegistry { - public class DbPostgreSqlModule : Module + public class DbPostgreSqlModule : Module { public required string ConnectionString { get; set; } @@ -12,13 +13,13 @@ namespace PlanTempus.Database.ModuleRegistry { Insight.Database.Providers.PostgreSQL.PostgreSQLInsightDbProvider.RegisterProvider(); - builder.RegisterType() - .As() + builder.RegisterType() + .As() .WithParameter(new TypedParameter(typeof(string), ConnectionString)) .SingleInstance(); - builder.RegisterType() - .As(); + builder.RegisterType() + .As(); } } diff --git a/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs b/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs index 9009d48..7b80156 100644 --- a/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs +++ b/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs @@ -1,5 +1,6 @@ using Insight.Database; - +using PlanTempus.Core.Sql; + namespace PlanTempus.Components.Organizations.Create { public class CreateOrganizationHandler @@ -19,11 +20,12 @@ namespace PlanTempus.Components.Organizations.Create var organizationId = Guid.NewGuid(); var now = DateTime.UtcNow; - var sql = @" - INSERT INTO Organizations (Id, Name, Description, CreatedById, CreatedAt, UpdatedAt) - VALUES (@Id, @Name, @Description, @CreatedById, @CreatedAt, @UpdatedAt)"; + var sql = @" + INSERT INTO organizations (id, name, description, created_by_id) + VALUES (@Id, @Name, @Description, @CreatedById)"; - await db.Connection.ExecuteSqlAsync(sql, new + + await db.Connection.ExecuteSqlAsync(sql, new { Id = organizationId, command.Name, diff --git a/PlanTempus.Components/PlanTempus.Components.csproj b/PlanTempus.Components/PlanTempus.Components.csproj index eb495fd..d0bccb2 100644 --- a/PlanTempus.Components/PlanTempus.Components.csproj +++ b/PlanTempus.Components/PlanTempus.Components.csproj @@ -10,6 +10,9 @@ + + + diff --git a/PlanTempus.X.BDD/FeatureFixtures/AccountSecuritySpecs.cs b/PlanTempus.X.BDD/FeatureFixtures/AccountSecuritySpecs.cs index dfb04c7..f0902a0 100644 --- a/PlanTempus.X.BDD/FeatureFixtures/AccountSecuritySpecs.cs +++ b/PlanTempus.X.BDD/FeatureFixtures/AccountSecuritySpecs.cs @@ -6,9 +6,9 @@ using Shouldly; namespace PlanTempus.X.BDD.FeatureFixtures; [TestClass] -[FeatureDescription(@"As a system administrator -I want to ensure account security is maintained -So users' data remains protected")] + [FeatureDescription(@"As a system administrator + I want to ensure account security is maintained + So users' data remains protected")] public partial class AccountSecuritySpecs : FeatureFixture { IUserService _userService; diff --git a/SetupInfrastructure/Program.cs b/SetupInfrastructure/Program.cs index e4f6e97..bea1499 100644 --- a/SetupInfrastructure/Program.cs +++ b/SetupInfrastructure/Program.cs @@ -3,8 +3,8 @@ using Insight.Database; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Npgsql; +using PlanTempus.Core.Sql.ConnectionFactory; using PlanTempus.Database.ConfigurationManagementSystem; -using PlanTempus.Database.Core.ConnectionFactory; using PlanTempus.Database.Core.DCL; using PlanTempus.Database.Core.DDL; using System.Data; @@ -12,19 +12,19 @@ using System.Diagnostics; namespace PlanTempus.SetupInfrastructure { - /// - /// SETUP APPLICATION USER NAMED sathumper - /// - /// This should be handled on the Postgresql db server with a superadmin or similar. - /// - /// Execute SQL CreateRole.txt - /// - /// After that is executed it is time for running this main program - /// Remember to use the newly created sathumper - /// "ConnectionStrings": { - /// "DefaultConnection": "Host=192.168.1.57;Port=5432;Database=ptdb01;User Id=;Password=;" - /// - internal class Program + /// + /// SETUP APPLICATION USER NAMED sathumper + /// + /// This should be handled on the Postgresql db server with a superadmin or similar. + /// + /// Execute SQL CreateRole.txt + /// + /// After that is executed it is time for running this main program + /// Remember to use the newly created sathumper + /// "ConnectionStrings": { + /// "DefaultConnection": "Host=192.168.1.57;Port=5432;Database=ptdb01;User Id=;Password=;" + /// + internal class Program { static async Task Main(string[] args) diff --git a/Tests/ConfigurationSystem/SetupConfigurationTests.cs b/Tests/ConfigurationSystem/SetupConfigurationTests.cs index 1894e9d..f1676d1 100644 --- a/Tests/ConfigurationSystem/SetupConfigurationTests.cs +++ b/Tests/ConfigurationSystem/SetupConfigurationTests.cs @@ -4,7 +4,7 @@ using System.Data; using Newtonsoft.Json; using Autofac; using Shouldly; -using PlanTempus.Database.Core.ConnectionFactory; +using PlanTempus.Core.Sql.ConnectionFactory; namespace PlanTempus.Tests.ConfigurationSystem; diff --git a/Tests/ConfigurationTests/SmartConfigProviderTests.cs b/Tests/ConfigurationTests/SmartConfigProviderTests.cs index 6f962b0..1304afe 100644 --- a/Tests/ConfigurationTests/SmartConfigProviderTests.cs +++ b/Tests/ConfigurationTests/SmartConfigProviderTests.cs @@ -5,6 +5,7 @@ using Insight.Database; using PlanTempus.Core.Configurations; using PlanTempus.Core.Configurations.JsonConfigProvider; using PlanTempus.Core.Configurations.SmartConfigProvider; +using PlanTempus.Core.Sql.ConnectionFactory; namespace PlanTempus.Tests.ConfigurationTests { @@ -66,7 +67,7 @@ namespace PlanTempus.Tests.ConfigurationTests [TestMethod] public void TryGetActiveConfigurations() { - var connFactory = Container.Resolve(); + var connFactory = Container.Resolve(); const string sql = @" SELECT id, ""key"", value, label, content_type, diff --git a/Tests/PostgresTests.cs b/Tests/PostgresTests.cs index 858381a..a1e77c4 100644 --- a/Tests/PostgresTests.cs +++ b/Tests/PostgresTests.cs @@ -2,12 +2,12 @@ using Autofac; using System.Data; using Insight.Database; using Microsoft.VisualStudio.TestTools.UnitTesting; -using PlanTempus.Database.Core.Sql; -using PlanTempus.Database.Core.ConnectionFactory; +using PlanTempus.Core.Sql.ConnectionFactory; +using PlanTempus.Core.Sql; namespace PlanTempus.Tests { - [TestClass] + [TestClass] public class PostgresTests : TestFixture { IDbConnectionFactory _connFactory;