forked from SQLStreamStore/SQLStreamStore
-
Notifications
You must be signed in to change notification settings - Fork 2
/
MsSqlStreamStoreFixture.cs
176 lines (149 loc) · 5.68 KB
/
MsSqlStreamStoreFixture.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
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
namespace SqlStreamStore
{
using System;
using System.Data.SqlClient;
#if NET461
using System.Data.SqlLocalDb;
#endif
using System.Linq;
using System.Threading.Tasks;
public class MsSqlStreamStoreFixture : StreamStoreAcceptanceTestFixture
{
public readonly string ConnectionString;
private readonly string _schema;
private readonly string _databaseName;
private readonly ILocalInstance _localInstance;
public MsSqlStreamStoreFixture(string schema)
{
_schema = schema;
_localInstance = new LocalInstance();
var uniqueName = Guid.NewGuid().ToString().Replace("-", string.Empty);
_databaseName = $"StreamStoreTests-{uniqueName}";
ConnectionString = CreateConnectionString();
}
public override async Task<IStreamStore> GetStreamStore()
{
await CreateDatabase();
return await GetStreamStore(_schema);
}
public async Task<IStreamStore> GetStreamStore(string schema)
{
var settings = new MsSqlStreamStoreSettings(ConnectionString)
{
Schema = schema,
GetUtcNow = () => GetUtcNow()
};
var store = new MsSqlStreamStore(settings);
await store.CreateSchema();
return store;
}
public async Task<MsSqlStreamStore> GetStreamStore_v1Schema()
{
await CreateDatabase();
var settings = new MsSqlStreamStoreSettings(ConnectionString)
{
Schema = _schema,
GetUtcNow = () => GetUtcNow()
};
var store = new MsSqlStreamStore(settings);
await store.CreateSchema_v1_ForTests();
return store;
}
public async Task<MsSqlStreamStore> GetMsSqlStreamStore()
{
await CreateDatabase();
var settings = new MsSqlStreamStoreSettings(ConnectionString)
{
Schema = _schema,
GetUtcNow = () => GetUtcNow()
};
var store = new MsSqlStreamStore(settings);
await store.CreateSchema();
return store;
}
public override void Dispose()
{
using(var sqlConnection = new SqlConnection(ConnectionString))
{
// Fixes: "Cannot drop database because it is currently in use"
SqlConnection.ClearPool(sqlConnection);
}
using (var connection = _localInstance.CreateConnection())
{
connection.Open();
using (var command = new SqlCommand($"DROP DATABASE [{_databaseName}]", connection))
{
command.ExecuteNonQuery();
}
}
}
private async Task CreateDatabase()
{
using(var connection = _localInstance.CreateConnection())
{
await connection.OpenAsync();
var tempPath = Environment.GetEnvironmentVariable("Temp");
var createDatabase = $"CREATE DATABASE [{_databaseName}] on (name='{_databaseName}', "
+ $"filename='{tempPath}\\{_databaseName}.mdf')";
using (var command = new SqlCommand(createDatabase, connection))
{
await command.ExecuteNonQueryAsync();
}
}
}
private string CreateConnectionString()
{
var connectionStringBuilder = _localInstance.CreateConnectionStringBuilder();
connectionStringBuilder.MultipleActiveResultSets = true;
connectionStringBuilder.IntegratedSecurity = true;
connectionStringBuilder.InitialCatalog = _databaseName;
return connectionStringBuilder.ToString();
}
private interface ILocalInstance
{
SqlConnection CreateConnection();
SqlConnectionStringBuilder CreateConnectionStringBuilder();
}
#if NETCOREAPP1_0
private class LocalInstance : ILocalInstance
{
private readonly string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=master;Integrated Security=SSPI;";
public SqlConnection CreateConnection()
{
return new SqlConnection(connectionString);
}
public SqlConnectionStringBuilder CreateConnectionStringBuilder()
{
return new SqlConnectionStringBuilder(connectionString);
}
}
#elif NET461
private class LocalInstance : ILocalInstance
{
private readonly ISqlLocalDbInstance _localDbInstance;
private static readonly string s_sqlLocalDbProviderVersionToUse = new SqlLocalDbProvider()
.GetVersions()
.Where(provider => provider.Exists)
.Max(provider => provider.Version)
.ToString(2);
public LocalInstance()
{
var localDbProvider = new SqlLocalDbProvider
{
Version = s_sqlLocalDbProviderVersionToUse
};
_localDbInstance = localDbProvider.GetOrCreateInstance("StreamStoreTests");
_localDbInstance.Start();
}
public SqlConnection CreateConnection()
{
return _localDbInstance.CreateConnection();
}
public SqlConnectionStringBuilder CreateConnectionStringBuilder()
{
return _localDbInstance.CreateConnectionStringBuilder();
}
}
#endif
}
}