Skip to content

Commit fba9b11

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Identity checks / DateTimeOffset default value update
1 parent 87cc0bf commit fba9b11

8 files changed

+163
-12
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Migrator.Tests.Providers.Base;
2+
3+
namespace Migrator.Tests.Providers.Generic;
4+
5+
public abstract class Generic_GetColumnsTestsBase : TransformationProviderBase
6+
{
7+
}

src/Migrator.Tests/Providers/OracleProvider/OracleTransformationProvider_GetColumns_Tests.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
using System.Linq;
44
using System.Threading.Tasks;
55
using DotNetProjects.Migrator.Framework;
6-
using Migrator.Tests.Providers.Base;
6+
using Migrator.Tests.Providers.Generic;
77
using NUnit.Framework;
88

99
namespace Migrator.Tests.Providers.OracleProvider;
1010

1111
[TestFixture]
1212
[Category("Oracle")]
13-
public class OracleTransformationProvider_GetColumns_Tests : TransformationProviderBase
13+
public class OracleTransformationProvider_GetColumns_Tests : Generic_GetColumnsTestsBase
1414
{
1515
[SetUp]
1616
public async Task SetUpAsync()
@@ -110,4 +110,33 @@ public void GetColumns_DefaultValues_Succeeds()
110110
Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 }));
111111
Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596567));
112112
}
113+
114+
[Test]
115+
public void GetColumns_GetIdentity_Succeeds()
116+
{
117+
// Arrange
118+
var tableName1 = "Table1";
119+
var tableName2 = "Table2";
120+
var tableName3 = "Table3";
121+
var tableName4 = "Table4";
122+
var columnName1 = "ColumnName1";
123+
124+
Provider.ExecuteNonQuery($"CREATE TABLE {tableName1} ({columnName1} NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY)");
125+
Provider.ExecuteNonQuery($"CREATE TABLE {tableName2} ({columnName1} NUMBER PRIMARY KEY)");
126+
127+
Provider.AddTable(name: tableName3, new Column(columnName1, DbType.Int32, ColumnProperty.Identity | ColumnProperty.PrimaryKey));
128+
Provider.AddTable(name: tableName4, new Column(columnName1, DbType.Int32, ColumnProperty.PrimaryKey));
129+
130+
// Act
131+
var columnTable1 = Provider.GetColumnByName(table: tableName1, column: columnName1);
132+
var columnTable2 = Provider.GetColumnByName(table: tableName2, column: columnName1);
133+
var columnTable3 = Provider.GetColumnByName(table: tableName3, column: columnName1);
134+
var columnTable4 = Provider.GetColumnByName(table: tableName4, column: columnName1);
135+
136+
// Assert
137+
Assert.That(columnTable1.IsIdentity, Is.True);
138+
Assert.That(columnTable2.IsIdentity, Is.False);
139+
Assert.That(columnTable3.IsIdentity, Is.True);
140+
Assert.That(columnTable4.IsIdentity, Is.False);
141+
}
113142
}

src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_ChangeColumnTests.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,66 @@ public void ChangeColumn_DateTimeOffsetToDateTime_Success()
4242
Assert.That(column2.MigratorDbType, Is.EqualTo(MigratorDbType.DateTime2));
4343
Assert.That(column2.DefaultValue, Is.Null);
4444
}
45+
46+
[Test]
47+
public void ChangeColumn_DateTimeOffsetToDateTimeGetDefaultValueAndReuseIt_DefaultValueIsEqualAndValueIsEqual()
48+
{
49+
// Arrange
50+
var tableName = "TableName";
51+
var column1Name = "Column1";
52+
var column2Name = "Column2";
53+
var dateTimeOffsetDefaultValue = new DateTimeOffset(2022, 2, 3, 4, 5, 6, TimeSpan.FromHours(2));
54+
var dateTimeOffsetInsert = new DateTimeOffset(2001, 2, 3, 4, 5, 6, TimeSpan.FromHours(2));
55+
56+
Provider.AddTable(tableName,
57+
new Column(column1Name, DbType.Int32, ColumnProperty.Null),
58+
new Column(column2Name, DbType.DateTimeOffset, ColumnProperty.Null, defaultValue: dateTimeOffsetDefaultValue)
59+
);
60+
61+
Provider.Insert(table: tableName, columns: [column2Name], values: [dateTimeOffsetInsert]);
62+
// Act
63+
64+
var column2 = Provider.GetColumnByName(tableName, column2Name);
65+
Assert.That(((DateTimeOffset)column2.DefaultValue).UtcDateTime, Is.EqualTo(dateTimeOffsetDefaultValue.UtcDateTime));
66+
Provider.ChangeColumn(tableName, new Column(column2Name, DbType.DateTime2, ColumnProperty.NotNull, defaultValue: column2.DefaultValue));
67+
68+
69+
// Assert
70+
column2 = Provider.GetColumnByName(tableName, column2Name);
71+
72+
// using var reader = Provider.Select(Provider.GetCommand(), what: column2Name, from: tableName);
73+
// var valueFromDatabase = reader.GetDateTime(0);
74+
75+
Assert.That(column2.MigratorDbType, Is.EqualTo(MigratorDbType.DateTime2));
76+
Assert.That(column2.DefaultValue, Is.EqualTo(dateTimeOffsetDefaultValue.UtcDateTime));
77+
}
78+
79+
[Test]
80+
public void GetColumns_GetIdentity_Succeeds()
81+
{
82+
// Arrange
83+
var tableName1 = "Table1";
84+
var tableName2 = "Table2";
85+
var tableName3 = "Table3";
86+
var tableName4 = "Table4";
87+
var columnName1 = "ColumnName1";
88+
89+
Provider.ExecuteNonQuery($"CREATE TABLE {tableName1} ({columnName1} INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY)");
90+
Provider.ExecuteNonQuery($"CREATE TABLE {tableName2} ({columnName1} INT PRIMARY KEY)");
91+
92+
Provider.AddTable(name: tableName3, new Column(columnName1, DbType.Int32, ColumnProperty.Identity | ColumnProperty.PrimaryKey));
93+
Provider.AddTable(name: tableName4, new Column(columnName1, DbType.Int32, ColumnProperty.PrimaryKey));
94+
95+
// Act
96+
var columnTable1 = Provider.GetColumnByName(table: tableName1, column: columnName1);
97+
var columnTable2 = Provider.GetColumnByName(table: tableName2, column: columnName1);
98+
var columnTable3 = Provider.GetColumnByName(table: tableName3, column: columnName1);
99+
var columnTable4 = Provider.GetColumnByName(table: tableName4, column: columnName1);
100+
101+
// Assert
102+
Assert.That(columnTable1.IsIdentity, Is.True);
103+
Assert.That(columnTable2.IsIdentity, Is.False);
104+
Assert.That(columnTable3.IsIdentity, Is.True);
105+
Assert.That(columnTable4.IsIdentity, Is.False);
106+
}
45107
}

src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumns_Tests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
using System.Threading.Tasks;
2-
using Migrator.Tests.Providers.Base;
2+
using Migrator.Tests.Providers.Generic;
33
using NUnit.Framework;
44

55
namespace Migrator.Tests.Providers.PostgreSQL;
66

77
[TestFixture]
88
[Category("Postgre")]
9-
public class PostgreSQLTransformationProvider_GetColumns_Tests : TransformationProviderBase
9+
public class PostgreSQLTransformationProvider_GetColumns_Tests : Generic_GetColumnsTestsBase
1010
{
1111
[SetUp]
1212
public async Task SetUpAsync()
Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,47 @@
1+
using System.Data;
12
using System.Threading.Tasks;
2-
using Migrator.Tests.Providers.Base;
3+
using DotNetProjects.Migrator.Framework;
4+
using Migrator.Tests.Providers.Generic;
35
using NUnit.Framework;
46

57
namespace Migrator.Tests.Providers.SQLServer;
68

79
[TestFixture]
810
[Category("SqlServer")]
9-
public class SQLServerTransformationProvider_GetColumnsTests : TransformationProviderBase
11+
public class SQLServerTransformationProvider_GetColumnsTests : Generic_GetColumnsTestsBase
1012
{
1113
[SetUp]
1214
public async Task SetUpAsync()
1315
{
1416
await BeginSQLServerTransactionAsync();
1517
}
18+
19+
[Test]
20+
public void GetColumns_GetIdentity_Succeeds()
21+
{
22+
// Arrange
23+
var tableName1 = "Table1";
24+
var tableName2 = "Table2";
25+
var tableName3 = "Table3";
26+
var tableName4 = "Table4";
27+
var columnName1 = "ColumnName1";
28+
29+
Provider.ExecuteNonQuery($"CREATE TABLE {tableName1} ({columnName1} INT IDENTITY(1,1) PRIMARY KEY)");
30+
Provider.ExecuteNonQuery($"CREATE TABLE {tableName2} ({columnName1} INT PRIMARY KEY)");
31+
32+
Provider.AddTable(name: tableName3, new Column(columnName1, DbType.Int32, ColumnProperty.Identity | ColumnProperty.PrimaryKey));
33+
Provider.AddTable(name: tableName4, new Column(columnName1, DbType.Int32, ColumnProperty.PrimaryKey));
34+
35+
// Act
36+
var columnTable1 = Provider.GetColumnByName(table: tableName1, column: columnName1);
37+
var columnTable2 = Provider.GetColumnByName(table: tableName2, column: columnName1);
38+
var columnTable3 = Provider.GetColumnByName(table: tableName3, column: columnName1);
39+
var columnTable4 = Provider.GetColumnByName(table: tableName4, column: columnName1);
40+
41+
// Assert
42+
Assert.That(columnTable1.IsIdentity, Is.True);
43+
Assert.That(columnTable2.IsIdentity, Is.False);
44+
Assert.That(columnTable3.IsIdentity, Is.True);
45+
Assert.That(columnTable4.IsIdentity, Is.False);
46+
}
1647
}

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
using System.Threading.Tasks;
44
using DotNetProjects.Migrator.Framework;
55
using DotNetProjects.Migrator.Providers.Impl.SQLite;
6-
using Migrator.Tests.Providers.Base;
6+
using Migrator.Tests.Providers.Generic;
77
using NUnit.Framework;
88

99
namespace Migrator.Tests.Providers.SQLite;
1010

1111
[TestFixture]
1212
[Category("SQLite")]
13-
public class SQLiteTransformationProvider_GetColumnsTests : TransformationProviderBase
13+
public class SQLiteTransformationProvider_GetColumnsTests : Generic_GetColumnsTestsBase
1414
{
1515
[SetUp]
1616
public async Task SetUpAsync()

src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,10 @@ public override Column[] GetColumns(string table)
612612
{
613613
columnInfo.ColumnDefault = match.Value;
614614
}
615-
column.DefaultValue = long.Parse(columnInfo.ColumnDefault.ToString());
615+
if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase))
616+
{
617+
column.DefaultValue = long.Parse(columnInfo.ColumnDefault.ToString());
618+
}
616619
}
617620
else if (column.MigratorDbType == MigratorDbType.UInt16 || column.MigratorDbType == MigratorDbType.UInt32 || column.MigratorDbType == MigratorDbType.UInt64)
618621
{
@@ -621,7 +624,10 @@ public override Column[] GetColumns(string table)
621624
{
622625
columnInfo.ColumnDefault = match.Value;
623626
}
624-
column.DefaultValue = ulong.Parse(columnInfo.ColumnDefault.ToString());
627+
if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase))
628+
{
629+
column.DefaultValue = ulong.Parse(columnInfo.ColumnDefault.ToString());
630+
}
625631
}
626632
else if (column.MigratorDbType == MigratorDbType.Double || column.MigratorDbType == MigratorDbType.Single)
627633
{
@@ -630,7 +636,10 @@ public override Column[] GetColumns(string table)
630636
{
631637
columnInfo.ColumnDefault = match.Value;
632638
}
633-
column.DefaultValue = double.Parse(columnInfo.ColumnDefault.ToString(), CultureInfo.InvariantCulture);
639+
if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase))
640+
{
641+
column.DefaultValue = double.Parse(columnInfo.ColumnDefault.ToString(), CultureInfo.InvariantCulture);
642+
}
634643
}
635644
else if (column.MigratorDbType == MigratorDbType.Interval)
636645
{
@@ -731,7 +740,10 @@ public override Column[] GetColumns(string table)
731740
{
732741
columnInfo.ColumnDefault = match.Value;
733742
}
734-
column.DefaultValue = decimal.Parse(columnInfo.ColumnDefault, CultureInfo.InvariantCulture);
743+
if (!columnInfo.ColumnDefault.Contains(table, StringComparison.OrdinalIgnoreCase))
744+
{
745+
column.DefaultValue = decimal.Parse(columnInfo.ColumnDefault, CultureInfo.InvariantCulture);
746+
}
735747
}
736748
else if (column.MigratorDbType == MigratorDbType.String)
737749
{

src/Migrator/Providers/TransformationProvider.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,6 +2033,16 @@ protected virtual void ConfigureParameterWithValue(IDbDataParameter parameter, i
20332033
parameter.DbType = DbType.DateTime;
20342034
parameter.Value = value;
20352035
}
2036+
else if (value is DateTimeOffset dateTimeOffset)
2037+
{
2038+
parameter.DbType = DbType.DateTimeOffset;
2039+
parameter.Value = dateTimeOffset.ToUniversalTime();
2040+
}
2041+
else if (value is DateTimeOffset?)
2042+
{
2043+
parameter.DbType = DbType.DateTimeOffset;
2044+
parameter.Value = value == null ? null : ((DateTimeOffset?)value).Value.ToUniversalTime();
2045+
}
20362046
else if (value is bool || value is bool?)
20372047
{
20382048
parameter.DbType = DbType.Boolean;

0 commit comments

Comments
 (0)