Skip to content

Commit cb05a25

Browse files
committed
corrected connection string management so that all tests work
1 parent ed21853 commit cb05a25

File tree

16 files changed

+103
-51
lines changed

16 files changed

+103
-51
lines changed

src/Server/Coderr.Server.Infrastructure/ConnectionFactory.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#if NET452
2+
using System;
23
using System.Configuration;
34
using System.Data;
45
using System.Data.Common;
@@ -14,23 +15,33 @@ public class DbConnectionFactory
1415
/// Opens a connection
1516
/// </summary>
1617
/// <returns>open connection</returns>
17-
public static IDbConnection Open(ConnectionStringSettings connectionString, bool throwIfMissing)
18+
public static IDbConnection Open(bool throwIfMissing)
1819
{
19-
var provider = DbProviderFactories.GetFactory(connectionString.ProviderName);
20+
var conString = ConfigurationManager.ConnectionStrings["Db"];
21+
if (conString == null)
22+
throw new ConfigurationErrorsException("Failed to find connectionString 'Db' in web.config");
23+
24+
var hostConnectionString = Environment.GetEnvironmentVariable("coderr_ConnectionString");
25+
if (!string.IsNullOrEmpty(hostConnectionString))
26+
{
27+
conString = new ConnectionStringSettings(conString.Name, hostConnectionString, conString.ProviderName);
28+
}
29+
30+
var provider = DbProviderFactories.GetFactory(conString.ProviderName);
2031
if (provider == null)
2132
throw new ConfigurationErrorsException(
22-
$"Sql provider '{connectionString.ProviderName}' was not found/registered.");
33+
$"SQL provider '{conString.ProviderName}' was not found/registered.");
2334

2435
var connection = provider.CreateConnection();
25-
connection.ConnectionString = connectionString.ConnectionString + ";connect timeout=22;";
36+
connection.ConnectionString = conString.ConnectionString + ";connect timeout=22;";
2637
try
2738
{
2839
connection.Open();
2940
}
3041
catch (DataException ex)
3142
{
3243
throw new DataException(
33-
$"Failed to connect to '{connectionString.ConnectionString}'. See inner exception for the reason.", ex);
44+
$"Failed to connect to '{conString.ConnectionString}'. See inner exception for the reason.", ex);
3445
}
3546

3647
return connection;

src/Server/Coderr.Server.SqlServer.Tests/Core/ApiKeys/Commands/CreateApiKeyHandlerTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ private void GetApplicationId()
7777
{
7878

7979
var repos = new ApplicationRepository(uow);
80-
var id = uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications");
80+
var id = uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications WITH (ReadPast)");
8181
if (id is DBNull || id is null)
8282
{
8383
repos.CreateAsync(new Application(10, "AppTen")).GetAwaiter().GetResult();
84-
_applicationId = (int)uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications");
84+
_applicationId = (int)uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications WITH (ReadPast)");
8585
}
8686
else
8787
_applicationId = (int)id;

src/Server/Coderr.Server.SqlServer.Tests/Core/ApiKeys/Commands/DeleteApiKeyHandlerTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ private void GetApplicationId()
8787
using (var uow = CreateUnitOfWork())
8888
{
8989
var repos = new ApplicationRepository(uow);
90-
var id = uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications");
90+
var id = uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications WITH (ReadPast)");
9191
if (id is DBNull || id is null)
9292
{
9393
repos.CreateAsync(new Application(10, "AppTen")).Wait();
94-
_applicationId = (int)uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications");
94+
_applicationId = (int)uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications WITH (ReadPast)");
9595
}
9696
else
9797
_applicationId = (int)id;

src/Server/Coderr.Server.SqlServer.Tests/Core/ApiKeys/Queries/GetApiKeyHandlerTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,13 @@ public async void Should_Be_able_to_fetch_existing_key_by_id()
6868

6969
private void GetApplication()
7070
{
71+
if (_application != null)
72+
return;
73+
7174
using (var uow = CreateUnitOfWork())
7275
{
7376
var repos = new ApplicationRepository(uow);
74-
var id = uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications");
77+
var id = uow.ExecuteScalar("SELECT TOP 1 Id FROM Applications WITH (ReadPast)");
7578
if (id is DBNull || id is null)
7679
{
7780
_application = new Application(10, "AppTen");

src/Server/Coderr.Server.SqlServer.Tests/Helpers/DatabaseManager.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Configuration;
23
using System.Data;
34
using System.Data.SqlClient;
45
using System.Diagnostics;
@@ -19,14 +20,25 @@ public class DatabaseManager : IDisposable
1920
private bool _deleted;
2021
private readonly string _masterConString;
2122

22-
public DatabaseManager(string databaseName = null)
23+
public DatabaseManager(string databaseName = null, Func<string> connectionStringTemplateProvider = null)
2324
{
25+
if (connectionStringTemplateProvider == null)
26+
{
27+
connectionStringTemplateProvider = () =>
28+
{
29+
var conString = ConfigurationManager.ConnectionStrings["Db"];
30+
if (conString == null)
31+
throw new ConfigurationErrorsException("Failed to find connectionstring 'Db'.");
32+
return conString.ConnectionString;
33+
};
34+
}
35+
2436
var instanceId = Interlocked.Increment(ref InstanceCounter);
2537
_databaseName = databaseName ?? $"coderTest{DateTime.Now:MMddHHmmss}_{instanceId}";
2638
Console.WriteLine("DBNMAE: " + _databaseName);
27-
ConnectionString = ConnectionStringHelper.GetConnectionString().ConnectionString
39+
ConnectionString = connectionStringTemplateProvider()
2840
.Replace("{databaseName}", _databaseName);
29-
_masterConString = ConnectionStringHelper.GetConnectionString().ConnectionString
41+
_masterConString = connectionStringTemplateProvider()
3042
.Replace("{databaseName}", "master");
3143
UpdateToLatestVestion = true;
3244
}
@@ -46,8 +58,8 @@ public void Dispose()
4658
public void CreateEmptyDatabase()
4759
{
4860
Debug.WriteLine("*****DBNAME: " + ConnectionString);
49-
var builder = new SqlConnectionStringBuilder(ConnectionString);
50-
Environment.SetEnvironmentVariable("coderr_ConnectionString", $"Data Source={builder.DataSource}");
61+
//var builder = new SqlConnectionStringBuilder(ConnectionString);
62+
Environment.SetEnvironmentVariable("coderr_ConnectionString", ConnectionString);
5163

5264
using (var con = OpenConnection(_masterConString))
5365
{
@@ -86,7 +98,7 @@ public void InitSchema()
8698
}
8799
catch (SqlException ex)
88100
{
89-
throw new DataException(_databaseName + " schema init failed.", ex);
101+
throw new DataException(_databaseName + " [" + ConnectionString + "] schema init failed.", ex);
90102
}
91103
}
92104

src/Server/Coderr.Server.SqlServer.Tests/SchemaManagerTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using codeRR.Server.SqlServer.Tests.Helpers;
34
using FluentAssertions;
45
using Griffin.Data.Mapper;
@@ -13,6 +14,7 @@ public class SchemaManagerTests
1314
[Fact]
1415
public void Should_report_upgradable_if_schema_version_is_less()
1516
{
17+
Thread.Sleep(1000);
1618
using (var dbMgr = new DatabaseManager())
1719
{
1820
dbMgr.UpdateToLatestVestion = false;
@@ -31,6 +33,7 @@ public void Should_report_upgradable_if_schema_version_is_less()
3133
[Fact]
3234
public void Should_not_report_upgradable_if_schema_version_is_same()
3335
{
36+
Thread.Sleep(1000);
3437
using (var dbMgr = new DatabaseManager())
3538
{
3639
dbMgr.UpdateToLatestVestion = false;
@@ -48,6 +51,7 @@ public void Should_not_report_upgradable_if_schema_version_is_same()
4851
[Fact]
4952
public void Should_report_upgradable_if_schema_table_is_missing()
5053
{
54+
Thread.Sleep(1000);
5155
using (var dbMgr = new DatabaseManager())
5256
{
5357
dbMgr.UpdateToLatestVestion = false;
@@ -63,6 +67,7 @@ public void Should_report_upgradable_if_schema_table_is_missing()
6367
[Fact]
6468
public void Should_be_able_to_upgrade_schema()
6569
{
70+
Thread.Sleep(1000);
6671
using (var dbMgr = new DatabaseManager())
6772
{
6873
dbMgr.UpdateToLatestVestion = false;

src/Server/Coderr.Server.SqlServer/SchemaManager.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
using System.IO;
55
using System.Linq;
66
using System.Reflection;
7+
using log4net;
78

89
namespace codeRR.Server.SqlServer
910
{
1011
public class SchemaManager
1112
{
1213
private readonly Func<IDbConnection> _connectionFactory;
1314
private const string SchemaNamespace = "codeRR.Server.SqlServer.Schema";
15+
private ILog _logger = LogManager.GetLogger(typeof(SchemaManager));
1416

1517
public SchemaManager(Func<IDbConnection> connectionFactory)
1618
{
@@ -27,9 +29,13 @@ public bool CanSchemaBeUpgraded()
2729
return embeddedSchema > version;
2830
}
2931

32+
private bool invoked = false;
3033

3134
public void CreateInitialStructure()
3235
{
36+
if (invoked)
37+
throw new InvalidOperationException("Invoked");
38+
invoked = true;
3339
using (var con = _connectionFactory())
3440
{
3541
var resourceName = $"{SchemaNamespace}.Database.sql";
@@ -40,6 +46,7 @@ public void CreateInitialStructure()
4046
{
4147
cmd.Transaction = transaction;
4248
cmd.CommandText = sql;
49+
Console.WriteLine("CON " + con.ConnectionString + " SQL: " + sql);
4350
cmd.ExecuteNonQuery();
4451
transaction.Commit();
4552
}

src/Server/Coderr.Server.SqlServer/SqlServerTools.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Configuration;
23
using System.Data;
34
using System.Data.Common;
45
using System.Data.SqlClient;
@@ -11,6 +12,11 @@ namespace codeRR.Server.SqlServer
1112
/// <summary>
1213
/// MS Sql Server specific implementation of the database tools.
1314
/// </summary>
15+
/// <remarks>
16+
/// <para>
17+
/// These tools should only be used during setup and updates.
18+
/// </para>
19+
/// </remarks>
1420
public class SqlServerTools : ISetupDatabaseTools
1521
{
1622
private readonly SchemaManager _schemaManager;
@@ -26,8 +32,8 @@ private bool IsConnectionConfigured
2632
{
2733
get
2834
{
29-
var connectionString = ConnectionStringHelper.GetConnectionString();
30-
return !string.IsNullOrEmpty(connectionString?.ConnectionString);
35+
var conString = GetConnectionString(false);
36+
return !string.IsNullOrEmpty(conString?.ConnectionString);
3137
}
3238
}
3339

@@ -107,9 +113,18 @@ public static IDbConnection OpenConnection(string connectionString)
107113
return con;
108114
}
109115

110-
public static IDbConnection OpenConnection()
116+
protected ConnectionStringSettings GetConnectionString(bool throwOnError = true)
111117
{
112-
var conStr = ConnectionStringHelper.GetConnectionString();
118+
var db = ConfigurationManager.ConnectionStrings["Db"];
119+
if (db == null && throwOnError)
120+
throw new ConfigurationErrorsException("The connectionString 'Db' is missing in web.config.");
121+
122+
return db;
123+
}
124+
125+
private IDbConnection OpenConnection()
126+
{
127+
var conStr = GetConnectionString();
113128
var provider = DbProviderFactories.GetFactory(conStr.ProviderName);
114129
var connection = provider.CreateConnection();
115130
connection.ConnectionString = conStr.ConnectionString;
Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
using System;
2-
using System.Configuration;
1+
//using System;
2+
//using System.Configuration;
33

4-
namespace codeRR.Server.SqlServer.Tools
5-
{
6-
public static class ConnectionStringHelper
7-
{
8-
public static ConnectionStringSettings GetConnectionString()
9-
{
10-
var connectionStringName = ConfigurationManager.AppSettings["ConnectionStringName"] ?? "Db";
4+
//namespace codeRR.Server.SqlServer.Tools
5+
//{
6+
// public static class ConnectionStringHelper
7+
// {
8+
// public static ConnectionStringSettings GetConnectionString()
9+
// {
10+
// var connectionStringName = ConfigurationManager.AppSettings["ConnectionStringName"] ?? "Db";
1111

12-
var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName];
12+
// var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName];
1313

14-
var environmentConnectionString = Environment.GetEnvironmentVariable("coderr_ConnectionString");
15-
if (!string.IsNullOrEmpty(environmentConnectionString))
16-
{
17-
connectionString = new ConnectionStringSettings(connectionStringName, environmentConnectionString, connectionString.ProviderName);
18-
}
14+
// var environmentConnectionString = Environment.GetEnvironmentVariable("coderr_ConnectionString");
15+
// if (!string.IsNullOrEmpty(environmentConnectionString))
16+
// {
17+
// connectionString = new ConnectionStringSettings(connectionStringName, environmentConnectionString, connectionString.ProviderName);
18+
// }
1919

20-
return connectionString;
21-
}
22-
}
23-
}
20+
// return connectionString;
21+
// }
22+
// }
23+
//}

src/Server/Coderr.Server.Web/App_Start/CompositionRoot.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void Build(Action<ContainerRegistrar> action, ConfigurationStore configSt
3131
action(builder);
3232

3333
builder.RegisterComponents(Lifetime.Scoped, Assembly.GetExecutingAssembly());
34-
builder.RegisterService(CreateConnection, Lifetime.Scoped);
34+
builder.RegisterService(CreateUnitOfWork, Lifetime.Scoped);
3535
builder.RegisterService(CreateTaskInvoker, Lifetime.Singleton);
3636

3737
RegisterBuiltInComponents(builder);
@@ -53,9 +53,9 @@ public void Build(Action<ContainerRegistrar> action, ConfigurationStore configSt
5353
Container = new GriffinContainerAdapter(ioc);
5454
}
5555

56-
private IAdoNetUnitOfWork CreateConnection(IServiceLocator arg)
56+
private IAdoNetUnitOfWork CreateUnitOfWork(IServiceLocator arg)
5757
{
58-
var con = DbConnectionFactory.Open(Startup.ConnectionString, true);
58+
var con = DbConnectionFactory.Open(true);
5959
return new AdoNetUnitOfWork(con, true, IsolationLevel.RepeatableRead);
6060
}
6161

0 commit comments

Comments
 (0)