forked from MoonStorm/FastCrud
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSqlBuilderSteps.cs
101 lines (87 loc) · 4.94 KB
/
SqlBuilderSteps.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
namespace Dapper.FastCrud.Tests
{
using System;
using System.Linq;
using System.Security.Cryptography;
using Dapper.FastCrud.SqlBuilders;
using Dapper.FastCrud.Tests.Models;
using NUnit.Framework;
using TechTalk.SpecFlow;
[Binding]
public sealed class SqlBuilderSteps
{
private GenericStatementSqlBuilder _currentSqlBuilder;
private string _rawSqlStatement;
private string[] _selectColumnNames;
private SqlDialect _currentDialect;
private string _buildingRawJoinQueryStatement;
[Given(@"I extract the SQL builder for LocalDb and workstation")]
public void GivenIExtractTheSQLBuilderForLocalDbAndWorkstation()
{
PrepareEnvironment<Workstation>(SqlDialect.MsSql);
}
[Given(@"I extract the SQL builder for PostgreSql and workstation")]
public void GivenIExtractTheSQLBuilderForPostgreSqlAndWorkstation()
{
PrepareEnvironment<Workstation>(SqlDialect.PostgreSql);
}
[Given(@"I extract the SQL builder for MySql and workstation")]
public void GivenIExtractTheSQLBuilderForMySqlAndWorkstation()
{
PrepareEnvironment<Workstation>(SqlDialect.MySql);
}
[Given(@"I extract the SQL builder for SqLite and workstation")]
public void GivenIExtractTheSQLBuilderForSqLiteAndWorkstation()
{
PrepareEnvironment<Workstation>(SqlDialect.SqLite);
}
[When(@"I construct the select column enumeration")]
public void WhenIConstructTheSelectColumnEnumeration()
{
_rawSqlStatement = _currentSqlBuilder.ConstructColumnEnumerationForSelect();
}
[Then(@"I should get a valid select column enumeration")]
public void ThenIShouldGetAValidSelectColumnEnumeration()
{
var databaseOptions = OrmConfiguration.Conventions.GetDatabaseOptions(_currentDialect);
var expectedSql = string.Join(
",",
_selectColumnNames.Select(colName => $"{databaseOptions.StartDelimiter}{colName}{databaseOptions.EndDelimiter}"));
Assert.That(_rawSqlStatement, Is.EqualTo(expectedSql));
}
[When(@"I construct a complex join query for workstation using individual identifier resolvers")]
public void WhenIConstructAComplexJoinQueryForWorkstationUsingIndividualIdentifierResolvers()
{
_buildingRawJoinQueryStatement = _currentSqlBuilder.Format(
$@" SELECT {nameof(Workstation):T}.{nameof(Workstation.WorkstationId):C}, {Sql.Table<Building>()}.{Sql.Column<Building>(nameof(Building.BuildingId))}
FROM {nameof(Workstation):T}, {Sql.Table<Building>()}
WHERE {nameof(Workstation):T}.{nameof(Workstation.BuildingId):C} = {Sql.Table<Building>()}.{Sql.Column<Building>(nameof(Building.BuildingId))}" );
}
[When(@"I construct a complex join query for workstation using combined table and column identifier resolvers")]
public void WhenIConstructAComplexJoinQueryForWorkstationUsingCombinedResolvers()
{
_buildingRawJoinQueryStatement = _currentSqlBuilder.Format(
$@" SELECT {nameof(Workstation.WorkstationId):TC}, {Sql.TableAndColumn<Building>(nameof(Building.BuildingId))}
FROM {nameof(Workstation):T}, {Sql.Table<Building>()}
WHERE {nameof(Workstation.BuildingId):TC} = {Sql.TableAndColumn<Building>(nameof(Building.BuildingId))}");
}
[Then(@"I should get a valid join query statement for workstation")]
public void ThenIShouldGetAValidJoinQueryStatementForWorkstation()
{
var buildingSqlBuilder = OrmConfiguration.GetSqlBuilder<Building>();
var expectedQuery =
$@" SELECT {_currentSqlBuilder.GetTableName()}.{_currentSqlBuilder.GetColumnName(nameof(Workstation.WorkstationId))}, {buildingSqlBuilder.GetTableName()}.{buildingSqlBuilder.GetColumnName(nameof(Building.BuildingId))}
FROM {_currentSqlBuilder.GetTableName()}, {buildingSqlBuilder.GetTableName()}
WHERE {_currentSqlBuilder.GetTableName()}.{_currentSqlBuilder.GetColumnName(nameof(Workstation.BuildingId))} = {buildingSqlBuilder.GetTableName()}.{buildingSqlBuilder.GetColumnName(nameof(Building.BuildingId))}";
Assert.AreEqual(expectedQuery, _buildingRawJoinQueryStatement);
}
private void PrepareEnvironment<TEntity>(SqlDialect dialect)
{
OrmConfiguration.DefaultDialect = dialect;
// in real library usage, people will use the ISqlBuilder, but for our tests we're gonna need more than that
_currentSqlBuilder = OrmConfiguration.GetSqlBuilder<TEntity>() as GenericStatementSqlBuilder;
_currentDialect = dialect;
_selectColumnNames = _currentSqlBuilder.SelectProperties.Select(propInfo => propInfo.DatabaseColumnName).ToArray();
}
}
}