From 55bf0706a4cbe1d83929d68e1bb584f41eb5cb12 Mon Sep 17 00:00:00 2001 From: JaBistDuNarrisch Date: Wed, 1 Oct 2025 11:23:55 +0200 Subject: [PATCH 1/2] Removed unused usings --- ...ostgreSqlDatabaseIntegrationTestService.cs | 1 - ...SqlServerDatabaseIntegrationTestService.cs | 223 ++++++----- src/Migrator.Tests/ProviderFactoryTest.cs | 2 - .../Base/TransformationProviderSimpleBase.cs | 90 +++-- .../Generic/Generic_AddIndexTestsBase.cs | 247 ++++++------ ...Generic_UpdateFromTableToTableTestsBase.cs | 1 - .../OracleTransformationProviderTestBase.cs | 40 +- ...cleTransformationProvider_AddIndexTests.cs | 365 +++++++++--------- ...TransformationProvider_GetColumns_Tests.cs | 227 ++++++----- ...SQLTransformationProvider_AddTableTests.cs | 47 ++- ...onProvider_GetColumns_DefaultValueTests.cs | 323 ++++++++-------- ...formationProvider_PrimaryKeyExistsTests.cs | 37 +- ...ionProvider_PrimaryKeyWithIdentityTests.cs | 93 +++-- ...verTransformationProvider_AddTableTests.cs | 2 - ...ransformationProvider_ChangeColumnTests.cs | 8 - ...Provider_GetColumns_DefaultValues_Tests.cs | 183 +++++---- .../SqlServerTransformationProviderTests.cs | 111 +++--- ...ransformationProvider_ChangeColumnTests.cs | 1 - ...iteTransformationProvider_RecreateTable.cs | 68 ++-- ...ransformationProvider_RenameColumnTests.cs | 159 ++++---- src/Migrator/Framework/ViewField.cs | 2 - src/Migrator/MigrationComparer.cs | 3 +- .../Providers/ColumnPropertiesMapper.cs | 1 - .../Impl/DB2/DB2TransformationProvider.cs | 1 - .../FirebirdColumnPropertiesMapper.cs | 4 +- .../Impl/Firebird/FirebirdDialect.cs | 1 - .../FirebirdTransformationProvider.cs | 1 - .../Oracle/OracleTransformationProvider.cs | 1 - 28 files changed, 1094 insertions(+), 1148 deletions(-) diff --git a/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/PostgreSqlDatabaseIntegrationTestService.cs b/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/PostgreSqlDatabaseIntegrationTestService.cs index 14e18f76..1125e7d5 100644 --- a/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/PostgreSqlDatabaseIntegrationTestService.cs +++ b/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/PostgreSqlDatabaseIntegrationTestService.cs @@ -4,7 +4,6 @@ using System.Threading; using System.Threading.Tasks; using LinqToDB; -using LinqToDB.Async; using LinqToDB.Data; using Mapster; using Migrator.Tests.Database.DatabaseName.Interfaces; diff --git a/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/SqlServerDatabaseIntegrationTestService.cs b/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/SqlServerDatabaseIntegrationTestService.cs index 204fff30..7ec8b2a6 100644 --- a/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/SqlServerDatabaseIntegrationTestService.cs +++ b/src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/SqlServerDatabaseIntegrationTestService.cs @@ -1,112 +1,111 @@ -using System; -using System.Data.Common; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using LinqToDB; -using LinqToDB.Async; -using LinqToDB.Data; -using Mapster; -using Microsoft.Data.SqlClient; -using Migrator.Tests.Database.DatabaseName.Interfaces; -using Migrator.Tests.Database.Interfaces; -using Migrator.Tests.Database.Models; -using Migrator.Tests.Settings.Models; - -namespace Migrator.Tests.Database.DerivedDatabaseIntegrationTestServices; - -public class SqlServerDatabaseIntegrationTestService(TimeProvider timeProvider, IDatabaseNameService databaseNameService) - : DatabaseIntegrationTestServiceBase(databaseNameService), IDatabaseIntegrationTestService -{ - private const string SqlServerInitialCatalogString = "Initial Catalog"; - - public override async Task CreateTestDatabaseAsync(DatabaseConnectionConfig databaseConnectionConfig, CancellationToken cancellationToken) - { - using var context = new DataConnection(new DataOptions().UseSqlServer(databaseConnectionConfig.ConnectionString)); - await context.ExecuteAsync("use master", cancellationToken); - - var databaseNames = context.Query($"SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')").ToList(); - - var toBeDeletedDatabaseNames = databaseNames.Where(x => - { - var creationDate = DatabaseNameService.ReadTimeStampFromString(x); - return creationDate.HasValue && creationDate.Value < timeProvider.GetUtcNow().Subtract(MinTimeSpanBeforeDatabaseDeletion); - }).ToList(); - - foreach (var databaseName in toBeDeletedDatabaseNames) - { - var databaseInfoToBeDeleted = new DatabaseInfo { DatabaseConnectionConfig = databaseConnectionConfig, DatabaseName = databaseName }; - await DropDatabaseAsync(databaseInfoToBeDeleted, cancellationToken); - } - - var newDatabaseName = DatabaseNameService.CreateDatabaseName(); - - await context.ExecuteAsync($"CREATE DATABASE [{newDatabaseName}]", cancellationToken); - - var clonedDatabaseConnectionConfig = databaseConnectionConfig.Adapt(); - - var builder = new DbConnectionStringBuilder - { - ConnectionString = clonedDatabaseConnectionConfig.ConnectionString - }; - - if (builder.TryGetValue(SqlServerInitialCatalogString, out var value)) - { - builder.Remove(SqlServerInitialCatalogString); - builder.Add(SqlServerInitialCatalogString, newDatabaseName); - } - - clonedDatabaseConnectionConfig.ConnectionString = builder.ConnectionString; - - var databaseInfo = new DatabaseInfo - { - DatabaseConnectionConfig = clonedDatabaseConnectionConfig, - DatabaseName = newDatabaseName - }; - - return databaseInfo; - } - - public override async Task DropDatabaseAsync(DatabaseInfo databaseInfo, CancellationToken cancellationToken) - { - var creationDate = DatabaseNameService.ReadTimeStampFromString(databaseInfo.DatabaseName); - - if (!creationDate.HasValue) - { - throw new Exception("You tried to drop a database that was not created by this service. For safety reasons we deny your request."); - } - - using var context = new DataConnection(new DataOptions().UseSqlServer(databaseInfo.DatabaseConnectionConfig.ConnectionString)); - await context.ExecuteAsync("use master", cancellationToken); - - try - { - await context.ExecuteAsync($"ALTER DATABASE [{databaseInfo.DatabaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", cancellationToken); - await context.ExecuteAsync($"DROP DATABASE [{databaseInfo.DatabaseName}]", cancellationToken); - } - catch (SqlException ex) - { - // 3701: "Cannot drop the database because it does not exist or you do not have permission" - if (ex.Errors.Count > 0 && ex.Errors.Cast().Any(x => x.Number == 3701)) - { - await Task.Delay(5000, cancellationToken); - - var count = await context.ExecuteAsync($"SELECT COUNT(*) FROM sys.databases WHERE name = '{databaseInfo.DatabaseName}'"); - - if (count == 1) - { - throw new UnauthorizedAccessException($"The database '{databaseInfo.DatabaseName}' cannot be dropped but it still exists so we assume you do not have sufficient privileges to drop databases or this database.", ex); - } - else - { - // The database was removed by another (asynchronously) running test that kicked in earlier. - // That's ok for us as we have achieved the goal. - } - } - else - { - throw; - } - } - } -} +using System; +using System.Data.Common; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using LinqToDB; +using LinqToDB.Data; +using Mapster; +using Microsoft.Data.SqlClient; +using Migrator.Tests.Database.DatabaseName.Interfaces; +using Migrator.Tests.Database.Interfaces; +using Migrator.Tests.Database.Models; +using Migrator.Tests.Settings.Models; + +namespace Migrator.Tests.Database.DerivedDatabaseIntegrationTestServices; + +public class SqlServerDatabaseIntegrationTestService(TimeProvider timeProvider, IDatabaseNameService databaseNameService) + : DatabaseIntegrationTestServiceBase(databaseNameService), IDatabaseIntegrationTestService +{ + private const string SqlServerInitialCatalogString = "Initial Catalog"; + + public override async Task CreateTestDatabaseAsync(DatabaseConnectionConfig databaseConnectionConfig, CancellationToken cancellationToken) + { + using var context = new DataConnection(new DataOptions().UseSqlServer(databaseConnectionConfig.ConnectionString)); + await context.ExecuteAsync("use master", cancellationToken); + + var databaseNames = context.Query($"SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')").ToList(); + + var toBeDeletedDatabaseNames = databaseNames.Where(x => + { + var creationDate = DatabaseNameService.ReadTimeStampFromString(x); + return creationDate.HasValue && creationDate.Value < timeProvider.GetUtcNow().Subtract(MinTimeSpanBeforeDatabaseDeletion); + }).ToList(); + + foreach (var databaseName in toBeDeletedDatabaseNames) + { + var databaseInfoToBeDeleted = new DatabaseInfo { DatabaseConnectionConfig = databaseConnectionConfig, DatabaseName = databaseName }; + await DropDatabaseAsync(databaseInfoToBeDeleted, cancellationToken); + } + + var newDatabaseName = DatabaseNameService.CreateDatabaseName(); + + await context.ExecuteAsync($"CREATE DATABASE [{newDatabaseName}]", cancellationToken); + + var clonedDatabaseConnectionConfig = databaseConnectionConfig.Adapt(); + + var builder = new DbConnectionStringBuilder + { + ConnectionString = clonedDatabaseConnectionConfig.ConnectionString + }; + + if (builder.TryGetValue(SqlServerInitialCatalogString, out var value)) + { + builder.Remove(SqlServerInitialCatalogString); + builder.Add(SqlServerInitialCatalogString, newDatabaseName); + } + + clonedDatabaseConnectionConfig.ConnectionString = builder.ConnectionString; + + var databaseInfo = new DatabaseInfo + { + DatabaseConnectionConfig = clonedDatabaseConnectionConfig, + DatabaseName = newDatabaseName + }; + + return databaseInfo; + } + + public override async Task DropDatabaseAsync(DatabaseInfo databaseInfo, CancellationToken cancellationToken) + { + var creationDate = DatabaseNameService.ReadTimeStampFromString(databaseInfo.DatabaseName); + + if (!creationDate.HasValue) + { + throw new Exception("You tried to drop a database that was not created by this service. For safety reasons we deny your request."); + } + + using var context = new DataConnection(new DataOptions().UseSqlServer(databaseInfo.DatabaseConnectionConfig.ConnectionString)); + await context.ExecuteAsync("use master", cancellationToken); + + try + { + await context.ExecuteAsync($"ALTER DATABASE [{databaseInfo.DatabaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", cancellationToken); + await context.ExecuteAsync($"DROP DATABASE [{databaseInfo.DatabaseName}]", cancellationToken); + } + catch (SqlException ex) + { + // 3701: "Cannot drop the database because it does not exist or you do not have permission" + if (ex.Errors.Count > 0 && ex.Errors.Cast().Any(x => x.Number == 3701)) + { + await Task.Delay(5000, cancellationToken); + + var count = await context.ExecuteAsync($"SELECT COUNT(*) FROM sys.databases WHERE name = '{databaseInfo.DatabaseName}'"); + + if (count == 1) + { + throw new UnauthorizedAccessException($"The database '{databaseInfo.DatabaseName}' cannot be dropped but it still exists so we assume you do not have sufficient privileges to drop databases or this database.", ex); + } + else + { + // The database was removed by another (asynchronously) running test that kicked in earlier. + // That's ok for us as we have achieved the goal. + } + } + else + { + throw; + } + } + } +} diff --git a/src/Migrator.Tests/ProviderFactoryTest.cs b/src/Migrator.Tests/ProviderFactoryTest.cs index 8687b4ef..8c9c3c81 100644 --- a/src/Migrator.Tests/ProviderFactoryTest.cs +++ b/src/Migrator.Tests/ProviderFactoryTest.cs @@ -1,6 +1,4 @@ using System; -using System.Configuration; -using System.Diagnostics; using System.Linq; using DotNetProjects.Migrator; using DotNetProjects.Migrator.Providers; diff --git a/src/Migrator.Tests/Providers/Base/TransformationProviderSimpleBase.cs b/src/Migrator.Tests/Providers/Base/TransformationProviderSimpleBase.cs index 40f4725f..94050506 100644 --- a/src/Migrator.Tests/Providers/Base/TransformationProviderSimpleBase.cs +++ b/src/Migrator.Tests/Providers/Base/TransformationProviderSimpleBase.cs @@ -1,46 +1,44 @@ -using System; -using System.Data; -using DotNetProjects.Migrator.Framework; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.Base; - -public abstract class TransformationProviderSimpleBase : TransformationProviderBase -{ - public void AddDefaultTable() - { - Provider.AddTable("TestTwo", - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("TestId", DbType.Int32) - ); - } - - public void AddTable() - { - Provider.AddTable("Test", - new Column("Id", DbType.Int32, ColumnProperty.NotNull), - new Column("Title", DbType.String, 100, ColumnProperty.Null), - new Column("name", DbType.String, 50, ColumnProperty.Null), - new Column("blobVal", DbType.Binary, ColumnProperty.Null), - new Column("boolVal", DbType.Boolean, ColumnProperty.Null), - new Column("bigstring", DbType.String, 50000, ColumnProperty.Null) - ); - } - - public void AddTableWithPrimaryKey() - { - Provider.AddTable("Test", - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), - new Column("Title", DbType.String, 100, ColumnProperty.Null), - new Column("name", DbType.String, 50, ColumnProperty.NotNull), - new Column("blobVal", DbType.Binary), - new Column("boolVal", DbType.Boolean), - new Column("bigstring", DbType.String, 50000) - ); - } - - public void AddPrimaryKey() - { - Provider.AddPrimaryKey("PK_Test", "Test", "Id"); - } -} +using System.Data; +using DotNetProjects.Migrator.Framework; + +namespace Migrator.Tests.Providers.Base; + +public abstract class TransformationProviderSimpleBase : TransformationProviderBase +{ + public void AddDefaultTable() + { + Provider.AddTable("TestTwo", + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("TestId", DbType.Int32) + ); + } + + public void AddTable() + { + Provider.AddTable("Test", + new Column("Id", DbType.Int32, ColumnProperty.NotNull), + new Column("Title", DbType.String, 100, ColumnProperty.Null), + new Column("name", DbType.String, 50, ColumnProperty.Null), + new Column("blobVal", DbType.Binary, ColumnProperty.Null), + new Column("boolVal", DbType.Boolean, ColumnProperty.Null), + new Column("bigstring", DbType.String, 50000, ColumnProperty.Null) + ); + } + + public void AddTableWithPrimaryKey() + { + Provider.AddTable("Test", + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), + new Column("Title", DbType.String, 100, ColumnProperty.Null), + new Column("name", DbType.String, 50, ColumnProperty.NotNull), + new Column("blobVal", DbType.Binary), + new Column("boolVal", DbType.Boolean), + new Column("bigstring", DbType.String, 50000) + ); + } + + public void AddPrimaryKey() + { + Provider.AddPrimaryKey("PK_Test", "Test", "Id"); + } +} diff --git a/src/Migrator.Tests/Providers/Generic/Generic_AddIndexTestsBase.cs b/src/Migrator.Tests/Providers/Generic/Generic_AddIndexTestsBase.cs index 6f7c3de8..1076d801 100644 --- a/src/Migrator.Tests/Providers/Generic/Generic_AddIndexTestsBase.cs +++ b/src/Migrator.Tests/Providers/Generic/Generic_AddIndexTestsBase.cs @@ -1,126 +1,123 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.Linq; -using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Models.Indexes; -using DotNetProjects.Migrator.Providers.Models.Indexes.Enums; -using Migrator.Tests.Providers.Base; -using NUnit.Framework; -using Index = DotNetProjects.Migrator.Framework.Index; - -namespace Migrator.Tests.Providers.Generic; - -public abstract class Generic_AddIndexTestsBase : TransformationProviderBase -{ - [Test] - public void AddIndex_TableDoesNotExist() - { - // Act - Assert.Throws(() => Provider.AddIndex("NotExistingTable", new Index())); - Assert.Throws(() => Provider.AddIndex("NotExistingIndex", "NotExistingTable", "column")); - } - - [Test] - public void AddIndex_AddAlreadyExistingIndex_Throws() - { - // Arrange - const string tableName = "TestTable"; - const string columnName = "TestColumn"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, new Column(columnName, DbType.Int32)); - Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] }); - - // Act/Assert - // Add already existing index - Assert.Throws(() => Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] })); - } - - [Test] - public void AddIndex_IncludeColumnsContainsColumnThatExistInKeyColumns_Throws() - { - // Arrange - const string tableName = "TestTable"; - const string columnName1 = "TestColumn1"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, new Column(columnName1, DbType.Int32)); - - Assert.Throws(() => Provider.AddIndex(tableName, - new Index - { - Name = indexName, - KeyColumns = [columnName1], - IncludeColumns = [columnName1] - })); - } - - [Test] - public void AddIndex_ColumnNameUsedInFilterItemDoesNotExistInKeyColumns_Throws() - { - // Arrange - const string tableName = "TestTable"; - const string columnName1 = "TestColumn1"; - const string columnName2 = "TestColumn2"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, - new Column(columnName1, DbType.Int32), - new Column(columnName2, DbType.Int32) - ); - - Assert.Throws(() => Provider.AddIndex(tableName, - new Index - { - Name = indexName, - KeyColumns = [columnName1], - FilterItems = [new FilterItem { Filter = FilterType.GreaterThan, ColumnName = columnName2, Value = 12 }] - })); - } - - [Test] - public void AddIndex_UsingIndexInstanceOverload_NonUnique_ShouldBeReadable() - { - // Arrange - const string tableName = "TestTable"; - const string columnName = "TestColumn"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, new Column(columnName, DbType.Int32)); - - // Act - Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] }); - - // Assert - var indexes = Provider.GetIndexes(tableName); - - var index = indexes.Single(); - - Assert.That(index.Name, Is.EqualTo(indexName).IgnoreCase); - Assert.That(index.KeyColumns.Single(), Is.EqualTo(columnName).IgnoreCase); - } - - [Test] - public void AddIndex_UsingNonIndexInstanceOverload_NonUnique_ShouldBeReadable() - { - // Arrange - const string tableName = "TestTable"; - const string columnName = "TestColumn"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, new Column(columnName, DbType.Int32)); - - // Act - Provider.AddIndex(indexName, tableName, columnName); - - // Assert - var indexes = Provider.GetIndexes(tableName); - - var index = indexes.Single(); - - Assert.That(index.Name, Is.EqualTo(indexName).IgnoreCase); - Assert.That(index.KeyColumns.Single(), Is.EqualTo(columnName).IgnoreCase); - } +using System.Data; +using System.Linq; +using DotNetProjects.Migrator.Framework; +using DotNetProjects.Migrator.Providers.Models.Indexes; +using DotNetProjects.Migrator.Providers.Models.Indexes.Enums; +using Migrator.Tests.Providers.Base; +using NUnit.Framework; +using Index = DotNetProjects.Migrator.Framework.Index; + +namespace Migrator.Tests.Providers.Generic; + +public abstract class Generic_AddIndexTestsBase : TransformationProviderBase +{ + [Test] + public void AddIndex_TableDoesNotExist() + { + // Act + Assert.Throws(() => Provider.AddIndex("NotExistingTable", new Index())); + Assert.Throws(() => Provider.AddIndex("NotExistingIndex", "NotExistingTable", "column")); + } + + [Test] + public void AddIndex_AddAlreadyExistingIndex_Throws() + { + // Arrange + const string tableName = "TestTable"; + const string columnName = "TestColumn"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, new Column(columnName, DbType.Int32)); + Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] }); + + // Act/Assert + // Add already existing index + Assert.Throws(() => Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] })); + } + + [Test] + public void AddIndex_IncludeColumnsContainsColumnThatExistInKeyColumns_Throws() + { + // Arrange + const string tableName = "TestTable"; + const string columnName1 = "TestColumn1"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, new Column(columnName1, DbType.Int32)); + + Assert.Throws(() => Provider.AddIndex(tableName, + new Index + { + Name = indexName, + KeyColumns = [columnName1], + IncludeColumns = [columnName1] + })); + } + + [Test] + public void AddIndex_ColumnNameUsedInFilterItemDoesNotExistInKeyColumns_Throws() + { + // Arrange + const string tableName = "TestTable"; + const string columnName1 = "TestColumn1"; + const string columnName2 = "TestColumn2"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, + new Column(columnName1, DbType.Int32), + new Column(columnName2, DbType.Int32) + ); + + Assert.Throws(() => Provider.AddIndex(tableName, + new Index + { + Name = indexName, + KeyColumns = [columnName1], + FilterItems = [new FilterItem { Filter = FilterType.GreaterThan, ColumnName = columnName2, Value = 12 }] + })); + } + + [Test] + public void AddIndex_UsingIndexInstanceOverload_NonUnique_ShouldBeReadable() + { + // Arrange + const string tableName = "TestTable"; + const string columnName = "TestColumn"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, new Column(columnName, DbType.Int32)); + + // Act + Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] }); + + // Assert + var indexes = Provider.GetIndexes(tableName); + + var index = indexes.Single(); + + Assert.That(index.Name, Is.EqualTo(indexName).IgnoreCase); + Assert.That(index.KeyColumns.Single(), Is.EqualTo(columnName).IgnoreCase); + } + + [Test] + public void AddIndex_UsingNonIndexInstanceOverload_NonUnique_ShouldBeReadable() + { + // Arrange + const string tableName = "TestTable"; + const string columnName = "TestColumn"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, new Column(columnName, DbType.Int32)); + + // Act + Provider.AddIndex(indexName, tableName, columnName); + + // Assert + var indexes = Provider.GetIndexes(tableName); + + var index = indexes.Single(); + + Assert.That(index.Name, Is.EqualTo(indexName).IgnoreCase); + Assert.That(index.KeyColumns.Single(), Is.EqualTo(columnName).IgnoreCase); + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs b/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs index 1e19fc29..461c11a3 100644 --- a/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs +++ b/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Data; using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Framework.Models; using Migrator.Tests.Providers.Base; using Migrator.Tests.Providers.Generic.Models; using NUnit.Framework; diff --git a/src/Migrator.Tests/Providers/OracleProvider/Base/OracleTransformationProviderTestBase.cs b/src/Migrator.Tests/Providers/OracleProvider/Base/OracleTransformationProviderTestBase.cs index 8839dc37..f9a368d7 100644 --- a/src/Migrator.Tests/Providers/OracleProvider/Base/OracleTransformationProviderTestBase.cs +++ b/src/Migrator.Tests/Providers/OracleProvider/Base/OracleTransformationProviderTestBase.cs @@ -1,26 +1,16 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using DotNetProjects.Migrator.Providers; -using DotNetProjects.Migrator.Providers.Impl.Oracle; -using DryIoc; -using Migrator.Tests.Database; -using Migrator.Tests.Database.Interfaces; -using Migrator.Tests.Providers.Base; -using Migrator.Tests.Settings; -using Migrator.Tests.Settings.Config; -using Migrator.Tests.Settings.Models; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.OracleProvider.Base; - -public class OracleTransformationProviderTestBase : TransformationProviderSimpleBase -{ - [SetUp] - public async Task SetUpAsync() - { - await BeginOracleTransactionAsync(); - - AddDefaultTable(); - } +using System.Threading.Tasks; +using Migrator.Tests.Providers.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.OracleProvider.Base; + +public class OracleTransformationProviderTestBase : TransformationProviderSimpleBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginOracleTransactionAsync(); + + AddDefaultTable(); + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddIndexTests.cs b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddIndexTests.cs index 12ae1876..c9613a5b 100644 --- a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddIndexTests.cs +++ b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddIndexTests.cs @@ -1,184 +1,183 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Models.Indexes; -using DotNetProjects.Migrator.Providers.Models.Indexes.Enums; -using Migrator.Tests.Providers.Generic; -using NUnit.Framework; -using Oracle.ManagedDataAccess.Client; -using Index = DotNetProjects.Migrator.Framework.Index; - -namespace Migrator.Tests.Providers.OracleProvider; - -[TestFixture] -[Category("Oracle")] -public class OracleTransformationProvider_AddIndex_Tests : Generic_AddIndexTestsBase -{ - [SetUp] - public async Task SetUpAsync() - { - await BeginOracleTransactionAsync(); - } - - [Test] - public void AddIndex_Unique_Success() - { - // Arrange - const string tableName = "TestTable"; - const string columnName = "TestColumn"; - const string columnName2 = "TestColumn2"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, new Column(columnName, DbType.Int32), new Column(columnName2, DbType.String)); - - // Act - Provider.AddIndex(tableName, - new Index - { - Name = indexName, - KeyColumns = [columnName], - Unique = true, - }); - - // Assert - Provider.Insert(tableName, [columnName, columnName2], [1, "Hello"]); - var ex = Assert.Throws(() => Provider.Insert(tableName, [columnName, columnName2], [1, "Some other string"])); - var index = Provider.GetIndexes(tableName).Single(); - - Assert.That(index.Unique, Is.True); - Assert.That(ex.Number, Is.EqualTo(1)); - } - - /// - /// This test is located in the dedicated database type folder not in the base class since - /// cannot read filter items for Oracle and Oracle does not allow - /// Unique = true for indexes with functional expressions - /// - [Test] - public void AddIndex_FilteredIndexMiscellaneousFilterTypesAndDataTypes_Success() - { - // Arrange - const string tableName = "TestTable"; - const string columnName1 = "TestColumn1"; - const string columnName2 = "TestColumn2"; - const string columnName3 = "TestColumn3"; - const string columnName4 = "TestColumn4"; - const string columnName5 = "TestColumn5"; - const string columnName6 = "TestColumn6"; - const string columnName7 = "TestColumn7"; - const string columnName8 = "TestColumn8"; - const string columnName9 = "TestColumn9"; - const string columnName10 = "TestColumn10"; - const string columnName11 = "TestColumn11"; - const string columnName12 = "TestColumn12"; - const string columnName13 = "TestColumn13"; - - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, - new Column(columnName1, DbType.Int16), - new Column(columnName2, DbType.Int32), - new Column(columnName3, DbType.Int64), - new Column(columnName4, DbType.UInt16), - new Column(columnName5, DbType.UInt32), - new Column(columnName6, DbType.UInt64), - new Column(columnName7, DbType.String), - new Column(columnName8, DbType.Int32), - new Column(columnName9, DbType.Int32), - new Column(columnName10, DbType.Int32), - new Column(columnName11, DbType.Int32), - new Column(columnName12, DbType.Int32), - new Column(columnName13, DbType.Int32) - ); - - List filterItems = [ - new() { Filter = FilterType.EqualTo, ColumnName = columnName1, Value = 1 }, - new() { Filter = FilterType.GreaterThan, ColumnName = columnName2, Value = 2 }, - new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName3, Value = 2323 }, - new() { Filter = FilterType.NotEqualTo, ColumnName = columnName4, Value = 3434 }, - new() { Filter = FilterType.NotEqualTo, ColumnName = columnName5, Value = -3434 }, - new() { Filter = FilterType.SmallerThan, ColumnName = columnName6, Value = 3434345345 }, - new() { Filter = FilterType.NotEqualTo, ColumnName = columnName7, Value = "asdf" }, - new() { Filter = FilterType.EqualTo, ColumnName = columnName8, Value = 11 }, - new() { Filter = FilterType.GreaterThan, ColumnName = columnName9, Value = 22 }, - new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName10, Value = 33 }, - new() { Filter = FilterType.NotEqualTo, ColumnName = columnName11, Value = 44 }, - new() { Filter = FilterType.SmallerThan, ColumnName = columnName12, Value = 55 }, - new() { Filter = FilterType.SmallerThanOrEqualTo, ColumnName = columnName13, Value = 66 } - ]; - - // Act - var addIndexSql = Provider.AddIndex(tableName, - new Index - { - Name = indexName, - KeyColumns = [ - columnName1, - columnName2, - columnName3, - columnName4, - columnName5, - columnName6, - columnName7, - columnName8, - columnName9, - columnName10, - columnName11, - columnName12, - columnName13 - ], - Unique = false, - FilterItems = filterItems - }); - - Provider.Insert(table: tableName, [columnName1], [1]); - - // Assert - var indexesFromDatabase = Provider.GetIndexes(table: tableName); - - // In Oracle it seems that functional expressions are stored as column with generated column name. FilterItems are not - // implemented in Provider.GetIndexes() for Oracle. No further assert possible at this point in time. - Assert.That(indexesFromDatabase.Single().KeyColumns.Count, Is.EqualTo(13)); - - - var expectedSql = "CREATE INDEX TestIndexName ON TestTable (CASE WHEN TestColumn1 = 1 THEN TestColumn1 ELSE NULL END, CASE WHEN TestColumn2 > 2 THEN TestColumn2 ELSE NULL END, CASE WHEN TestColumn3 >= 2323 THEN TestColumn3 ELSE NULL END, CASE WHEN TestColumn4 <> 3434 THEN TestColumn4 ELSE NULL END, CASE WHEN TestColumn5 <> -3434 THEN TestColumn5 ELSE NULL END, CASE WHEN TestColumn6 < 3434345345 THEN TestColumn6 ELSE NULL END, CASE WHEN TestColumn7 <> 'asdf' THEN TestColumn7 ELSE NULL END, CASE WHEN TestColumn8 = 11 THEN TestColumn8 ELSE NULL END, CASE WHEN TestColumn9 > 22 THEN TestColumn9 ELSE NULL END, CASE WHEN TestColumn10 >= 33 THEN TestColumn10 ELSE NULL END, CASE WHEN TestColumn11 <> 44 THEN TestColumn11 ELSE NULL END, CASE WHEN TestColumn12 < 55 THEN TestColumn12 ELSE NULL END, CASE WHEN TestColumn13 <= 66 THEN TestColumn13 ELSE NULL END)"; - - Assert.That(addIndexSql, Is.EqualTo(expectedSql)); - } - - /// - /// Migrator throws if UNIQUE is used with functional expressions. - /// - [Test] - public void AddIndex_FilterItemsCombinedWithUnique_Throws() - { - // Arrange - const string tableName = "TestTable"; - const string columnName1 = "TestColumn1"; - const string indexName = "TestIndexName"; - - Provider.AddTable(tableName, - new Column(columnName1, DbType.Int16) - ); - - List filterItems = [ - new() { Filter = FilterType.EqualTo, ColumnName = columnName1, Value = 1 }, - ]; - - // Act/Assert - Assert.Throws(() => Provider.AddIndex(tableName, - new Index - { - Name = indexName, - KeyColumns = [ - columnName1 - ], - Unique = true, - FilterItems = filterItems - })); - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using DotNetProjects.Migrator.Framework; +using DotNetProjects.Migrator.Providers.Models.Indexes; +using DotNetProjects.Migrator.Providers.Models.Indexes.Enums; +using Migrator.Tests.Providers.Generic; +using NUnit.Framework; +using Oracle.ManagedDataAccess.Client; +using Index = DotNetProjects.Migrator.Framework.Index; + +namespace Migrator.Tests.Providers.OracleProvider; + +[TestFixture] +[Category("Oracle")] +public class OracleTransformationProvider_AddIndex_Tests : Generic_AddIndexTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginOracleTransactionAsync(); + } + + [Test] + public void AddIndex_Unique_Success() + { + // Arrange + const string tableName = "TestTable"; + const string columnName = "TestColumn"; + const string columnName2 = "TestColumn2"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, new Column(columnName, DbType.Int32), new Column(columnName2, DbType.String)); + + // Act + Provider.AddIndex(tableName, + new Index + { + Name = indexName, + KeyColumns = [columnName], + Unique = true, + }); + + // Assert + Provider.Insert(tableName, [columnName, columnName2], [1, "Hello"]); + var ex = Assert.Throws(() => Provider.Insert(tableName, [columnName, columnName2], [1, "Some other string"])); + var index = Provider.GetIndexes(tableName).Single(); + + Assert.That(index.Unique, Is.True); + Assert.That(ex.Number, Is.EqualTo(1)); + } + + /// + /// This test is located in the dedicated database type folder not in the base class since + /// cannot read filter items for Oracle and Oracle does not allow + /// Unique = true for indexes with functional expressions + /// + [Test] + public void AddIndex_FilteredIndexMiscellaneousFilterTypesAndDataTypes_Success() + { + // Arrange + const string tableName = "TestTable"; + const string columnName1 = "TestColumn1"; + const string columnName2 = "TestColumn2"; + const string columnName3 = "TestColumn3"; + const string columnName4 = "TestColumn4"; + const string columnName5 = "TestColumn5"; + const string columnName6 = "TestColumn6"; + const string columnName7 = "TestColumn7"; + const string columnName8 = "TestColumn8"; + const string columnName9 = "TestColumn9"; + const string columnName10 = "TestColumn10"; + const string columnName11 = "TestColumn11"; + const string columnName12 = "TestColumn12"; + const string columnName13 = "TestColumn13"; + + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, + new Column(columnName1, DbType.Int16), + new Column(columnName2, DbType.Int32), + new Column(columnName3, DbType.Int64), + new Column(columnName4, DbType.UInt16), + new Column(columnName5, DbType.UInt32), + new Column(columnName6, DbType.UInt64), + new Column(columnName7, DbType.String), + new Column(columnName8, DbType.Int32), + new Column(columnName9, DbType.Int32), + new Column(columnName10, DbType.Int32), + new Column(columnName11, DbType.Int32), + new Column(columnName12, DbType.Int32), + new Column(columnName13, DbType.Int32) + ); + + List filterItems = [ + new() { Filter = FilterType.EqualTo, ColumnName = columnName1, Value = 1 }, + new() { Filter = FilterType.GreaterThan, ColumnName = columnName2, Value = 2 }, + new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName3, Value = 2323 }, + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName4, Value = 3434 }, + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName5, Value = -3434 }, + new() { Filter = FilterType.SmallerThan, ColumnName = columnName6, Value = 3434345345 }, + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName7, Value = "asdf" }, + new() { Filter = FilterType.EqualTo, ColumnName = columnName8, Value = 11 }, + new() { Filter = FilterType.GreaterThan, ColumnName = columnName9, Value = 22 }, + new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName10, Value = 33 }, + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName11, Value = 44 }, + new() { Filter = FilterType.SmallerThan, ColumnName = columnName12, Value = 55 }, + new() { Filter = FilterType.SmallerThanOrEqualTo, ColumnName = columnName13, Value = 66 } + ]; + + // Act + var addIndexSql = Provider.AddIndex(tableName, + new Index + { + Name = indexName, + KeyColumns = [ + columnName1, + columnName2, + columnName3, + columnName4, + columnName5, + columnName6, + columnName7, + columnName8, + columnName9, + columnName10, + columnName11, + columnName12, + columnName13 + ], + Unique = false, + FilterItems = filterItems + }); + + Provider.Insert(table: tableName, [columnName1], [1]); + + // Assert + var indexesFromDatabase = Provider.GetIndexes(table: tableName); + + // In Oracle it seems that functional expressions are stored as column with generated column name. FilterItems are not + // implemented in Provider.GetIndexes() for Oracle. No further assert possible at this point in time. + Assert.That(indexesFromDatabase.Single().KeyColumns.Count, Is.EqualTo(13)); + + + var expectedSql = "CREATE INDEX TestIndexName ON TestTable (CASE WHEN TestColumn1 = 1 THEN TestColumn1 ELSE NULL END, CASE WHEN TestColumn2 > 2 THEN TestColumn2 ELSE NULL END, CASE WHEN TestColumn3 >= 2323 THEN TestColumn3 ELSE NULL END, CASE WHEN TestColumn4 <> 3434 THEN TestColumn4 ELSE NULL END, CASE WHEN TestColumn5 <> -3434 THEN TestColumn5 ELSE NULL END, CASE WHEN TestColumn6 < 3434345345 THEN TestColumn6 ELSE NULL END, CASE WHEN TestColumn7 <> 'asdf' THEN TestColumn7 ELSE NULL END, CASE WHEN TestColumn8 = 11 THEN TestColumn8 ELSE NULL END, CASE WHEN TestColumn9 > 22 THEN TestColumn9 ELSE NULL END, CASE WHEN TestColumn10 >= 33 THEN TestColumn10 ELSE NULL END, CASE WHEN TestColumn11 <> 44 THEN TestColumn11 ELSE NULL END, CASE WHEN TestColumn12 < 55 THEN TestColumn12 ELSE NULL END, CASE WHEN TestColumn13 <= 66 THEN TestColumn13 ELSE NULL END)"; + + Assert.That(addIndexSql, Is.EqualTo(expectedSql)); + } + + /// + /// Migrator throws if UNIQUE is used with functional expressions. + /// + [Test] + public void AddIndex_FilterItemsCombinedWithUnique_Throws() + { + // Arrange + const string tableName = "TestTable"; + const string columnName1 = "TestColumn1"; + const string indexName = "TestIndexName"; + + Provider.AddTable(tableName, + new Column(columnName1, DbType.Int16) + ); + + List filterItems = [ + new() { Filter = FilterType.EqualTo, ColumnName = columnName1, Value = 1 }, + ]; + + // Act/Assert + Assert.Throws(() => Provider.AddIndex(tableName, + new Index + { + Name = indexName, + KeyColumns = [ + columnName1 + ], + Unique = true, + FilterItems = filterItems + })); + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs index 7993fbba..c3d90e60 100644 --- a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs +++ b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs @@ -1,114 +1,113 @@ -using System; -using System.Data; -using System.Linq; -using System.Threading.Tasks; -using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.Base; -using Migrator.Tests.Providers.Generic; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.OracleProvider; - -[TestFixture] -[Category("Oracle")] -public class OracleTransformationProvider_GetColumns_Tests : TransformationProviderBase -{ - [SetUp] - public async Task SetUpAsync() - { - await BeginOracleTransactionAsync(); - } - - /// - /// Since SQLite does not support binary default values in the generic file a separate test is needed for Oracle - /// Find the generic test in the base class. - /// - [Test] - public void GetColumns_Oracle_DefaultValues_Succeeds() - { - // Arrange - const string testTableName = "MyDefaultTestTable"; - const string binaryColumnName1 = "binarycolumn1"; - - // Should be extended by remaining types - Provider.AddTable(testTableName, - new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }) - ); - - // Act - var columns = Provider.GetColumns(testTableName); - - // Assert - var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); - - Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); - } - - [Test] - public void GetColumns_DefaultValues_Succeeds() - { - // Arrange - var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc); - var guidDefaultValue = Guid.NewGuid(); - var decimalDefaultValue = 14.56565m; - - const string testTableName = "MyDefaultTestTable"; - - const string dateTimeColumnName1 = "datetimecolumn1"; - const string dateTimeColumnName2 = "datetimecolumn2"; - const string decimalColumnName1 = "decimalcolumn"; - const string guidColumnName1 = "guidcolumn1"; - const string booleanColumnName1 = "booleancolumn1"; - const string int32ColumnName1 = "int32column1"; - const string int64ColumnName1 = "int64column1"; - const string int64ColumnName2 = "int64column2"; - const string stringColumnName1 = "stringcolumn1"; - const string binaryColumnName1 = "binarycolumn1"; - const string doubleColumnName1 = "doublecolumn1"; - - // Should be extended by remaining types - Provider.AddTable(testTableName, - new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue), - new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue), - new Column(decimalColumnName1, DbType.Decimal, decimalDefaultValue), - new Column(guidColumnName1, DbType.Guid, guidDefaultValue), - - // other boolean default values are tested in another test - new Column(booleanColumnName1, DbType.Boolean, true), - - new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), - new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), - new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), - new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), - new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), - new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567) { Precision = 19, Scale = 10 } - ); - - // Act - var columns = Provider.GetColumns(testTableName); - - // Assert - var dateTimeColumn1 = columns.Single(x => x.Name.Equals(dateTimeColumnName1, StringComparison.OrdinalIgnoreCase)); - var dateTimeColumn2 = columns.Single(x => x.Name.Equals(dateTimeColumnName2, StringComparison.OrdinalIgnoreCase)); - var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase)); - var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase)); - var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase)); - var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase)); - var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase)); - var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase)); - var stringColumn1 = columns.Single(x => x.Name.Equals(stringColumnName1, StringComparison.OrdinalIgnoreCase)); - var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); - var doubleColumn1 = columns.Single(x => x.Name.Equals(doubleColumnName1, StringComparison.OrdinalIgnoreCase)); - - Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); - Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); - Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue)); - Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue)); - Assert.That(booleanColumn1.DefaultValue, Is.True); - Assert.That(int32Column1.DefaultValue, Is.EqualTo(43)); - Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); - Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); - Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); - Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); - } -} +using System; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using DotNetProjects.Migrator.Framework; +using Migrator.Tests.Providers.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.OracleProvider; + +[TestFixture] +[Category("Oracle")] +public class OracleTransformationProvider_GetColumns_Tests : TransformationProviderBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginOracleTransactionAsync(); + } + + /// + /// Since SQLite does not support binary default values in the generic file a separate test is needed for Oracle + /// Find the generic test in the base class. + /// + [Test] + public void GetColumns_Oracle_DefaultValues_Succeeds() + { + // Arrange + const string testTableName = "MyDefaultTestTable"; + const string binaryColumnName1 = "binarycolumn1"; + + // Should be extended by remaining types + Provider.AddTable(testTableName, + new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }) + ); + + // Act + var columns = Provider.GetColumns(testTableName); + + // Assert + var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); + + Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); + } + + [Test] + public void GetColumns_DefaultValues_Succeeds() + { + // Arrange + var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc); + var guidDefaultValue = Guid.NewGuid(); + var decimalDefaultValue = 14.56565m; + + const string testTableName = "MyDefaultTestTable"; + + const string dateTimeColumnName1 = "datetimecolumn1"; + const string dateTimeColumnName2 = "datetimecolumn2"; + const string decimalColumnName1 = "decimalcolumn"; + const string guidColumnName1 = "guidcolumn1"; + const string booleanColumnName1 = "booleancolumn1"; + const string int32ColumnName1 = "int32column1"; + const string int64ColumnName1 = "int64column1"; + const string int64ColumnName2 = "int64column2"; + const string stringColumnName1 = "stringcolumn1"; + const string binaryColumnName1 = "binarycolumn1"; + const string doubleColumnName1 = "doublecolumn1"; + + // Should be extended by remaining types + Provider.AddTable(testTableName, + new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue), + new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue), + new Column(decimalColumnName1, DbType.Decimal, decimalDefaultValue), + new Column(guidColumnName1, DbType.Guid, guidDefaultValue), + + // other boolean default values are tested in another test + new Column(booleanColumnName1, DbType.Boolean, true), + + new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), + new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), + new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), + new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), + new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), + new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567) { Precision = 19, Scale = 10 } + ); + + // Act + var columns = Provider.GetColumns(testTableName); + + // Assert + var dateTimeColumn1 = columns.Single(x => x.Name.Equals(dateTimeColumnName1, StringComparison.OrdinalIgnoreCase)); + var dateTimeColumn2 = columns.Single(x => x.Name.Equals(dateTimeColumnName2, StringComparison.OrdinalIgnoreCase)); + var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase)); + var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase)); + var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase)); + var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase)); + var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase)); + var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase)); + var stringColumn1 = columns.Single(x => x.Name.Equals(stringColumnName1, StringComparison.OrdinalIgnoreCase)); + var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); + var doubleColumn1 = columns.Single(x => x.Name.Equals(doubleColumnName1, StringComparison.OrdinalIgnoreCase)); + + Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); + Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); + Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue)); + Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue)); + Assert.That(booleanColumn1.DefaultValue, Is.True); + Assert.That(int32Column1.DefaultValue, Is.EqualTo(43)); + Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); + Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); + Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); + Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); + } +} diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_AddTableTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_AddTableTests.cs index 7095591f..3efe09c6 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_AddTableTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_AddTableTests.cs @@ -1,24 +1,23 @@ -using System; -using System.Data; -using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.PostgreSQL.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.PostgreSQL; - -[TestFixture] -[Category("Postgre")] -public class PostgreSQLTransformationProvider_AddTableTests : PostgreSQLTransformationProviderTestBase -{ - [Test] - public void AddTableWithCompoundPrimaryKey() - { - Provider.AddTable("Test", - new Column("PersonId", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("AddressId", DbType.Int32, ColumnProperty.PrimaryKey) - ); - - Assert.That(Provider.TableExists("Test"), Is.True, "Table doesn't exist"); - Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True, "Constraint doesn't exist"); - } -} +using System.Data; +using DotNetProjects.Migrator.Framework; +using Migrator.Tests.Providers.PostgreSQL.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.PostgreSQL; + +[TestFixture] +[Category("Postgre")] +public class PostgreSQLTransformationProvider_AddTableTests : PostgreSQLTransformationProviderTestBase +{ + [Test] + public void AddTableWithCompoundPrimaryKey() + { + Provider.AddTable("Test", + new Column("PersonId", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("AddressId", DbType.Int32, ColumnProperty.PrimaryKey) + ); + + Assert.That(Provider.TableExists("Test"), Is.True, "Table doesn't exist"); + Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True, "Constraint doesn't exist"); + } +} diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_DefaultValueTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_DefaultValueTests.cs index 1fe66431..d4b825ec 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_DefaultValueTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_DefaultValueTests.cs @@ -1,162 +1,161 @@ -using System; -using System.Data; -using System.Linq; -using System.Threading.Tasks; -using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.Base; -using Migrator.Tests.Providers.Generic; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.PostgreSQL; - -[TestFixture] -[Category("Postgre")] -public class PostgreSQLTransformationProvider_GetColumns_DefaultValuesTests : TransformationProviderBase -{ - [SetUp] - public async Task SetUpAsync() - { - await BeginPostgreSQLTransactionAsync(); - } - - /// - /// More tests for GetColumns in - /// - [Test] - public void GetColumns_Postgres_DefaultValues_Succeeds() - { - // Arrange - const string testTableName = "MyDefaultTestTable"; - const string intervalColumnName1 = "intervalcolumn1"; - const string intervalColumnName2 = "intervalcolumn2"; - const string binaryColumnName1 = "binarycolumn1"; - - // Should be extended by remaining types - Provider.AddTable(testTableName, - new Column(intervalColumnName1, MigratorDbType.Interval, defaultValue: new TimeSpan(100000, 3, 4, 5, 666)), - new Column(intervalColumnName2, MigratorDbType.Interval, defaultValue: new TimeSpan(0, 0, 0, 0, 666)), - new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }) - ); - - // Act - var columns = Provider.GetColumns(testTableName); - - // Assert - var intervalColumn1 = columns.Single(x => x.Name == intervalColumnName1); - var intervalColumn2 = columns.Single(x => x.Name == intervalColumnName2); - var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); - - Assert.That(intervalColumn1.DefaultValue, Is.EqualTo(new TimeSpan(100000, 3, 4, 5, 666))); - Assert.That(intervalColumn2.DefaultValue, Is.EqualTo(new TimeSpan(0, 0, 0, 0, 666))); - Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); - } - - [Test] - public void GetColumns_DefaultValues_Succeeds() - { - // Arrange - var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc); - var guidDefaultValue = Guid.NewGuid(); - var decimalDefaultValue = 14.56565m; - - const string testTableName = "MyDefaultTestTable"; - - const string dateTimeColumnName1 = "datetimecolumn1"; - const string dateTimeColumnName2 = "datetimecolumn2"; - const string decimalColumnName1 = "decimalcolumn"; - const string guidColumnName1 = "guidcolumn1"; - const string booleanColumnName1 = "booleancolumn1"; - const string int32ColumnName1 = "int32column1"; - const string int64ColumnName1 = "int64column1"; - const string int64ColumnName2 = "int64column2"; - const string stringColumnName1 = "stringcolumn1"; - const string binaryColumnName1 = "binarycolumn1"; - const string doubleColumnName1 = "doublecolumn1"; - - // Should be extended by remaining types - Provider.AddTable(testTableName, - new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue), - new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue), - new Column(decimalColumnName1, DbType.Decimal, decimalDefaultValue), - new Column(guidColumnName1, DbType.Guid, guidDefaultValue), - - // other boolean default values are tested in another test - new Column(booleanColumnName1, DbType.Boolean, true), - - new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), - new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), - new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), - new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), - new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), - new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567) { Precision = 19, Scale = 10 } - ); - - // Act - var columns = Provider.GetColumns(testTableName); - - // Assert - var dateTimeColumn1 = columns.Single(x => x.Name.Equals(dateTimeColumnName1, StringComparison.OrdinalIgnoreCase)); - var dateTimeColumn2 = columns.Single(x => x.Name.Equals(dateTimeColumnName2, StringComparison.OrdinalIgnoreCase)); - var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase)); - var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase)); - var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase)); - var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase)); - var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase)); - var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase)); - var stringColumn1 = columns.Single(x => x.Name.Equals(stringColumnName1, StringComparison.OrdinalIgnoreCase)); - var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); - var doubleColumn1 = columns.Single(x => x.Name.Equals(doubleColumnName1, StringComparison.OrdinalIgnoreCase)); - - Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); - Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); - Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue)); - Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue)); - Assert.That(booleanColumn1.DefaultValue, Is.True); - Assert.That(int32Column1.DefaultValue, Is.EqualTo(43)); - Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); - Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); - Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); - Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); - } - - // 1 will coerce to true on inserts but not for default values in Postgre SQL - same for 0 to false - // so we do not test it here - [TestCase("true", true)] - [TestCase("TRUE", true)] - [TestCase("t", true)] - [TestCase("T", true)] - [TestCase("yes", true)] - [TestCase("YES", true)] - [TestCase("y", true)] - [TestCase("Y", true)] - [TestCase("on", true)] - [TestCase("ON", true)] - [TestCase("false", false)] - [TestCase("FALSE", false)] - [TestCase("f", false)] - [TestCase("F", false)] - [TestCase("false", false)] - [TestCase("FALSE", false)] - [TestCase("n", false)] - [TestCase("N", false)] - [TestCase("off", false)] - [TestCase("OFF", false)] - public void GetColumns_DefaultValueBooleanValues_Succeeds(object inboundBooleanDefaultValue, bool outboundBooleanDefaultValue) - { - // Arrange - const string testTableName = "MyDefaultTestTable"; - const string booleanColumnName1 = "booleancolumn1"; - - Provider.AddTable(testTableName, - new Column(booleanColumnName1, DbType.Boolean) { DefaultValue = inboundBooleanDefaultValue } - ); - - // Act - var columns = Provider.GetColumns(testTableName); - - // Assert - var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1); - - Assert.That(booleanColumn1.DefaultValue, Is.EqualTo(outboundBooleanDefaultValue)); - } -} +using System; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using DotNetProjects.Migrator.Framework; +using Migrator.Tests.Providers.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.PostgreSQL; + +[TestFixture] +[Category("Postgre")] +public class PostgreSQLTransformationProvider_GetColumns_DefaultValuesTests : TransformationProviderBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginPostgreSQLTransactionAsync(); + } + + /// + /// More tests for GetColumns in + /// + [Test] + public void GetColumns_Postgres_DefaultValues_Succeeds() + { + // Arrange + const string testTableName = "MyDefaultTestTable"; + const string intervalColumnName1 = "intervalcolumn1"; + const string intervalColumnName2 = "intervalcolumn2"; + const string binaryColumnName1 = "binarycolumn1"; + + // Should be extended by remaining types + Provider.AddTable(testTableName, + new Column(intervalColumnName1, MigratorDbType.Interval, defaultValue: new TimeSpan(100000, 3, 4, 5, 666)), + new Column(intervalColumnName2, MigratorDbType.Interval, defaultValue: new TimeSpan(0, 0, 0, 0, 666)), + new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }) + ); + + // Act + var columns = Provider.GetColumns(testTableName); + + // Assert + var intervalColumn1 = columns.Single(x => x.Name == intervalColumnName1); + var intervalColumn2 = columns.Single(x => x.Name == intervalColumnName2); + var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); + + Assert.That(intervalColumn1.DefaultValue, Is.EqualTo(new TimeSpan(100000, 3, 4, 5, 666))); + Assert.That(intervalColumn2.DefaultValue, Is.EqualTo(new TimeSpan(0, 0, 0, 0, 666))); + Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); + } + + [Test] + public void GetColumns_DefaultValues_Succeeds() + { + // Arrange + var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc); + var guidDefaultValue = Guid.NewGuid(); + var decimalDefaultValue = 14.56565m; + + const string testTableName = "MyDefaultTestTable"; + + const string dateTimeColumnName1 = "datetimecolumn1"; + const string dateTimeColumnName2 = "datetimecolumn2"; + const string decimalColumnName1 = "decimalcolumn"; + const string guidColumnName1 = "guidcolumn1"; + const string booleanColumnName1 = "booleancolumn1"; + const string int32ColumnName1 = "int32column1"; + const string int64ColumnName1 = "int64column1"; + const string int64ColumnName2 = "int64column2"; + const string stringColumnName1 = "stringcolumn1"; + const string binaryColumnName1 = "binarycolumn1"; + const string doubleColumnName1 = "doublecolumn1"; + + // Should be extended by remaining types + Provider.AddTable(testTableName, + new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue), + new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue), + new Column(decimalColumnName1, DbType.Decimal, decimalDefaultValue), + new Column(guidColumnName1, DbType.Guid, guidDefaultValue), + + // other boolean default values are tested in another test + new Column(booleanColumnName1, DbType.Boolean, true), + + new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), + new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), + new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), + new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), + new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), + new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567) { Precision = 19, Scale = 10 } + ); + + // Act + var columns = Provider.GetColumns(testTableName); + + // Assert + var dateTimeColumn1 = columns.Single(x => x.Name.Equals(dateTimeColumnName1, StringComparison.OrdinalIgnoreCase)); + var dateTimeColumn2 = columns.Single(x => x.Name.Equals(dateTimeColumnName2, StringComparison.OrdinalIgnoreCase)); + var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase)); + var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase)); + var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase)); + var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase)); + var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase)); + var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase)); + var stringColumn1 = columns.Single(x => x.Name.Equals(stringColumnName1, StringComparison.OrdinalIgnoreCase)); + var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); + var doubleColumn1 = columns.Single(x => x.Name.Equals(doubleColumnName1, StringComparison.OrdinalIgnoreCase)); + + Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); + Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); + Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue)); + Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue)); + Assert.That(booleanColumn1.DefaultValue, Is.True); + Assert.That(int32Column1.DefaultValue, Is.EqualTo(43)); + Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); + Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); + Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); + Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); + } + + // 1 will coerce to true on inserts but not for default values in Postgre SQL - same for 0 to false + // so we do not test it here + [TestCase("true", true)] + [TestCase("TRUE", true)] + [TestCase("t", true)] + [TestCase("T", true)] + [TestCase("yes", true)] + [TestCase("YES", true)] + [TestCase("y", true)] + [TestCase("Y", true)] + [TestCase("on", true)] + [TestCase("ON", true)] + [TestCase("false", false)] + [TestCase("FALSE", false)] + [TestCase("f", false)] + [TestCase("F", false)] + [TestCase("false", false)] + [TestCase("FALSE", false)] + [TestCase("n", false)] + [TestCase("N", false)] + [TestCase("off", false)] + [TestCase("OFF", false)] + public void GetColumns_DefaultValueBooleanValues_Succeeds(object inboundBooleanDefaultValue, bool outboundBooleanDefaultValue) + { + // Arrange + const string testTableName = "MyDefaultTestTable"; + const string booleanColumnName1 = "booleancolumn1"; + + Provider.AddTable(testTableName, + new Column(booleanColumnName1, DbType.Boolean) { DefaultValue = inboundBooleanDefaultValue } + ); + + // Act + var columns = Provider.GetColumns(testTableName); + + // Assert + var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1); + + Assert.That(booleanColumn1.DefaultValue, Is.EqualTo(outboundBooleanDefaultValue)); + } +} diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyExistsTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyExistsTests.cs index 67ece8d7..48462699 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyExistsTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyExistsTests.cs @@ -1,20 +1,17 @@ -using System.Data; -using System.Linq; -using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.PostgreSQL.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.PostgreSQL; - -[TestFixture] -[Category("Postgre")] -public class PostgreSQLTransformationProvider_PrimaryKeyExistsTests : PostgreSQLTransformationProviderTestBase -{ - [Test] - public void CanAddPrimaryKey() - { - AddTable(); - AddPrimaryKey(); - Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True); - } -} +using Migrator.Tests.Providers.PostgreSQL.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.PostgreSQL; + +[TestFixture] +[Category("Postgre")] +public class PostgreSQLTransformationProvider_PrimaryKeyExistsTests : PostgreSQLTransformationProviderTestBase +{ + [Test] + public void CanAddPrimaryKey() + { + AddTable(); + AddPrimaryKey(); + Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True); + } +} diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyWithIdentityTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyWithIdentityTests.cs index 204bad50..4b17cb02 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyWithIdentityTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_PrimaryKeyWithIdentityTests.cs @@ -1,47 +1,46 @@ -using System; -using System.Data; -using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.PostgreSQL.Base; -using Npgsql; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.PostgreSQL; - -[TestFixture] -[Category("Postgre")] -public class PostgreSQLTransformationProvider_PrimaryKeyWithIdentityTests : PostgreSQLTransformationProviderTestBase -{ - [Test] - public void AddTableWithPrimaryKeyIdentity_Succeeds() - { - // Arrange - const string testTableName = "MyDefaultTestTable"; - const string propertyName1 = "Color1"; - const string propertyName2 = "Color2"; - - Provider.AddTable(testTableName, - new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), - new Column(propertyName2, DbType.Int32, ColumnProperty.Unsigned) - ); - - // Act - Provider.Insert(testTableName, [propertyName2], [1]); - Provider.Insert(testTableName, [propertyName2], [1]); - - // Assert - using (var command = Provider.GetCommand()) - { - using var reader = Provider.ExecuteQuery(command, $"SELECT max({propertyName1}) as max from {testTableName}"); - reader.Read(); - - var primaryKeyValue = reader.GetInt32(reader.GetOrdinal("max")); - Assert.That(primaryKeyValue, Is.EqualTo(2)); - } - - // Act II - var exception = Assert.Throws(() => Provider.Insert(testTableName, [propertyName1, propertyName2], [1, 888])); - - // Assert II - Assert.That(exception.SqlState, Is.EqualTo("428C9")); - } -} +using System.Data; +using DotNetProjects.Migrator.Framework; +using Migrator.Tests.Providers.PostgreSQL.Base; +using Npgsql; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.PostgreSQL; + +[TestFixture] +[Category("Postgre")] +public class PostgreSQLTransformationProvider_PrimaryKeyWithIdentityTests : PostgreSQLTransformationProviderTestBase +{ + [Test] + public void AddTableWithPrimaryKeyIdentity_Succeeds() + { + // Arrange + const string testTableName = "MyDefaultTestTable"; + const string propertyName1 = "Color1"; + const string propertyName2 = "Color2"; + + Provider.AddTable(testTableName, + new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), + new Column(propertyName2, DbType.Int32, ColumnProperty.Unsigned) + ); + + // Act + Provider.Insert(testTableName, [propertyName2], [1]); + Provider.Insert(testTableName, [propertyName2], [1]); + + // Assert + using (var command = Provider.GetCommand()) + { + using var reader = Provider.ExecuteQuery(command, $"SELECT max({propertyName1}) as max from {testTableName}"); + reader.Read(); + + var primaryKeyValue = reader.GetInt32(reader.GetOrdinal("max")); + Assert.That(primaryKeyValue, Is.EqualTo(2)); + } + + // Act II + var exception = Assert.Throws(() => Provider.Insert(testTableName, [propertyName1, propertyName2], [1, 888])); + + // Assert II + Assert.That(exception.SqlState, Is.EqualTo("428C9")); + } +} diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs index 612e7ff0..bc423f11 100644 --- a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs @@ -1,10 +1,8 @@ -using System.ComponentModel.DataAnnotations; using System.Data; using System.Threading.Tasks; using DotNetProjects.Migrator.Framework; using Migrator.Tests.Providers.Base; using NUnit.Framework; -using Org.BouncyCastle.Security; namespace Migrator.Tests.Providers.SQLServer; diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs index 8931d630..ed6b6af0 100644 --- a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs @@ -1,16 +1,8 @@ - -using System; -using System.Collections.Generic; using System.Data; -using System.Globalization; -using System.Linq; using System.Threading.Tasks; using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Models.Indexes; -using DotNetProjects.Migrator.Providers.Models.Indexes.Enums; using Migrator.Tests.Providers.Generic; using NUnit.Framework; -using Index = DotNetProjects.Migrator.Framework.Index; namespace Migrator.Tests.Providers.SQLServer; diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumns_DefaultValues_Tests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumns_DefaultValues_Tests.cs index 57765ddf..33c385a8 100644 --- a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumns_DefaultValues_Tests.cs +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_GetColumns_DefaultValues_Tests.cs @@ -1,93 +1,92 @@ -using System; -using System.Data; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using DotNetProjects.Migrator.Framework; -using Migrator.Tests.Providers.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.SQLServer; - -[TestFixture] -[Category("SqlServer")] -public class SQLServerTransformationProvider_GetColumns_DefaultValues_Tests : TransformationProviderBase -{ - [SetUp] - public async Task SetUpAsync() - { - await BeginSQLServerTransactionAsync(); - } - - [Test] - public void GetColumns_DefaultValues_Succeeds() - { - // Arrange - var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc); - var guidDefaultValue = Guid.NewGuid(); - var decimalDefaultValue = 14.56565m; - - const string testTableName = "MyDefaultTestTable"; - - const string dateTimeColumnName1 = "datetimecolumn1"; - const string dateTimeColumnName2 = "datetimecolumn2"; - const string decimalColumnName1 = "decimalcolumn"; - const string guidColumnName1 = "guidcolumn1"; - const string booleanColumnName1 = "booleancolumn1"; - const string int32ColumnName1 = "int32column1"; - const string int64ColumnName1 = "int64column1"; - const string int64ColumnName2 = "int64column2"; - const string stringColumnName1 = "stringcolumn1"; - const string binaryColumnName1 = "binarycolumn1"; - const string doubleColumnName1 = "doublecolumn1"; - const string byteColumnName1 = "byteColumn1"; - - // Should be extended by remaining types - Provider.AddTable(testTableName, - new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue), - new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue), - new Column(decimalColumnName1, DbType.Decimal, decimalDefaultValue), - new Column(guidColumnName1, DbType.Guid, guidDefaultValue), - - // other boolean default values are tested in another test - new Column(booleanColumnName1, DbType.Boolean, true), - - new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), - new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), - new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), - new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), - new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), - new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567) { Precision = 19, Scale = 10 }, - new Column(byteColumnName1, DbType.Byte, defaultValue: 233) - ); - - // Act - var columns = Provider.GetColumns(testTableName); - - // Assert - var dateTimeColumn1 = columns.Single(x => x.Name.Equals(dateTimeColumnName1, StringComparison.OrdinalIgnoreCase)); - var dateTimeColumn2 = columns.Single(x => x.Name.Equals(dateTimeColumnName2, StringComparison.OrdinalIgnoreCase)); - var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase)); - var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase)); - var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase)); - var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase)); - var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase)); - var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase)); - var stringColumn1 = columns.Single(x => x.Name.Equals(stringColumnName1, StringComparison.OrdinalIgnoreCase)); - var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); - var doubleColumn1 = columns.Single(x => x.Name.Equals(doubleColumnName1, StringComparison.OrdinalIgnoreCase)); - var byteColumn1 = columns.Single(x => x.Name.Equals(byteColumnName1, StringComparison.OrdinalIgnoreCase)); - - Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); - Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); - Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue)); - Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue)); - Assert.That(booleanColumn1.DefaultValue, Is.True); - Assert.That(int32Column1.DefaultValue, Is.EqualTo(43)); - Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); - Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); - Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); - Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); - Assert.That(byteColumn1.DefaultValue, Is.EqualTo(233)); - } +using System; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using DotNetProjects.Migrator.Framework; +using Migrator.Tests.Providers.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.SQLServer; + +[TestFixture] +[Category("SqlServer")] +public class SQLServerTransformationProvider_GetColumns_DefaultValues_Tests : TransformationProviderBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginSQLServerTransactionAsync(); + } + + [Test] + public void GetColumns_DefaultValues_Succeeds() + { + // Arrange + var dateTimeDefaultValue = new DateTime(2000, 1, 2, 3, 4, 5, DateTimeKind.Utc); + var guidDefaultValue = Guid.NewGuid(); + var decimalDefaultValue = 14.56565m; + + const string testTableName = "MyDefaultTestTable"; + + const string dateTimeColumnName1 = "datetimecolumn1"; + const string dateTimeColumnName2 = "datetimecolumn2"; + const string decimalColumnName1 = "decimalcolumn"; + const string guidColumnName1 = "guidcolumn1"; + const string booleanColumnName1 = "booleancolumn1"; + const string int32ColumnName1 = "int32column1"; + const string int64ColumnName1 = "int64column1"; + const string int64ColumnName2 = "int64column2"; + const string stringColumnName1 = "stringcolumn1"; + const string binaryColumnName1 = "binarycolumn1"; + const string doubleColumnName1 = "doublecolumn1"; + const string byteColumnName1 = "byteColumn1"; + + // Should be extended by remaining types + Provider.AddTable(testTableName, + new Column(dateTimeColumnName1, DbType.DateTime, dateTimeDefaultValue), + new Column(dateTimeColumnName2, DbType.DateTime2, dateTimeDefaultValue), + new Column(decimalColumnName1, DbType.Decimal, decimalDefaultValue), + new Column(guidColumnName1, DbType.Guid, guidDefaultValue), + + // other boolean default values are tested in another test + new Column(booleanColumnName1, DbType.Boolean, true), + + new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), + new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), + new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), + new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), + new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), + new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596567) { Precision = 19, Scale = 10 }, + new Column(byteColumnName1, DbType.Byte, defaultValue: 233) + ); + + // Act + var columns = Provider.GetColumns(testTableName); + + // Assert + var dateTimeColumn1 = columns.Single(x => x.Name.Equals(dateTimeColumnName1, StringComparison.OrdinalIgnoreCase)); + var dateTimeColumn2 = columns.Single(x => x.Name.Equals(dateTimeColumnName2, StringComparison.OrdinalIgnoreCase)); + var decimalColumn1 = columns.Single(x => x.Name.Equals(decimalColumnName1, StringComparison.OrdinalIgnoreCase)); + var guidColumn1 = columns.Single(x => x.Name.Equals(guidColumnName1, StringComparison.OrdinalIgnoreCase)); + var booleanColumn1 = columns.Single(x => x.Name.Equals(booleanColumnName1, StringComparison.OrdinalIgnoreCase)); + var int32Column1 = columns.Single(x => x.Name.Equals(int32ColumnName1, StringComparison.OrdinalIgnoreCase)); + var int64Column1 = columns.Single(x => x.Name.Equals(int64ColumnName1, StringComparison.OrdinalIgnoreCase)); + var int64Column2 = columns.Single(x => x.Name.Equals(int64ColumnName2, StringComparison.OrdinalIgnoreCase)); + var stringColumn1 = columns.Single(x => x.Name.Equals(stringColumnName1, StringComparison.OrdinalIgnoreCase)); + var binarycolumn1 = columns.Single(x => x.Name.Equals(binaryColumnName1, StringComparison.OrdinalIgnoreCase)); + var doubleColumn1 = columns.Single(x => x.Name.Equals(doubleColumnName1, StringComparison.OrdinalIgnoreCase)); + var byteColumn1 = columns.Single(x => x.Name.Equals(byteColumnName1, StringComparison.OrdinalIgnoreCase)); + + Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); + Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); + Assert.That(decimalColumn1.DefaultValue, Is.EqualTo(decimalDefaultValue)); + Assert.That(guidColumn1.DefaultValue, Is.EqualTo(guidDefaultValue)); + Assert.That(booleanColumn1.DefaultValue, Is.True); + Assert.That(int32Column1.DefaultValue, Is.EqualTo(43)); + Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); + Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); + Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); + Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567)); + Assert.That(byteColumn1.DefaultValue, Is.EqualTo(233)); + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/SQLServer/SqlServerTransformationProviderTests.cs b/src/Migrator.Tests/Providers/SQLServer/SqlServerTransformationProviderTests.cs index 99c76797..b9b03fd9 100644 --- a/src/Migrator.Tests/Providers/SQLServer/SqlServerTransformationProviderTests.cs +++ b/src/Migrator.Tests/Providers/SQLServer/SqlServerTransformationProviderTests.cs @@ -1,56 +1,55 @@ -using System.Data; -using System.Threading.Tasks; -using DotNetProjects.Migrator.Providers; -using DotNetProjects.Migrator.Providers.Impl.SqlServer; -using Migrator.Tests.Providers.SQLServer.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.SQLServer; - -[TestFixture] -[Category("SqlServer")] -public class SqlServerTransformationProviderTests : SQLServerTransformationProviderTestBase -{ - [Test] - public void ByteColumnWillBeCreatedAsBlob() - { - Provider.AddColumn("TestTwo", "BlobColumn", DbType.Byte); - Assert.That(Provider.ColumnExists("TestTwo", "BlobColumn"), Is.True); - } - - [Test] - public void InstanceForProvider() - { - var localProv = Provider["sqlserver"]; - Assert.That(localProv is SqlServerTransformationProvider, Is.True); - - var localProv2 = Provider["foo"]; - Assert.That(localProv2 is NoOpTransformationProvider, Is.True); - } - - [Test] - public void QuoteCreatesProperFormat() - { - var dialect = new SqlServerDialect(); - - Assert.That("[foo]", Is.EqualTo(dialect.Quote("foo"))); - } - - [Test] - public void TableExistsShouldWorkWithBracketsAndSchemaNameAndTableName() - { - Assert.That(Provider.TableExists("[dbo].[TestTwo]"), Is.True); - } - - [Test] - public void TableExistsShouldWorkWithSchemaNameAndTableName() - { - Assert.That(Provider.TableExists("dbo.TestTwo"), Is.True); - } - - [Test] - public void TableExistsShouldWorkWithTableNamesWithBracket() - { - Assert.That(Provider.TableExists("[TestTwo]"), Is.True); - } -} +using System.Data; +using DotNetProjects.Migrator.Providers; +using DotNetProjects.Migrator.Providers.Impl.SqlServer; +using Migrator.Tests.Providers.SQLServer.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.SQLServer; + +[TestFixture] +[Category("SqlServer")] +public class SqlServerTransformationProviderTests : SQLServerTransformationProviderTestBase +{ + [Test] + public void ByteColumnWillBeCreatedAsBlob() + { + Provider.AddColumn("TestTwo", "BlobColumn", DbType.Byte); + Assert.That(Provider.ColumnExists("TestTwo", "BlobColumn"), Is.True); + } + + [Test] + public void InstanceForProvider() + { + var localProv = Provider["sqlserver"]; + Assert.That(localProv is SqlServerTransformationProvider, Is.True); + + var localProv2 = Provider["foo"]; + Assert.That(localProv2 is NoOpTransformationProvider, Is.True); + } + + [Test] + public void QuoteCreatesProperFormat() + { + var dialect = new SqlServerDialect(); + + Assert.That("[foo]", Is.EqualTo(dialect.Quote("foo"))); + } + + [Test] + public void TableExistsShouldWorkWithBracketsAndSchemaNameAndTableName() + { + Assert.That(Provider.TableExists("[dbo].[TestTwo]"), Is.True); + } + + [Test] + public void TableExistsShouldWorkWithSchemaNameAndTableName() + { + Assert.That(Provider.TableExists("dbo.TestTwo"), Is.True); + } + + [Test] + public void TableExistsShouldWorkWithTableNamesWithBracket() + { + Assert.That(Provider.TableExists("[TestTwo]"), Is.True); + } +} diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs index bd17082d..a2ec2e7d 100644 --- a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs @@ -4,7 +4,6 @@ using DotNetProjects.Migrator.Framework; using DotNetProjects.Migrator.Providers.Impl.SQLite; using Migrator.Tests.Providers.Generic; -using Migrator.Tests.Providers.SQLite.Base; using NUnit.Framework; using NUnit.Framework.Legacy; diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RecreateTable.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RecreateTable.cs index b2c47c8b..ffb2efe8 100644 --- a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RecreateTable.cs +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RecreateTable.cs @@ -1,36 +1,34 @@ -using System; -using System.Data; -using System.Linq; -using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Impl.SQLite; -using Migrator.Tests.Providers.SQLite.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.SQLite; - -[TestFixture] -[Category("SQLite")] -public class SQLiteTransformationProvider_RecreateTableTests : SQLiteTransformationProviderTestBase -{ - [Test] - public void RecreateTable_HavingACompoundPrimaryKey_Success() - { - // Arrange - Provider.AddTable("Common_Availability_EvRef", - new Column("EventId", DbType.Int64, ColumnProperty.NotNull | ColumnProperty.PrimaryKey), - new Column("AvailabilityGroupId", DbType.Guid, ColumnProperty.NotNull | ColumnProperty.PrimaryKey)); - - var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo("Common_Availability_EvRef"); - var sql = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Availability_EvRef"); - - // Act/Assert - ((SQLiteTransformationProvider)Provider).RecreateTable(sqliteInfo); - var sql2 = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Availability_EvRef"); - - - Assert.That(sql, Is.EqualTo("CREATE TABLE Common_Availability_EvRef (EventId INTEGER NOT NULL, AvailabilityGroupId UNIQUEIDENTIFIER NOT NULL, PRIMARY KEY (EventId, AvailabilityGroupId))")); - - // The quotes around the table name are added by SQLite on ALTER TABLE in RecreateTable - Assert.That(sql2, Is.EqualTo("CREATE TABLE \"Common_Availability_EvRef\" (EventId INTEGER NOT NULL, AvailabilityGroupId UNIQUEIDENTIFIER NOT NULL, PRIMARY KEY (EventId, AvailabilityGroupId))")); - } +using System.Data; +using DotNetProjects.Migrator.Framework; +using DotNetProjects.Migrator.Providers.Impl.SQLite; +using Migrator.Tests.Providers.SQLite.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.SQLite; + +[TestFixture] +[Category("SQLite")] +public class SQLiteTransformationProvider_RecreateTableTests : SQLiteTransformationProviderTestBase +{ + [Test] + public void RecreateTable_HavingACompoundPrimaryKey_Success() + { + // Arrange + Provider.AddTable("Common_Availability_EvRef", + new Column("EventId", DbType.Int64, ColumnProperty.NotNull | ColumnProperty.PrimaryKey), + new Column("AvailabilityGroupId", DbType.Guid, ColumnProperty.NotNull | ColumnProperty.PrimaryKey)); + + var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo("Common_Availability_EvRef"); + var sql = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Availability_EvRef"); + + // Act/Assert + ((SQLiteTransformationProvider)Provider).RecreateTable(sqliteInfo); + var sql2 = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Availability_EvRef"); + + + Assert.That(sql, Is.EqualTo("CREATE TABLE Common_Availability_EvRef (EventId INTEGER NOT NULL, AvailabilityGroupId UNIQUEIDENTIFIER NOT NULL, PRIMARY KEY (EventId, AvailabilityGroupId))")); + + // The quotes around the table name are added by SQLite on ALTER TABLE in RecreateTable + Assert.That(sql2, Is.EqualTo("CREATE TABLE \"Common_Availability_EvRef\" (EventId INTEGER NOT NULL, AvailabilityGroupId UNIQUEIDENTIFIER NOT NULL, PRIMARY KEY (EventId, AvailabilityGroupId))")); + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RenameColumnTests.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RenameColumnTests.cs index 6796ac30..c801913a 100644 --- a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RenameColumnTests.cs +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_RenameColumnTests.cs @@ -1,81 +1,80 @@ -using System.Data; -using System.Linq; -using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Impl.SQLite; -using Migrator.Tests.Providers.Base; -using Migrator.Tests.Providers.SQLite.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.SQLite; - -[TestFixture] -[Category("SQLite")] -public class SQLiteTransformationProvider_RenameColumnTests : SQLiteTransformationProviderTestBase -{ - [Test] - public void RenameColumn_HavingASingleForeignKeyPointingToTheTargetColumn_SingleColumnForeignKeyIsRemoved() - { - // Arrange - const string tableNameLevel1 = "Level1"; - const string tableNameLevel2 = "Level2"; - const string tableNameLevel3 = "Level3"; - const string propertyId = "Id"; - const string propertyIdRenamed = "IdRenamed"; - const string propertyLevel1Id = "Level1Id"; - const string propertyLevel1IdRenamed = "Level1IdRenamed"; - const string propertyLevel2Id = "Level2Id"; - - Provider.AddTable(tableNameLevel1, new Column(propertyId, DbType.Int32, ColumnProperty.PrimaryKey)); - - Provider.AddTable(tableNameLevel2, - new Column(propertyId, DbType.Int32, ColumnProperty.PrimaryKey), - new Column(propertyLevel1Id, DbType.Int32, ColumnProperty.Unique) - ); - - Provider.AddTable(tableNameLevel3, - new Column(propertyId, DbType.Int32, ColumnProperty.PrimaryKey), - new Column(propertyLevel2Id, DbType.Int32) - ); - - Provider.AddForeignKey("Level2ToLevel1", tableNameLevel2, propertyLevel1Id, tableNameLevel1, propertyId); - Provider.AddForeignKey("Level3ToLevel2", tableNameLevel3, propertyLevel2Id, tableNameLevel2, propertyId); - - var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableNameLevel2); - - var tableInfoLevel2Before = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableNameLevel2); - var tableInfoLevel3Before = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableNameLevel3); - - Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel1} ({propertyId}) VALUES (1)"); - Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel1} ({propertyId}) VALUES (2)"); - Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel2} ({propertyId}, {propertyLevel1Id}) VALUES (1, 1)"); - Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel3} ({propertyId}, {propertyLevel2Id}) VALUES (1, 1)"); - - // Act - Provider.RenameColumn(tableNameLevel2, propertyId, propertyIdRenamed); - Provider.RenameColumn(tableNameLevel2, propertyLevel1Id, propertyLevel1IdRenamed); - - // Assert - Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel2} ({propertyIdRenamed}, {propertyLevel1IdRenamed}) VALUES (2,2)"); - using var command = Provider.GetCommand(); - - using var reader = Provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {tableNameLevel2}"); - reader.Read(); - var count = reader.GetInt32(reader.GetOrdinal("Count")); - Assert.That(count, Is.EqualTo(2)); - - var tableInfoLevel2After = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableNameLevel2); - - Assert.That(tableInfoLevel2Before.Columns.Single(x => x.Name == propertyId).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True); - Assert.That(tableInfoLevel2Before.Columns.Single(x => x.Name == propertyLevel1Id).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True); - Assert.That(tableInfoLevel2Before.ForeignKeys.Single().ChildColumns.Single(), Is.EqualTo(propertyLevel1Id)); - - Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyId), Is.Null); - Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyLevel1Id), Is.Null); - Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyIdRenamed), Is.Not.Null); - Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyLevel1IdRenamed), Is.Not.Null); - Assert.That(tableInfoLevel2After.ForeignKeys.Single().ChildColumns.Single(), Is.EqualTo(propertyLevel1IdRenamed)); - - var valid = ((SQLiteTransformationProvider)Provider).CheckForeignKeyIntegrity(); - Assert.That(valid, Is.True); - } +using System.Data; +using System.Linq; +using DotNetProjects.Migrator.Framework; +using DotNetProjects.Migrator.Providers.Impl.SQLite; +using Migrator.Tests.Providers.SQLite.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.SQLite; + +[TestFixture] +[Category("SQLite")] +public class SQLiteTransformationProvider_RenameColumnTests : SQLiteTransformationProviderTestBase +{ + [Test] + public void RenameColumn_HavingASingleForeignKeyPointingToTheTargetColumn_SingleColumnForeignKeyIsRemoved() + { + // Arrange + const string tableNameLevel1 = "Level1"; + const string tableNameLevel2 = "Level2"; + const string tableNameLevel3 = "Level3"; + const string propertyId = "Id"; + const string propertyIdRenamed = "IdRenamed"; + const string propertyLevel1Id = "Level1Id"; + const string propertyLevel1IdRenamed = "Level1IdRenamed"; + const string propertyLevel2Id = "Level2Id"; + + Provider.AddTable(tableNameLevel1, new Column(propertyId, DbType.Int32, ColumnProperty.PrimaryKey)); + + Provider.AddTable(tableNameLevel2, + new Column(propertyId, DbType.Int32, ColumnProperty.PrimaryKey), + new Column(propertyLevel1Id, DbType.Int32, ColumnProperty.Unique) + ); + + Provider.AddTable(tableNameLevel3, + new Column(propertyId, DbType.Int32, ColumnProperty.PrimaryKey), + new Column(propertyLevel2Id, DbType.Int32) + ); + + Provider.AddForeignKey("Level2ToLevel1", tableNameLevel2, propertyLevel1Id, tableNameLevel1, propertyId); + Provider.AddForeignKey("Level3ToLevel2", tableNameLevel3, propertyLevel2Id, tableNameLevel2, propertyId); + + var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableNameLevel2); + + var tableInfoLevel2Before = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableNameLevel2); + var tableInfoLevel3Before = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableNameLevel3); + + Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel1} ({propertyId}) VALUES (1)"); + Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel1} ({propertyId}) VALUES (2)"); + Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel2} ({propertyId}, {propertyLevel1Id}) VALUES (1, 1)"); + Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel3} ({propertyId}, {propertyLevel2Id}) VALUES (1, 1)"); + + // Act + Provider.RenameColumn(tableNameLevel2, propertyId, propertyIdRenamed); + Provider.RenameColumn(tableNameLevel2, propertyLevel1Id, propertyLevel1IdRenamed); + + // Assert + Provider.ExecuteNonQuery($"INSERT INTO {tableNameLevel2} ({propertyIdRenamed}, {propertyLevel1IdRenamed}) VALUES (2,2)"); + using var command = Provider.GetCommand(); + + using var reader = Provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {tableNameLevel2}"); + reader.Read(); + var count = reader.GetInt32(reader.GetOrdinal("Count")); + Assert.That(count, Is.EqualTo(2)); + + var tableInfoLevel2After = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableNameLevel2); + + Assert.That(tableInfoLevel2Before.Columns.Single(x => x.Name == propertyId).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True); + Assert.That(tableInfoLevel2Before.Columns.Single(x => x.Name == propertyLevel1Id).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True); + Assert.That(tableInfoLevel2Before.ForeignKeys.Single().ChildColumns.Single(), Is.EqualTo(propertyLevel1Id)); + + Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyId), Is.Null); + Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyLevel1Id), Is.Null); + Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyIdRenamed), Is.Not.Null); + Assert.That(tableInfoLevel2After.Columns.FirstOrDefault(x => x.Name == propertyLevel1IdRenamed), Is.Not.Null); + Assert.That(tableInfoLevel2After.ForeignKeys.Single().ChildColumns.Single(), Is.EqualTo(propertyLevel1IdRenamed)); + + var valid = ((SQLiteTransformationProvider)Provider).CheckForeignKeyIntegrity(); + Assert.That(valid, Is.True); + } } \ No newline at end of file diff --git a/src/Migrator/Framework/ViewField.cs b/src/Migrator/Framework/ViewField.cs index 642a4b88..3d3a8289 100644 --- a/src/Migrator/Framework/ViewField.cs +++ b/src/Migrator/Framework/ViewField.cs @@ -11,8 +11,6 @@ #endregion -using System.Data; - namespace DotNetProjects.Migrator.Framework; /// diff --git a/src/Migrator/MigrationComparer.cs b/src/Migrator/MigrationComparer.cs index 1ddca9c6..65a51d6b 100644 --- a/src/Migrator/MigrationComparer.cs +++ b/src/Migrator/MigrationComparer.cs @@ -13,7 +13,6 @@ using System; using System.Collections.Generic; -using System.Reflection; using DotNetProjects.Migrator.Framework; namespace DotNetProjects.Migrator; @@ -44,4 +43,4 @@ public int Compare(Type x, Type y) return attribOfY.Version.CompareTo(attribOfX.Version); } } -} +} diff --git a/src/Migrator/Providers/ColumnPropertiesMapper.cs b/src/Migrator/Providers/ColumnPropertiesMapper.cs index c996127d..910c15eb 100644 --- a/src/Migrator/Providers/ColumnPropertiesMapper.cs +++ b/src/Migrator/Providers/ColumnPropertiesMapper.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using DotNetProjects.Migrator.Framework; diff --git a/src/Migrator/Providers/Impl/DB2/DB2TransformationProvider.cs b/src/Migrator/Providers/Impl/DB2/DB2TransformationProvider.cs index 56c72f12..81be053f 100644 --- a/src/Migrator/Providers/Impl/DB2/DB2TransformationProvider.cs +++ b/src/Migrator/Providers/Impl/DB2/DB2TransformationProvider.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Data; -using DotNetProjects.Migrator.Providers; namespace DotNetProjects.Migrator.Providers.Impl.DB2; diff --git a/src/Migrator/Providers/Impl/Firebird/FirebirdColumnPropertiesMapper.cs b/src/Migrator/Providers/Impl/Firebird/FirebirdColumnPropertiesMapper.cs index 9d082da0..cb007b7d 100644 --- a/src/Migrator/Providers/Impl/Firebird/FirebirdColumnPropertiesMapper.cs +++ b/src/Migrator/Providers/Impl/Firebird/FirebirdColumnPropertiesMapper.cs @@ -1,7 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers; namespace DotNetProjects.Migrator.Providers.Impl.Firebird; diff --git a/src/Migrator/Providers/Impl/Firebird/FirebirdDialect.cs b/src/Migrator/Providers/Impl/Firebird/FirebirdDialect.cs index 47b8f648..e00c9ff5 100644 --- a/src/Migrator/Providers/Impl/Firebird/FirebirdDialect.cs +++ b/src/Migrator/Providers/Impl/Firebird/FirebirdDialect.cs @@ -1,4 +1,3 @@ -using System; using System.Data; using DotNetProjects.Migrator.Framework; diff --git a/src/Migrator/Providers/Impl/Firebird/FirebirdTransformationProvider.cs b/src/Migrator/Providers/Impl/Firebird/FirebirdTransformationProvider.cs index a56277eb..878667fb 100644 --- a/src/Migrator/Providers/Impl/Firebird/FirebirdTransformationProvider.cs +++ b/src/Migrator/Providers/Impl/Firebird/FirebirdTransformationProvider.cs @@ -3,7 +3,6 @@ using System.Data; using System.Linq; using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers; namespace DotNetProjects.Migrator.Providers.Impl.Firebird; diff --git a/src/Migrator/Providers/Impl/Oracle/OracleTransformationProvider.cs b/src/Migrator/Providers/Impl/Oracle/OracleTransformationProvider.cs index a7151122..f14d1900 100644 --- a/src/Migrator/Providers/Impl/Oracle/OracleTransformationProvider.cs +++ b/src/Migrator/Providers/Impl/Oracle/OracleTransformationProvider.cs @@ -8,7 +8,6 @@ using System.Data; using System.Globalization; using System.Linq; -using System.Linq.Expressions; using System.Text; using System.Text.RegularExpressions; using ForeignKeyConstraint = DotNetProjects.Migrator.Framework.ForeignKeyConstraint; From c595fdaf417ec37bb1d55ac6c08cd1159ab1db31 Mon Sep 17 00:00:00 2001 From: JaBistDuNarrisch Date: Sun, 5 Oct 2025 23:53:16 +0200 Subject: [PATCH 2/2] Reorder columns on AddPrimaryKey --- .../ColumnPropertyExtensionTests.cs | 178 +++++++++--------- .../Generic/Generic_AddPrimaryKey.cs | 9 + ...Generic_UpdateFromTableToTableTestsBase.cs | 6 +- ...ansformationProvider_AddPrimaryKeyTests.cs | 16 ++ ...ansformationProvider_AddPrimaryKeyTests.cs | 16 ++ ...ansformationProvider_AddPrimaryKeyTests.cs | 16 ++ ...ansformationProvider_AddPrimaryKeyTests.cs | 40 ++++ src/Migrator/Framework/ColumnProperty.cs | 3 +- .../SQLite/SQLiteTransformationProvider.cs | 20 +- 9 files changed, 209 insertions(+), 95 deletions(-) create mode 100644 src/Migrator.Tests/Providers/Generic/Generic_AddPrimaryKey.cs create mode 100644 src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddPrimaryKeyTests.cs create mode 100644 src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_AddPrimaryKeyTests.cs create mode 100644 src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddPrimaryKeyTests.cs create mode 100644 src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddPrimaryKeyTests.cs diff --git a/src/Migrator.Tests/Framework/ColumnProperties/ColumnPropertyExtensionTests.cs b/src/Migrator.Tests/Framework/ColumnProperties/ColumnPropertyExtensionTests.cs index 62853440..d2f822d6 100644 --- a/src/Migrator.Tests/Framework/ColumnProperties/ColumnPropertyExtensionTests.cs +++ b/src/Migrator.Tests/Framework/ColumnProperties/ColumnPropertyExtensionTests.cs @@ -1,90 +1,90 @@ -using NUnit.Framework; -using DotNetProjects.Migrator.Framework; -using System; -using System.Linq; - -namespace Migrator.Tests.Framework.ColumnProperties; - -public class ColumnPropertyExtensionsTests -{ - [Test] - public void Clear() - { - // Arrange - var columnProperty = ColumnProperty.PrimaryKey | ColumnProperty.NotNull; - - // Act - columnProperty = columnProperty.Clear(ColumnProperty.PrimaryKey); - - // Assert - Assert.That(columnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False); - } - - [Test] - public void IsSet() - { - // Arrange - var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull; - - // Act - var actualData = GetAllSingleColumnProperties().Select(x => new - { - ColumnPropertyString = x.ToString(), - IsSet = columnProperty.IsSet(x), - IsNotSet = columnProperty.IsNotSet(x) - }) - .ToList(); - - // Assert - string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)]; - var actualDataShouldBeTrue = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); - var actualDataShouldBeFalse = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); - - Assert.That(actualDataShouldBeTrue.Select(x => x.IsSet), Has.All.True); - Assert.That(actualDataShouldBeFalse.Select(x => x.IsSet), Has.All.False); - } - - [Test] - public void IsNotSet() - { - // Arrange - var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull; - - // Act - var actualData = GetAllSingleColumnProperties().Select(x => new - { - ColumnPropertyString = x.ToString(), - IsSet = columnProperty.IsNotSet(x), - IsNotSet = columnProperty.IsNotSet(x) - }) - .ToList(); - - // Assert - string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)]; - var actualDataShouldBeFalse = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); - var actualDataShouldBeTrue = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); - - Assert.That(actualDataShouldBeTrue.Select(x => x.IsNotSet), Has.All.True); - Assert.That(actualDataShouldBeFalse.Select(x => x.IsNotSet), Has.All.False); - } - - [Test] - public void Set_Success() - { - // Arrange - var columnProperty = ColumnProperty.NotNull; - - // Act - var result = columnProperty.Set(ColumnProperty.PrimaryKeyWithIdentity); - - // Assert - var expected = ColumnProperty.NotNull | ColumnProperty.PrimaryKeyWithIdentity; - - Assert.That(result, Is.EqualTo(expected)); - } - - private ColumnProperty[] GetAllSingleColumnProperties() - { - return [.. Enum.GetValues().Where(x => x == 0 || (x & (x - 1)) == 0)]; - } +using NUnit.Framework; +using DotNetProjects.Migrator.Framework; +using System; +using System.Linq; + +namespace Migrator.Tests.Framework.ColumnProperties; + +public class ColumnPropertyExtensionsTests +{ + [Test] + public void Clear() + { + // Arrange + var columnProperty = ColumnProperty.PrimaryKey | ColumnProperty.NotNull; + + // Act + columnProperty = columnProperty.Clear(ColumnProperty.PrimaryKey); + + // Assert + Assert.That(columnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.False); + } + + [Test] + public void IsSet() + { + // Arrange + var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull; + + // Act + var actualData = GetAllSingleColumnProperties().Select(x => new + { + ColumnPropertyString = x.ToString(), + IsSet = columnProperty.IsSet(x), + IsNotSet = columnProperty.IsNotSet(x) + }) + .ToList(); + + // Assert + string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)]; + var actualDataShouldBeTrue = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); + var actualDataShouldBeFalse = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); + + Assert.That(actualDataShouldBeTrue.Select(x => x.IsSet), Has.All.True); + Assert.That(actualDataShouldBeFalse.Select(x => x.IsSet), Has.All.False); + } + + [Test] + public void IsNotSet() + { + // Arrange + var columnProperty = ColumnProperty.PrimaryKeyWithIdentity | ColumnProperty.NotNull; + + // Act + var actualData = GetAllSingleColumnProperties().Select(x => new + { + ColumnPropertyString = x.ToString(), + IsSet = columnProperty.IsNotSet(x), + IsNotSet = columnProperty.IsNotSet(x) + }) + .ToList(); + + // Assert + string[] expectedSet = [nameof(ColumnProperty.PrimaryKey), nameof(ColumnProperty.NotNull), nameof(ColumnProperty.Identity)]; + var actualDataShouldBeFalse = actualData.Where(x => expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); + var actualDataShouldBeTrue = actualData.Where(x => !expectedSet.Any(y => y == x.ColumnPropertyString)).ToList(); + + Assert.That(actualDataShouldBeTrue.Select(x => x.IsNotSet), Has.All.True); + Assert.That(actualDataShouldBeFalse.Select(x => x.IsNotSet), Has.All.False); + } + + [Test] + public void Set_Success() + { + // Arrange + var columnProperty = ColumnProperty.NotNull; + + // Act + var result = columnProperty.Set(ColumnProperty.PrimaryKeyWithIdentity); + + // Assert + var expected = ColumnProperty.NotNull | ColumnProperty.PrimaryKeyWithIdentity; + + Assert.That(result, Is.EqualTo(expected)); + } + + private ColumnProperty[] GetAllSingleColumnProperties() + { + return [.. Enum.GetValues().Where(x => x == 0 || (x & (x - 1)) == 0)]; + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/Generic/Generic_AddPrimaryKey.cs b/src/Migrator.Tests/Providers/Generic/Generic_AddPrimaryKey.cs new file mode 100644 index 00000000..420608b3 --- /dev/null +++ b/src/Migrator.Tests/Providers/Generic/Generic_AddPrimaryKey.cs @@ -0,0 +1,9 @@ +using Migrator.Tests.Providers.Base; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.Generic; + +[TestFixture] +[Category("SQLite")] +public class Generic_AddPrimaryTestsBase : TransformationProviderBase +{ } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs b/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs index 461c11a3..dce4047e 100644 --- a/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs +++ b/src/Migrator.Tests/Providers/Generic/Generic_UpdateFromTableToTableTestsBase.cs @@ -56,13 +56,15 @@ public void UpdateFromTableToTable_Success() // Act Provider.UpdateTargetFromSource( - tableNameSource, - tableNameTarget, + tableNameSource: tableNameSource, + tableNameTarget: tableNameTarget, + copyColumnPairs: [ new () { ColumnNameSource = columnName3Source, ColumnNameTarget = columnName3Target }, new () { ColumnNameSource = columnName4Source, ColumnNameTarget = columnName4Target }, new () { ColumnNameSource = columnName5Source, ColumnNameTarget = columnName5Target } ], + matchColumnPairs: [ new () { ColumnNameSource = columnName1Source, ColumnNameTarget = columnName1Target }, new () { ColumnNameSource = columnName2Source, ColumnNameTarget = columnName2Target } diff --git a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddPrimaryKeyTests.cs b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddPrimaryKeyTests.cs new file mode 100644 index 00000000..bfb884e9 --- /dev/null +++ b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_AddPrimaryKeyTests.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Migrator.Tests.Providers.Generic; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.OracleProvider; + +[TestFixture] +[Category("Oracle")] +public class OracleTransformationProvider_AddPrimaryKeyTests : Generic_AddPrimaryTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginOracleTransactionAsync(); + } +} \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_AddPrimaryKeyTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_AddPrimaryKeyTests.cs new file mode 100644 index 00000000..9649a621 --- /dev/null +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_AddPrimaryKeyTests.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Migrator.Tests.Providers.Generic; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.PostgreSQL; + +[TestFixture] +[Category("Postgre")] +public class PostgreSQLTransformationProvider_AddPrimaryKeyTests : Generic_AddPrimaryTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginPostgreSQLTransactionAsync(); + } +} diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddPrimaryKeyTests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddPrimaryKeyTests.cs new file mode 100644 index 00000000..32f4b308 --- /dev/null +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddPrimaryKeyTests.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Migrator.Tests.Providers.Generic; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.SQLServer; + +[TestFixture] +[Category("SqlServer")] +public class SQLServerTransformationProvider_AddPrimaryKeyTests : Generic_AddPrimaryTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginSQLServerTransactionAsync(); + } +} diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddPrimaryKeyTests.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddPrimaryKeyTests.cs new file mode 100644 index 00000000..ccde9404 --- /dev/null +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddPrimaryKeyTests.cs @@ -0,0 +1,40 @@ +using System.Data; +using System.Threading.Tasks; +using DotNetProjects.Migrator.Framework; +using DotNetProjects.Migrator.Providers.Impl.SQLite; +using Migrator.Tests.Providers.Generic; +using NUnit.Framework; + +namespace Migrator.Tests.Providers.SQLite; + +[TestFixture] +[Category("SQLite")] +public class SQLiteTransformationProvider_AddPrimaryTests : Generic_AddPrimaryTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginSQLiteTransactionAsync(); + } + + [Test] + public void AddPrimaryKey_ColumnsInOtherOrderThanInColumnsList_Success() + { + // Arrange + const string columnName1 = "TestColumn"; + const string columnName2 = "TestColumn2"; + const string columnName3 = "TestColumn3"; + const string tableName = "TestTable"; + const string primaryKeyName = $"PK_{tableName}"; + + Provider.AddTable(tableName, new Column(columnName1, DbType.String), new Column(columnName2, DbType.Int32), new Column(columnName3, DbType.Int32)); + + // Act + Provider.AddPrimaryKey(name: primaryKeyName, table: tableName, columns: [columnName3, columnName2]); + + // Assert + var createTableScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); + + Assert.That(createTableScript, Does.Contain("PRIMARY KEY (TestColumn3, TestColumn2))")); + } +} diff --git a/src/Migrator/Framework/ColumnProperty.cs b/src/Migrator/Framework/ColumnProperty.cs index c89297e0..74cbec63 100644 --- a/src/Migrator/Framework/ColumnProperty.cs +++ b/src/Migrator/Framework/ColumnProperty.cs @@ -54,8 +54,9 @@ public enum ColumnProperty // ForeignKey = 1 << 7, /// - /// Primary Key. + /// Primary Key. For compound PKs use AddPrimaryKey instead. /// + [Obsolete("Use AddPrimaryKey instead.")] PrimaryKey = 1 << 8, /// diff --git a/src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs b/src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs index a948965f..f878b361 100644 --- a/src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs +++ b/src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs @@ -57,7 +57,7 @@ public override void AddForeignKey( { if (string.IsNullOrWhiteSpace(name)) { - throw new Exception("A FK name is mandatory"); + throw new Exception("The foreign key name is mandatory"); } var sqliteTableInfo = GetSQLiteTableInfo(childTable); @@ -692,12 +692,26 @@ public override void AddPrimaryKey(string name, string tableName, params string[ foreach (var column in sqliteTableInfo.Columns) { - if (columnNames.Contains(column.Name)) + if (columnNames.Any(x => x.Equals(column.Name, StringComparison.OrdinalIgnoreCase))) { - column.ColumnProperty |= ColumnProperty.PrimaryKey; + column.ColumnProperty = column.ColumnProperty.Set(ColumnProperty.PrimaryKey); + } + else + { + column.ColumnProperty = column.ColumnProperty.Clear(ColumnProperty.PrimaryKey); } } + var columnNamesList = columnNames.ToList(); + + var columnsReordered = sqliteTableInfo.Columns.OrderBy(x => + { + var index = columnNamesList.IndexOf(x.Name); + return index >= 0 ? index : int.MaxValue; + }).ToList(); + + sqliteTableInfo.Columns = columnsReordered; + RecreateTable(sqliteTableInfo); }