diff --git a/src/Migrator.Tests/Providers/Generic/Generic_ChangeColumnTestsBase.cs b/src/Migrator.Tests/Providers/Generic/Generic_ChangeColumnTestsBase.cs new file mode 100644 index 00000000..cc382515 --- /dev/null +++ b/src/Migrator.Tests/Providers/Generic/Generic_ChangeColumnTestsBase.cs @@ -0,0 +1,7 @@ +using Migrator.Tests.Providers.Base; + +namespace Migrator.Tests.Providers.Generic; + +public abstract class Generic_ChangeColumnTestsBase : TransformationProviderBase +{ +} \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_ChangeColumnTests.cs new file mode 100644 index 00000000..9b753c9b --- /dev/null +++ b/src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_ChangeColumnTests.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_ChangeColumn_Tests : Generic_ChangeColumnTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginOracleTransactionAsync(); + } +} \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_ChangeColumnTests.cs new file mode 100644 index 00000000..746ba161 --- /dev/null +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgresSQLTransformationProvider_ChangeColumnTests.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_ChangeColumnTests : Generic_ChangeColumnTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginPostgreSQLTransactionAsync(); + } +} diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs index 3ed92ecc..612e7ff0 100644 --- a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_AddTableTests.cs @@ -1,30 +1,56 @@ -using System.Data; -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_AddTableTests : TransformationProviderBase -{ - [SetUp] - public async Task SetUpAsync() - { - await BeginSQLServerTransactionAsync(); - } - - [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.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; + +[TestFixture] +[Category("SqlServer")] +public class SQLServerTransformationProvider_AddTableTests : TransformationProviderBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginSQLServerTransactionAsync(); + } + + [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"); + } + + [Test] + public void AddTableDateTime() + { + var tableName = "Table1"; + var columnName = "Column1"; + + Provider.AddTable(tableName, new Column(columnName, DbType.DateTime, ColumnProperty.NotNull)); + var column = Provider.GetColumnByName(tableName, columnName); + + Assert.That(column.Type, Is.EqualTo(DbType.DateTime)); + } + + [Test] + public void AddTableDateTime2() + { + var tableName = "Table1"; + var columnName = "Column1"; + + Provider.AddTable(tableName, new Column(columnName, DbType.DateTime2, ColumnProperty.NotNull)); + var column = Provider.GetColumnByName(tableName, columnName); + + Assert.That(column.Type, Is.EqualTo(DbType.DateTime2)); + } +} diff --git a/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs new file mode 100644 index 00000000..8931d630 --- /dev/null +++ b/src/Migrator.Tests/Providers/SQLServer/SQLServerTransformationProvider_ChangeColumnTests.cs @@ -0,0 +1,46 @@ + +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; + +[TestFixture] +[Category("SqlServer")] +public class SQLServerTransformationProvider_ChangeColumnTests : Generic_AddIndexTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginSQLServerTransactionAsync(); + } + + [Test] + public void ChangeColumn_DateTimeToDateTime2_Success() + { + // Arrange + const string tableName = "TestTable"; + const string columnName = "TestColumn"; + + Provider.AddTable(tableName, new Column(columnName, DbType.DateTime, ColumnProperty.NotNull)); + var columnBefore = Provider.GetColumnByName(tableName, columnName); + + // Act + Provider.ChangeColumn(tableName, new Column(columnName, DbType.DateTime2, ColumnProperty.NotNull)); + + // Assert + var columnAfter = Provider.GetColumnByName(tableName, columnName); + + Assert.That(columnBefore.Type == DbType.DateTime); + Assert.That(columnAfter.Type == DbType.DateTime2); + } +} \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddTableTests.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddTableTests.cs index 7d00f492..deaaef68 100644 --- a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddTableTests.cs +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddTableTests.cs @@ -1,123 +1,121 @@ -using System; -using System.Data.SQLite; -using System.Linq; -using DotNetProjects.Migrator.Framework; -using DotNetProjects.Migrator.Providers.Impl.SQLite; -using Microsoft.Data.Sqlite; -using Migrator.Tests.Providers.SQLite.Base; -using NUnit.Framework; - -namespace Migrator.Tests.Providers.SQLite; - -[TestFixture] -[Category("SQLite")] -public class SQLiteTransformationProvider_AddTableTests : SQLiteTransformationProviderTestBase -{ - [Test] - public void AddTable_UniqueOnlyOnColumnLevel_Obsolete_UniquesListIsEmpty() - { - const string tableName = "MyTableName"; - const string columnName = "MyColumnName"; - - // Arrange/Act - Provider.AddTable(tableName, new Column(columnName, System.Data.DbType.Int32, ColumnProperty.Unique)); - - // Assert - var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); - Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (MyColumnName INTEGER NULL UNIQUE)")); - - var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); - - // It is no named unique so it is not listed in the Uniques list. Unique on column level is marked as obsolete. - Assert.That(sqliteInfo.Uniques, Is.Empty); - } - - [Test] - public void AddTable_CompositePrimaryKey_ContainsNull() - { - const string tableName = "MyTableName"; - const string columnName1 = "Column1"; - const string columnName2 = "Column2"; - - // Arrange/Act - Provider.AddTable(tableName, - new Column(columnName1, System.Data.DbType.Int32, ColumnProperty.PrimaryKey), - new Column(columnName2, System.Data.DbType.Int32, ColumnProperty.PrimaryKey | ColumnProperty.NotNull) - ); - - Provider.Insert(tableName, [columnName1, columnName2], [1, 1]); - var ex = Assert.Throws(() => Provider.Insert(tableName, [columnName1, columnName2], [1, 1])); - - // Assert - var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); - Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NULL, Column2 INTEGER NOT NULL, PRIMARY KEY (Column1, Column2))")); - - var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName); - Assert.That(pragmaTableInfos.Single(x => x.Name == columnName1).NotNull, Is.False); - Assert.That(pragmaTableInfos.Single(x => x.Name == columnName2).NotNull, Is.True); - - var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); - Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1)); - Assert.That(sqliteInfo.Columns[1].Name, Is.EqualTo(columnName2)); - - // 19 = UNIQUE constraint failed - Assert.That(ex.ErrorCode, Is.EqualTo(19)); - } - - [Test] - public void AddTable_SinglePrimaryKey_ContainsNull() - { - const string tableName = "MyTableName"; - const string columnName1 = "Column1"; - const string columnName2 = "Column2"; - - // Arrange/Act - Provider.AddTable(tableName, - new Column(columnName1, System.Data.DbType.Int32, ColumnProperty.PrimaryKey), - new Column(columnName2, System.Data.DbType.Int32, ColumnProperty.NotNull) - ); - - Provider.Insert(tableName, [columnName1, columnName2], [1, 1]); - Assert.Throws(() => Provider.Insert(tableName, [columnName1, columnName2], [1, 2])); - - // Assert - var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); - Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NOT NULL PRIMARY KEY, Column2 INTEGER NOT NULL)")); - - var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName); - Assert.That(pragmaTableInfos.All(x => x.NotNull), Is.True); - - var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); - Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1)); - Assert.That(sqliteInfo.Columns[1].Name, Is.EqualTo(columnName2)); - } - - [Test] - public void AddTable_MiscellaneousColumns_Succeeds() - { - const string tableName = "MyTableName"; - const string columnName1 = "Column1"; - const string columnName2 = "Column2"; - - // Arrange/Act - Provider.AddTable(tableName, - new Column(columnName1, System.Data.DbType.Int32, ColumnProperty.NotNull | ColumnProperty.Identity | ColumnProperty.PrimaryKey), - new Column(columnName2, System.Data.DbType.Int32, ColumnProperty.Null | ColumnProperty.Unique) - ); - - Provider.Insert(tableName, [columnName1, columnName2], [1, 1]); - Assert.Throws(() => Provider.Insert(tableName, [columnName1, columnName2], [1, 1])); - - // Assert - var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); - Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, Column2 INTEGER NULL UNIQUE)")); - - var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName); - Assert.That(pragmaTableInfos.First().NotNull, Is.True); - Assert.That(pragmaTableInfos[1].NotNull, Is.False); - - var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); - Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1)); - Assert.That(sqliteInfo.Columns[1].Name, Is.EqualTo(columnName2)); - } +using System.Data.SQLite; +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_AddTableTests : SQLiteTransformationProviderTestBase +{ + [Test] + public void AddTable_UniqueOnlyOnColumnLevel_Obsolete_UniquesListIsEmpty() + { + const string tableName = "MyTableName"; + const string columnName = "MyColumnName"; + + // Arrange/Act + Provider.AddTable(tableName, new Column(columnName, System.Data.DbType.Int32, ColumnProperty.Unique)); + + // Assert + var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); + Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (MyColumnName INTEGER NULL UNIQUE)")); + + var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); + + // It is no named unique so it is not listed in the Uniques list. Unique on column level is marked as obsolete. + Assert.That(sqliteInfo.Uniques, Is.Empty); + } + + [Test] + public void AddTable_CompositePrimaryKey_ContainsNull() + { + const string tableName = "MyTableName"; + const string columnName1 = "Column1"; + const string columnName2 = "Column2"; + + // Arrange/Act + Provider.AddTable(tableName, + new Column(columnName1, System.Data.DbType.Int32, ColumnProperty.PrimaryKey), + new Column(columnName2, System.Data.DbType.Int32, ColumnProperty.PrimaryKey | ColumnProperty.NotNull) + ); + + Provider.Insert(tableName, [columnName1, columnName2], [1, 1]); + var ex = Assert.Throws(() => Provider.Insert(tableName, [columnName1, columnName2], [1, 1])); + + // Assert + var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); + Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NULL, Column2 INTEGER NOT NULL, PRIMARY KEY (Column1, Column2))")); + + var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName); + Assert.That(pragmaTableInfos.Single(x => x.Name == columnName1).NotNull, Is.False); + Assert.That(pragmaTableInfos.Single(x => x.Name == columnName2).NotNull, Is.True); + + var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); + Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1)); + Assert.That(sqliteInfo.Columns[1].Name, Is.EqualTo(columnName2)); + + // 19 = UNIQUE constraint failed + Assert.That(ex.ErrorCode, Is.EqualTo(19)); + } + + [Test] + public void AddTable_SinglePrimaryKey_ContainsNull() + { + const string tableName = "MyTableName"; + const string columnName1 = "Column1"; + const string columnName2 = "Column2"; + + // Arrange/Act + Provider.AddTable(tableName, + new Column(columnName1, System.Data.DbType.Int32, ColumnProperty.PrimaryKey), + new Column(columnName2, System.Data.DbType.Int32, ColumnProperty.NotNull) + ); + + Provider.Insert(tableName, [columnName1, columnName2], [1, 1]); + Assert.Throws(() => Provider.Insert(tableName, [columnName1, columnName2], [1, 2])); + + // Assert + var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); + Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NOT NULL PRIMARY KEY, Column2 INTEGER NOT NULL)")); + + var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName); + Assert.That(pragmaTableInfos.All(x => x.NotNull), Is.True); + + var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); + Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1)); + Assert.That(sqliteInfo.Columns[1].Name, Is.EqualTo(columnName2)); + } + + [Test] + public void AddTable_MiscellaneousColumns_Succeeds() + { + const string tableName = "MyTableName"; + const string columnName1 = "Column1"; + const string columnName2 = "Column2"; + + // Arrange/Act + Provider.AddTable(tableName, + new Column(columnName1, System.Data.DbType.Int32, ColumnProperty.NotNull | ColumnProperty.Identity | ColumnProperty.PrimaryKey), + new Column(columnName2, System.Data.DbType.Int32, ColumnProperty.Null | ColumnProperty.Unique) + ); + + Provider.Insert(tableName, [columnName1, columnName2], [1, 1]); + Assert.Throws(() => Provider.Insert(tableName, [columnName1, columnName2], [1, 1])); + + // Assert + var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName); + Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, Column2 INTEGER NULL UNIQUE)")); + + var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName); + Assert.That(pragmaTableInfos.First().NotNull, Is.True); + Assert.That(pragmaTableInfos[1].NotNull, Is.False); + + var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName); + Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1)); + Assert.That(sqliteInfo.Columns[1].Name, Is.EqualTo(columnName2)); + } } \ No newline at end of file diff --git a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs index e73aedfc..bd17082d 100644 --- a/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs +++ b/src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_ChangeColumnTests.cs @@ -1,61 +1,69 @@ -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; -using NUnit.Framework.Legacy; - -namespace Migrator.Tests.Providers.SQLite; - -[TestFixture] -[Category("SQLite")] -public class SQLiteTransformationProvider_ChangeColumnTests : SQLiteTransformationProviderTestBase -{ - [Test] - public void ChangeColumn_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds() - { - // Arrange - const string testTableName = "MyDefaultTestTable"; - const string propertyName1 = "Color1"; - const string propertyName2 = "Color2"; - const string indexName = "MyIndexName"; - - Provider.AddTable(testTableName, - new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKey), - new Column(propertyName2, DbType.Int32, ColumnProperty.NotNull) - ); - - Provider.AddIndex(indexName, testTableName, [propertyName1, propertyName2]); - var tableInfoBefore = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(testTableName); - - Provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (1, 2)"); - - // Act - Provider.ChangeColumn(table: testTableName, new Column(propertyName2, DbType.String, ColumnProperty.Unique | ColumnProperty.Null)); - Provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (2, 3)"); - - // Assert - using var command = Provider.GetCommand(); - using var reader = Provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {testTableName}"); - reader.Read(); - var count = reader.GetInt32(reader.GetOrdinal("Count")); - Assert.That(count, Is.EqualTo(2)); - - var tableInfoAfter = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(testTableName); - - Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True); - Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.False); - Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.NotNull), Is.True); - Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Null), Is.False); - - Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True); - Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True); - Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.NotNull), Is.False); - Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Null), Is.True); - - var indexAfter = tableInfoAfter.Indexes.Single(); - Assert.That(indexAfter.Name, Is.EqualTo(indexName)); - CollectionAssert.AreEquivalent(indexAfter.KeyColumns, new string[] { propertyName1, propertyName2 }); - } +using System.Data; +using System.Linq; +using System.Threading.Tasks; +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; + +namespace Migrator.Tests.Providers.SQLite; + +[TestFixture] +[Category("SQLite")] +public class SQLiteTransformationProvider_ChangeColumnTests : Generic_ChangeColumnTestsBase +{ + [SetUp] + public async Task SetUpAsync() + { + await BeginSQLiteTransactionAsync(); + } + + [Test] + public void ChangeColumn_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds() + { + // Arrange + const string testTableName = "MyDefaultTestTable"; + const string propertyName1 = "Color1"; + const string propertyName2 = "Color2"; + const string indexName = "MyIndexName"; + + Provider.AddTable(testTableName, + new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKey), + new Column(propertyName2, DbType.Int32, ColumnProperty.NotNull) + ); + + Provider.AddIndex(indexName, testTableName, [propertyName1, propertyName2]); + var tableInfoBefore = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(testTableName); + + Provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (1, 2)"); + + // Act + Provider.ChangeColumn(table: testTableName, new Column(propertyName2, DbType.String, ColumnProperty.Unique | ColumnProperty.Null)); + Provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (2, 3)"); + + // Assert + using var command = Provider.GetCommand(); + using var reader = Provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {testTableName}"); + reader.Read(); + var count = reader.GetInt32(reader.GetOrdinal("Count")); + Assert.That(count, Is.EqualTo(2)); + + var tableInfoAfter = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(testTableName); + + Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True); + Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.False); + Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.NotNull), Is.True); + Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Null), Is.False); + + Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True); + Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True); + Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.NotNull), Is.False); + Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Null), Is.True); + + var indexAfter = tableInfoAfter.Indexes.Single(); + Assert.That(indexAfter.Name, Is.EqualTo(indexName)); + CollectionAssert.AreEquivalent(indexAfter.KeyColumns, new string[] { propertyName1, propertyName2 }); + } } \ No newline at end of file