-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSqlExecuterTestAdapter.cs
More file actions
139 lines (112 loc) · 5.32 KB
/
SqlExecuterTestAdapter.cs
File metadata and controls
139 lines (112 loc) · 5.32 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.Collections.Generic;
using System.Linq;
using FizzCode.DbTools.Common;
using FizzCode.DbTools.Common.Logger;
using FizzCode.DbTools.DataDefinition;
using FizzCode.DbTools.Factory.Interfaces;
using FizzCode.DbTools.Interfaces;
using FizzCode.LightWeight;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace FizzCode.DbTools.TestBase;
public class SqlExecuterTestAdapter : ConfigurationBase
{
private readonly Dictionary<string, (ISqlStatementExecuter SqlExecuter, SqlEngineVersion Version)> sqlExecutersAndDialects = [];
private readonly Dictionary<SqlConnectionKeyAndDatabaseDefinitionTypeAsKey, DatabaseDefinition> _dds = [];
private readonly ISqlExecuterFactory _sqlExecuterFactory;
private readonly IFactoryContainer _root;
public SqlExecuterTestAdapter() : base("testconfig")
{
_root = new TestFactoryContainer();
_sqlExecuterFactory = _root.Get<ISqlExecuterFactory>();
}
public void Check(SqlEngineVersion version)
{
TestHelper.CheckProvider(version, ConnectionStrings.All);
if (!TestHelper.ShouldRunIntegrationTest(version))
Assert.Inconclusive("Test is skipped, integration tests are not running.");
}
public NamedConnectionString Initialize(string connectionStringKey, params DatabaseDefinition[] dds)
{
return Initialize(connectionStringKey, false, dds);
}
public NamedConnectionString InitializeAndCreate(string connectionStringKey, params DatabaseDefinition[] dds)
{
return Initialize(connectionStringKey, true, dds);
}
private NamedConnectionString Initialize(string connectionStringKey, bool shouldCreate, params DatabaseDefinition[] dds)
{
var connectionString = Throw.IfNull(ConnectionStrings[connectionStringKey], $"No connection string is configured for {connectionStringKey}");
var sqlEngineVersion = Throw.IfNull(connectionString.GetSqlEngineVersion());
foreach(var dd in dds)
{
var key = new SqlConnectionKeyAndDatabaseDefinitionTypeAsKey(connectionStringKey, dd);
_dds.TryAdd(key, dd);
}
if (!sqlExecutersAndDialects.ContainsKey(connectionStringKey))
{
//var generator = _sqlGeneratorFactory.CreateSqlGenerator(sqlEngineVersion, GetContext(sqlEngineVersion));
var executer = _sqlExecuterFactory.CreateSqlExecuter(connectionString);
sqlExecutersAndDialects.Add(connectionStringKey, (executer, sqlEngineVersion));
if (shouldCreate && TestHelper.ShouldRunIntegrationTest(sqlEngineVersion))
{
executer.InitializeDatabase(false, dds);
}
}
return connectionString;
}
public void Cleanup()
{
var logger = _root.Get<Logger>();
logger.Log(LogSeverity.Debug, "Cleanup is called.", "SqlExecuterTestAdapter");
var exceptions = new List<Exception>();
foreach (var sqlExecuterAndDialect in sqlExecutersAndDialects.Values)
{
logger.Log(LogSeverity.Debug, $"Cleanup is called for {sqlExecuterAndDialect.Version}", "SqlExecuterTestAdapter");
try
{
var shouldDrop = TestHelper.ShouldRunIntegrationTest(sqlExecuterAndDialect.Version);
if (shouldDrop)
{
var dds = _dds.Where(dd => dd.Key == new SqlConnectionKeyAndDatabaseDefinitionTypeAsKey(sqlExecuterAndDialect.Version.UniqueName, dd.Value)).Select(e => e.Value).ToArray();
sqlExecuterAndDialect.SqlExecuter.CleanupDatabase(true, dds);
}
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
if (exceptions.Count > 0)
throw new AggregateException(exceptions);
}
public string? ExecuteNonQuery(string connectionStringKey, string query)
{
var connectionString = Initialize(connectionStringKey);
var sqlEngineVersion = Throw.IfNull(connectionString.GetSqlEngineVersion());
if (!TestHelper.ShouldRunIntegrationTest(sqlEngineVersion))
return "Query execution is skipped, integration tests are not running.";
sqlExecutersAndDialects[connectionStringKey].SqlExecuter.ExecuteNonQuery(query);
return null;
}
public void ExecuteWithPrepareNonQuery(string connectionStringKey, string query)
{
sqlExecutersAndDialects[connectionStringKey].SqlExecuter.ExecuteNonQuery(PrepareSql(connectionStringKey, query));
}
public RowSet ExecuteWithPrepareQuery(string connectionStringKey, string query)
{
return sqlExecutersAndDialects[connectionStringKey].SqlExecuter.ExecuteQuery(PrepareSql(connectionStringKey, query));
}
public string PrepareSql(string connectionStringKey, string query)
{
var version = sqlExecutersAndDialects[connectionStringKey].Version;
var preparedQuery = query;
if (version is OracleVersion)
preparedQuery = query.Replace('[', '"').Replace(']', '"');
return preparedQuery;
}
public ISqlStatementExecuter GetExecuter(string connectionStringKey)
{
return sqlExecutersAndDialects[connectionStringKey].SqlExecuter;
}
}