-
Notifications
You must be signed in to change notification settings - Fork 257
Expand file tree
/
Copy pathNpgsqlRelationalConnectionTest.cs
More file actions
278 lines (220 loc) · 11.2 KB
/
NpgsqlRelationalConnectionTest.cs
File metadata and controls
278 lines (220 loc) · 11.2 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
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
using System.Data.Common;
using System.Transactions;
using Microsoft.EntityFrameworkCore.Diagnostics.Internal;
using Microsoft.EntityFrameworkCore.Infrastructure.Internal;
using Microsoft.EntityFrameworkCore.Storage.Internal;
using Npgsql.EntityFrameworkCore.PostgreSQL.Diagnostics.Internal;
using Npgsql.EntityFrameworkCore.PostgreSQL.Internal;
using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal;
using Npgsql.EntityFrameworkCore.PostgreSQL.TestUtilities;
using Npgsql.EntityFrameworkCore.PostgreSQL.TestUtilities.FakeProvider;
namespace Npgsql.EntityFrameworkCore.PostgreSQL;
public class NpgsqlRelationalConnectionTest
{
[Fact]
public void Creates_Npgsql_Server_connection_string()
{
using var connection = CreateConnection();
Assert.IsType<NpgsqlConnection>(connection.DbConnection);
}
[Fact]
public void Uses_DbDataSource_from_DbContextOptions()
{
using var dataSource = NpgsqlDataSource.Create("Host=FakeHost");
var serviceCollection = new ServiceCollection();
serviceCollection
.AddNpgsqlDataSource("Host=FakeHost")
.AddDbContext<FakeDbContext>(o => o.UseNpgsql(dataSource));
using var serviceProvider = serviceCollection.BuildServiceProvider();
using var scope1 = serviceProvider.CreateScope();
var context1 = scope1.ServiceProvider.GetRequiredService<FakeDbContext>();
var relationalConnection1 = (NpgsqlRelationalConnection)context1.GetService<IRelationalConnection>()!;
Assert.Same(dataSource, relationalConnection1.DbDataSource);
var connection1 = context1.GetService<FakeDbContext>().Database.GetDbConnection();
Assert.Equal("Host=FakeHost", connection1.ConnectionString);
using var scope2 = serviceProvider.CreateScope();
var context2 = scope2.ServiceProvider.GetRequiredService<FakeDbContext>();
var relationalConnection2 = (NpgsqlRelationalConnection)context2.GetService<IRelationalConnection>()!;
Assert.Same(dataSource, relationalConnection2.DbDataSource);
var connection2 = context2.GetService<FakeDbContext>().Database.GetDbConnection();
Assert.Equal("Host=FakeHost", connection2.ConnectionString);
}
[Fact]
public void Uses_DbDataSource_from_application_service_provider()
{
var serviceCollection = new ServiceCollection();
serviceCollection
.AddNpgsqlDataSource("Host=FakeHost")
.AddDbContext<FakeDbContext>(o => o.UseNpgsql());
using var serviceProvider = serviceCollection.BuildServiceProvider();
var dataSource = serviceProvider.GetRequiredService<NpgsqlDataSource>();
using var scope1 = serviceProvider.CreateScope();
var context1 = scope1.ServiceProvider.GetRequiredService<FakeDbContext>();
var relationalConnection1 = (NpgsqlRelationalConnection)context1.GetService<IRelationalConnection>()!;
Assert.Same(dataSource, relationalConnection1.DbDataSource);
var connection1 = context1.GetService<FakeDbContext>().Database.GetDbConnection();
Assert.Equal("Host=FakeHost", connection1.ConnectionString);
using var scope2 = serviceProvider.CreateScope();
var context2 = scope2.ServiceProvider.GetRequiredService<FakeDbContext>();
var relationalConnection2 = (NpgsqlRelationalConnection)context2.GetService<IRelationalConnection>()!;
Assert.Same(dataSource, relationalConnection2.DbDataSource);
var connection2 = context2.GetService<FakeDbContext>().Database.GetDbConnection();
Assert.Equal("Host=FakeHost", connection2.ConnectionString);
}
[Fact]
public void Uses_correct_DbDataSource_from_application_service_provider_with_cached_DbContextOptions_extension()
{
var serviceCollection1 = new ServiceCollection();
serviceCollection1
.AddNpgsqlDataSource("Host=FakeHost1")
.AddDbContext<FakeDbContext>(o => o.UseNpgsql());
using (var serviceProvider1 = serviceCollection1.BuildServiceProvider())
{
var dataSource1 = serviceProvider1.GetRequiredService<NpgsqlDataSource>();
Assert.Equal("Host=FakeHost1", dataSource1.ConnectionString);
var context1 = serviceProvider1.GetRequiredService<FakeDbContext>();
var relationalConnection1 = (NpgsqlRelationalConnection)context1.GetService<IRelationalConnection>()!;
Assert.Same(dataSource1, relationalConnection1.DbDataSource);
}
var serviceCollection2 = new ServiceCollection();
serviceCollection2
.AddNpgsqlDataSource("Host=FakeHost2")
.AddDbContext<FakeDbContext>(o => o.UseNpgsql());
using (var serviceProvider2 = serviceCollection2.BuildServiceProvider())
{
var dataSource2 = serviceProvider2.GetRequiredService<NpgsqlDataSource>();
Assert.Equal("Host=FakeHost2", dataSource2.ConnectionString);
var context2 = serviceProvider2.GetRequiredService<FakeDbContext>();
var relationalConnection2 = (NpgsqlRelationalConnection)context2.GetService<IRelationalConnection>()!;
Assert.Same(dataSource2, relationalConnection2.DbDataSource);
}
}
[Fact]
public void Can_create_master_connection_with_connection_string()
{
using var connection = CreateConnection();
using var master = connection.CreateAdminConnection();
Assert.Equal(
@"Host=localhost;Database=postgres;Username=some_user;Password=some_password;Pooling=False;Multiplexing=False",
master.ConnectionString);
}
[Fact]
public void Can_create_master_connection_with_connection_string_and_alternate_admin_db()
{
var options = new DbContextOptionsBuilder()
.UseNpgsql(
@"Host=localhost;Database=NpgsqlConnectionTest;Username=some_user;Password=some_password",
b => b.UseAdminDatabase("template0"))
.Options;
using var connection = CreateConnection(options);
using var master = connection.CreateAdminConnection();
Assert.Equal(
@"Host=localhost;Database=template0;Username=some_user;Password=some_password;Pooling=False;Multiplexing=False",
master.ConnectionString);
}
[Theory]
[InlineData("false")]
[InlineData("False")]
[InlineData("FALSE")]
public void CurrentAmbientTransaction_returns_null_with_enlist_set_to_false(string falseValue)
{
var options = new DbContextOptionsBuilder()
.UseNpgsql(
@"Host=localhost;Database=NpgsqlConnectionTest;Username=some_user;Password=some_password;Enlist=" + falseValue)
.Options;
Transaction.Current = new CommittableTransaction();
using var connection = CreateConnection(options);
Assert.Null(connection.CurrentAmbientTransaction);
Transaction.Current = null;
}
[Theory]
[InlineData(";Enlist=true")]
[InlineData("")] // Enlist is true by default
public void CurrentAmbientTransaction_returns_transaction_with_enlist_enabled(string enlist)
{
var options = new DbContextOptionsBuilder()
.UseNpgsql(
@"Host=localhost;Database=NpgsqlConnectionTest;Username=some_user;Password=some_password" + enlist)
.Options;
var transaction = new CommittableTransaction();
Transaction.Current = transaction;
using var connection = CreateConnection(options);
Assert.Equal(transaction, connection.CurrentAmbientTransaction);
Transaction.Current = null;
}
[ConditionalFact]
public void CloneWith_with_connection_and_connection_string()
{
var services = NpgsqlTestHelpers.Instance.CreateContextServices(
new DbContextOptionsBuilder()
.UseNpgsql("Host=localhost;Database=DummyDatabase")
.Options);
var relationalConnection = (NpgsqlRelationalConnection)services.GetRequiredService<IRelationalConnection>();
var clone = relationalConnection.CloneWith("Host=localhost;Database=DummyDatabase;Application Name=foo");
Assert.Equal("Host=localhost;Database=DummyDatabase;Application Name=foo", clone.ConnectionString);
}
public static NpgsqlRelationalConnection CreateConnection(DbContextOptions options = null, DbDataSource dataSource = null)
{
options ??= new DbContextOptionsBuilder()
.UseNpgsql(@"Host=localhost;Database=NpgsqlConnectionTest;Username=some_user;Password=some_password")
.Options;
foreach (var extension in options.Extensions)
{
extension.Validate(options);
}
var singletonOptions = new NpgsqlSingletonOptions();
singletonOptions.Initialize(options);
return new NpgsqlRelationalConnection(
new RelationalConnectionDependencies(
options,
new DiagnosticsLogger<DbLoggerCategory.Database.Transaction>(
new LoggerFactory(),
new LoggingOptions(),
new DiagnosticListener("FakeDiagnosticListener"),
new NpgsqlLoggingDefinitions(),
new NullDbContextLogger()),
new RelationalConnectionDiagnosticsLogger(
new LoggerFactory(),
new LoggingOptions(),
new DiagnosticListener("FakeDiagnosticListener"),
new NpgsqlLoggingDefinitions(),
new NullDbContextLogger(),
CreateOptions()),
new NamedConnectionStringResolver(options),
new RelationalTransactionFactory(
new RelationalTransactionFactoryDependencies(
new RelationalSqlGenerationHelper(
new RelationalSqlGenerationHelperDependencies()))),
new CurrentDbContext(new FakeDbContext()),
new RelationalCommandBuilderFactory(
new RelationalCommandBuilderDependencies(
new NpgsqlTypeMappingSource(
TestServiceFactory.Instance.Create<TypeMappingSourceDependencies>(),
TestServiceFactory.Instance.Create<RelationalTypeMappingSourceDependencies>(),
new NpgsqlSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()),
new NpgsqlSingletonOptions()),
new ExceptionDetector()))),
singletonOptions);
}
private const string ConnectionString = "Fake Connection String";
private static IDbContextOptions CreateOptions(
RelationalOptionsExtension optionsExtension = null)
{
var optionsBuilder = new DbContextOptionsBuilder();
((IDbContextOptionsBuilderInfrastructure)optionsBuilder)
.AddOrUpdateExtension(
optionsExtension
?? new FakeRelationalOptionsExtension().WithConnectionString(ConnectionString));
return optionsBuilder.Options;
}
private class FakeDbContext : DbContext
{
public FakeDbContext()
{
}
public FakeDbContext(DbContextOptions<FakeDbContext> options)
: base(options)
{
}
}
}