Skip to content

Commit 6709f7f

Browse files
Merge pull request #127 from dotnetprojects/functional-expressions
Functional expressions
2 parents 675e2ed + 2c9acb5 commit 6709f7f

32 files changed

+2454
-243
lines changed

.github/workflows/dotnetpull.yml

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ on:
55
branches: [master]
66
pull_request:
77
branches: [master]
8-
98
jobs:
109
build:
1110
runs-on: ubuntu-latest
12-
1311
services:
1412
sqlserver:
1513
image: mcr.microsoft.com/mssql/server:2019-latest
@@ -23,21 +21,20 @@ jobs:
2321
--health-interval=10s
2422
--health-timeout=5s
2523
--health-retries=10
26-
2724
postgres:
2825
image: postgres:13
2926
ports:
3027
- 5432:5432
3128
env:
3229
POSTGRES_USER: testuser
3330
POSTGRES_PASSWORD: testpass
34-
POSTGRES_DB: testdb
31+
# As of v16 we can use:
32+
# POSTGRES_INITDB_ARGS: "-c max_connections=300"
3533
options: >-
3634
--health-cmd="pg_isready -U testuser"
3735
--health-interval=10s
3836
--health-timeout=5s
3937
--health-retries=5
40-
4138
oracle:
4239
image: gvenzl/oracle-free:latest
4340
ports:
@@ -49,7 +46,6 @@ jobs:
4946
--health-interval 10s
5047
--health-timeout 5s
5148
--health-retries 10
52-
5349
mysql:
5450
image: mysql:8.0
5551
ports:
@@ -64,7 +60,6 @@ jobs:
6460
--health-interval=10s
6561
--health-timeout=5s
6662
--health-retries=10
67-
6863
steps:
6964
- uses: actions/checkout@v4
7065
- uses: gvenzl/setup-oracle-sqlcl@v1

src/Migrator.Tests/Database/DerivedDatabaseIntegrationTestServices/PostgreSqlDatabaseIntegrationTestService.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ public override async Task<DatabaseInfo> CreateTestDatabaseAsync(DatabaseConnect
5454
await context.ExecuteAsync($"CREATE DATABASE \"{newDatabaseName}\"", cancellationToken);
5555
}
5656

57-
var connectionStringBuilder2 = new NpgsqlConnectionStringBuilder
57+
var connectionStringBuilder2 = new NpgsqlConnectionStringBuilder(clonedDatabaseConnectionConfig.ConnectionString)
5858
{
59-
ConnectionString = clonedDatabaseConnectionConfig.ConnectionString,
6059
Database = newDatabaseName
6160
};
6261

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using DotNetProjects.Migrator.Providers.Impl.PostgreSQL;
2+
using DotNetProjects.Migrator.Providers.Models.Indexes.Enums;
3+
using NUnit.Framework;
4+
5+
namespace Migrator.Tests.Dialects;
6+
7+
[TestFixture]
8+
[Category("Postgre")]
9+
public class PostgreDialectTests
10+
{
11+
private PostgreSQLDialect _postgreSQLDialect;
12+
13+
[SetUp]
14+
public void SetUp()
15+
{
16+
// Since Dialect is abstract we use PostgreSQLDialect
17+
_postgreSQLDialect = new PostgreSQLDialect();
18+
}
19+
20+
[TestCase(FilterType.EqualTo, "=")]
21+
[TestCase(FilterType.GreaterThanOrEqualTo, ">=")]
22+
[TestCase(FilterType.SmallerThanOrEqualTo, "<=")]
23+
[TestCase(FilterType.SmallerThan, "<")]
24+
[TestCase(FilterType.GreaterThan, ">")]
25+
[TestCase(FilterType.NotEqualTo, "<>")]
26+
public void GetComparisonStringByFilterType_Success(FilterType filterType, string expectedString)
27+
{
28+
var result = _postgreSQLDialect.GetComparisonStringByFilterType(filterType);
29+
30+
Assert.That(result, Is.EqualTo(expectedString));
31+
}
32+
33+
[TestCase("=", FilterType.EqualTo)]
34+
[TestCase(">=", FilterType.GreaterThanOrEqualTo)]
35+
[TestCase("<=", FilterType.SmallerThanOrEqualTo)]
36+
[TestCase("<", FilterType.SmallerThan)]
37+
[TestCase(">", FilterType.GreaterThan)]
38+
[TestCase("<>", FilterType.NotEqualTo)]
39+
public void GetFilterTypeByComparisonString_Success(string comparisonString, FilterType expectedFilterType)
40+
{
41+
var result = _postgreSQLDialect.GetFilterTypeByComparisonString(comparisonString);
42+
43+
Assert.That(result, Is.EqualTo(expectedFilterType));
44+
}
45+
}

src/Migrator.Tests/Providers/Base/TransformationProviderBase.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Data;
23
using System.Threading;
34
using System.Threading.Tasks;
45
using DotNetProjects.Migrator.Framework;
@@ -13,6 +14,7 @@
1314
using Migrator.Tests.Settings;
1415
using Migrator.Tests.Settings.Config;
1516
using Migrator.Tests.Settings.Models;
17+
using Npgsql;
1618
using NUnit.Framework;
1719

1820
namespace Migrator.Tests.Providers.Base;
@@ -22,12 +24,24 @@ namespace Migrator.Tests.Providers.Base;
2224
/// </summary>
2325
public abstract class TransformationProviderBase
2426
{
27+
private IDbConnection _dbConnection;
28+
2529
[TearDown]
2630
public virtual void TearDown()
2731
{
2832
DropTestTables();
2933

3034
Provider?.Rollback();
35+
36+
if (_dbConnection != null)
37+
{
38+
if (_dbConnection.State == ConnectionState.Open)
39+
{
40+
_dbConnection.Close();
41+
}
42+
43+
_dbConnection.Dispose();
44+
}
3145
}
3246

3347
protected void DropTestTables()
@@ -108,7 +122,10 @@ protected async Task BeginPostgreSQLTransactionAsync()
108122
var postgreIntegrationTestService = databaseIntegrationTestServiceFactory.Create(DatabaseProviderType.Postgres);
109123
var databaseInfo = await postgreIntegrationTestService.CreateTestDatabaseAsync(databaseConnectionConfig, cts.Token);
110124

111-
Provider = new PostgreSQLTransformationProvider(new PostgreSQLDialect(), databaseInfo.DatabaseConnectionConfig.ConnectionString, null, "default", "Npgsql");
125+
126+
_dbConnection = new NpgsqlConnection(databaseInfo.DatabaseConnectionConfig.ConnectionString);
127+
128+
Provider = new PostgreSQLTransformationProvider(new PostgreSQLDialect(), _dbConnection, null, "default", "Npgsql");
112129
Provider.BeginTransaction();
113130

114131
await Task.CompletedTask;
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data;
4+
using System.Globalization;
5+
using System.Linq;
6+
using DotNetProjects.Migrator.Framework;
7+
using DotNetProjects.Migrator.Providers.Models.Indexes;
8+
using DotNetProjects.Migrator.Providers.Models.Indexes.Enums;
9+
using Migrator.Tests.Providers.Base;
10+
using NUnit.Framework;
11+
using Index = DotNetProjects.Migrator.Framework.Index;
12+
13+
namespace Migrator.Tests.Providers.Generic;
14+
15+
public abstract class Generic_AddIndexTestsBase : TransformationProviderBase
16+
{
17+
[Test]
18+
public void AddIndex_TableDoesNotExist()
19+
{
20+
// Act
21+
Assert.Throws<MigrationException>(() => Provider.AddIndex("NotExistingTable", new Index()));
22+
Assert.Throws<MigrationException>(() => Provider.AddIndex("NotExistingIndex", "NotExistingTable", "column"));
23+
}
24+
25+
[Test]
26+
public void AddIndex_AddAlreadyExistingIndex_Throws()
27+
{
28+
// Arrange
29+
const string tableName = "TestTable";
30+
const string columnName = "TestColumn";
31+
const string indexName = "TestIndexName";
32+
33+
Provider.AddTable(tableName, new Column(columnName, DbType.Int32));
34+
Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] });
35+
36+
// Act/Assert
37+
// Add already existing index
38+
Assert.Throws<MigrationException>(() => Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] }));
39+
}
40+
41+
[Test]
42+
public void AddIndex_IncludeColumnsContainsColumnThatExistInKeyColumns_Throws()
43+
{
44+
// Arrange
45+
const string tableName = "TestTable";
46+
const string columnName1 = "TestColumn1";
47+
const string indexName = "TestIndexName";
48+
49+
Provider.AddTable(tableName, new Column(columnName1, DbType.Int32));
50+
51+
Assert.Throws<MigrationException>(() => Provider.AddIndex(tableName,
52+
new Index
53+
{
54+
Name = indexName,
55+
KeyColumns = [columnName1],
56+
IncludeColumns = [columnName1]
57+
}));
58+
}
59+
60+
[Test]
61+
public void AddIndex_ColumnNameUsedInFilterItemDoesNotExistInKeyColumns_Throws()
62+
{
63+
// Arrange
64+
const string tableName = "TestTable";
65+
const string columnName1 = "TestColumn1";
66+
const string columnName2 = "TestColumn2";
67+
const string indexName = "TestIndexName";
68+
69+
Provider.AddTable(tableName,
70+
new Column(columnName1, DbType.Int32),
71+
new Column(columnName2, DbType.Int32)
72+
);
73+
74+
Assert.Throws<MigrationException>(() => Provider.AddIndex(tableName,
75+
new Index
76+
{
77+
Name = indexName,
78+
KeyColumns = [columnName1],
79+
FilterItems = [new FilterItem { Filter = FilterType.GreaterThan, ColumnName = columnName2, Value = 12 }]
80+
}));
81+
}
82+
83+
[Test]
84+
public void AddIndex_UsingIndexInstanceOverload_NonUnique_ShouldBeReadable()
85+
{
86+
// Arrange
87+
const string tableName = "TestTable";
88+
const string columnName = "TestColumn";
89+
const string indexName = "TestIndexName";
90+
91+
Provider.AddTable(tableName, new Column(columnName, DbType.Int32));
92+
93+
// Act
94+
Provider.AddIndex(tableName, new Index { Name = indexName, KeyColumns = [columnName] });
95+
96+
// Assert
97+
var indexes = Provider.GetIndexes(tableName);
98+
99+
var index = indexes.Single();
100+
101+
Assert.That(index.Name, Is.EqualTo(indexName).IgnoreCase);
102+
Assert.That(index.KeyColumns.Single(), Is.EqualTo(columnName).IgnoreCase);
103+
}
104+
105+
[Test]
106+
public void AddIndex_UsingNonIndexInstanceOverload_NonUnique_ShouldBeReadable()
107+
{
108+
// Arrange
109+
const string tableName = "TestTable";
110+
const string columnName = "TestColumn";
111+
const string indexName = "TestIndexName";
112+
113+
Provider.AddTable(tableName, new Column(columnName, DbType.Int32));
114+
115+
// Act
116+
Provider.AddIndex(indexName, tableName, columnName);
117+
118+
// Assert
119+
var indexes = Provider.GetIndexes(tableName);
120+
121+
var index = indexes.Single();
122+
123+
Assert.That(index.Name, Is.EqualTo(indexName).IgnoreCase);
124+
Assert.That(index.KeyColumns.Single(), Is.EqualTo(columnName).IgnoreCase);
125+
}
126+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Data;
2+
using System.Linq;
3+
using DotNetProjects.Migrator.Framework;
4+
using DotNetProjects.Migrator.Providers.Models.Indexes.Enums;
5+
using Migrator.Tests.Providers.Base;
6+
using NUnit.Framework;
7+
using Index = DotNetProjects.Migrator.Framework.Index;
8+
9+
namespace Migrator.Tests.Providers.Generic;
10+
11+
public abstract class Generic_GetIndexesTestsBase : TransformationProviderBase
12+
{
13+
[Test]
14+
public void AddIndex_FilteredIndexGreaterOrEqualThanNumber_Success()
15+
{
16+
// Arrange
17+
const string tableName = "TestTable";
18+
const string columnName = "TestColumn";
19+
const string columnName2 = "TestColumn2";
20+
const string columnName3 = "TestColumn3";
21+
const string indexName = "TestIndexName";
22+
23+
Provider.AddTable(tableName,
24+
new Column(columnName, DbType.Int32),
25+
new Column(columnName2, DbType.String),
26+
new Column(columnName3, DbType.Int32)
27+
);
28+
29+
Provider.AddIndex(tableName,
30+
new Index
31+
{
32+
Name = indexName,
33+
KeyColumns = [columnName, columnName2],
34+
Unique = true,
35+
FilterItems = [
36+
new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName, Value = 100 },
37+
new() { Filter = FilterType.EqualTo, ColumnName = columnName2, Value = "Hello" },
38+
]
39+
});
40+
41+
// Act
42+
var indexes = Provider.GetIndexes(table: tableName);
43+
44+
var index = indexes.Single();
45+
46+
var filterItem1 = index.FilterItems.Single(x => x.ColumnName == columnName);
47+
var filterItem2 = index.FilterItems.Single(x => x.ColumnName == columnName2);
48+
49+
Assert.That(filterItem1.Filter, Is.EqualTo(FilterType.GreaterThanOrEqualTo));
50+
Assert.That((long)filterItem1.Value, Is.EqualTo(100));
51+
52+
Assert.That(filterItem2.Filter, Is.EqualTo(FilterType.EqualTo));
53+
Assert.That((string)filterItem2.Value, Is.EqualTo("Hello"));
54+
}
55+
}

src/Migrator.Tests/Providers/Generic/TransformationProviderGenericMiscConstraintBase.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,7 @@ public void CanAddPrimaryKey()
4444
{
4545
AddPrimaryKey();
4646

47-
if (Provider is SQLiteTransformationProvider)
48-
{
49-
Assert.Throws<NotSupportedException>(() => Provider.PrimaryKeyExists("Test", "PK_Test"));
50-
}
51-
else
52-
{
53-
Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True);
54-
}
47+
Assert.That(Provider.PrimaryKeyExists("Test", "PK_Test"), Is.True);
5548
}
5649

5750
// [Test]

0 commit comments

Comments
 (0)