Skip to content

Commit 768c3cd

Browse files
committed
Added support for supplying defaultCommandTimeout in DatabaseTestBase
1 parent c0661ef commit 768c3cd

2 files changed

Lines changed: 22 additions & 18 deletions

File tree

src/Dibix.Testing/Data/DatabaseTestBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace Dibix.Testing.Data
2323
#region Constructor
2424
protected DatabaseTestBase()
2525
{
26-
this._databaseAccessorFactoryAccessor = new Lazy<IDatabaseAccessorFactory>(() => CreateDatabaseAccessorFactory(base.Configuration));
26+
this._databaseAccessorFactoryAccessor = new Lazy<IDatabaseAccessorFactory>(() => CreateDatabaseAccessorFactory());
2727
}
2828
#endregion
2929

@@ -55,11 +55,11 @@ protected async Task ExecuteStoredProcedure(string storedProcedureName, Action<I
5555
await accessor.ExecuteAsync(storedProcedureName, CommandType.StoredProcedure, commandTimeout, parameterBuilder.Build(), CancellationToken.None).ConfigureAwait(false);
5656
}
5757
}
58+
59+
protected IDatabaseAccessorFactory CreateDatabaseAccessorFactory(int? commandTimeout = 30) => DatabaseTestUtility.CreateDatabaseAccessorFactory(base.Configuration, commandTimeout);
5860
#endregion
5961

6062
#region Private Methods
61-
private static IDatabaseAccessorFactory CreateDatabaseAccessorFactory(TConfiguration configuration) => DatabaseTestUtility.CreateDatabaseAccessorFactory(configuration);
62-
6363
private static TraceSource GetDibixTraceSource()
6464
{
6565
const string fieldName = "TraceSource";

src/Dibix.Testing/Data/DatabaseTestUtility.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public static class DatabaseTestUtility
1818
TConfiguration configuration = TestConfigurationLoader.Load<TConfiguration>(testContext);
1919
return CreateDatabaseAccessorFactory(configuration);
2020
}
21-
public static IDatabaseAccessorFactory CreateDatabaseAccessorFactory<TConfiguration>(TConfiguration configuration) where TConfiguration : DatabaseConfigurationBase, new()
21+
public static IDatabaseAccessorFactory CreateDatabaseAccessorFactory<TConfiguration>(TConfiguration configuration, int? defaultCommandTimeout = null) where TConfiguration : DatabaseConfigurationBase, new()
2222
{
23-
return new DapperDatabaseAccessorFactory(configuration.Database.ConnectionString, RaiseErrorWithNoWaitBehavior.ExecuteScalar);
23+
return new DapperDatabaseAccessorFactory(configuration.Database.ConnectionString, RaiseErrorWithNoWaitBehavior.ExecuteScalar, defaultCommandTimeout);
2424
}
2525

2626
// RAISERROR WITH NOWAIT is useful to receive immediate progress of a long running command.
@@ -43,24 +43,26 @@ private sealed class DapperDatabaseAccessorFactory : IDatabaseAccessorFactory
4343
{
4444
private readonly string _connectionString;
4545
private readonly RaiseErrorWithNoWaitBehavior _raiseErrorWithNoWaitBehavior;
46+
private readonly int? _defaultCommandTimeout;
4647

47-
public DapperDatabaseAccessorFactory(string connectionString, RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior)
48+
public DapperDatabaseAccessorFactory(string connectionString, RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior, int? defaultCommandTimeout)
4849
{
49-
this._connectionString = connectionString;
50-
this._raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior;
50+
_connectionString = connectionString;
51+
_raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior;
52+
_defaultCommandTimeout = defaultCommandTimeout;
5153
}
5254

5355
public IDatabaseAccessor Create()
5456
{
55-
SqlConnection connection = new SqlConnection(this._connectionString);
57+
SqlConnection connection = new SqlConnection(_connectionString);
5658

57-
if (this._raiseErrorWithNoWaitBehavior == RaiseErrorWithNoWaitBehavior.FireInfoMessageEventOnUserErrors)
59+
if (_raiseErrorWithNoWaitBehavior == RaiseErrorWithNoWaitBehavior.FireInfoMessageEventOnUserErrors)
5860
{
5961
connection.FireInfoMessageEventOnUserErrors = true;
6062
connection.InfoMessage += OnInfoMessage;
6163
}
6264

63-
return new DapperDatabaseAccessor(connection, this._raiseErrorWithNoWaitBehavior);
65+
return new DapperDatabaseAccessor(connection, _raiseErrorWithNoWaitBehavior, _defaultCommandTimeout);
6466
}
6567

6668
// When FireInfoMessageEventOnUserErrors is true, errors will trigger an info message event aswell, without throwing an exception.
@@ -85,28 +87,30 @@ private static void OnInfoMessage(object sender, SqlInfoMessageEventArgs e)
8587
private sealed class DapperDatabaseAccessor : Dapper.DapperDatabaseAccessor
8688
{
8789
private readonly RaiseErrorWithNoWaitBehavior _raiseErrorWithNoWaitBehavior;
90+
private readonly int? _defaultCommandTimeout;
8891

89-
public DapperDatabaseAccessor(DbConnection connection, RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior) : base(connection)
92+
public DapperDatabaseAccessor(DbConnection connection, RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior, int? defaultCommandTimeout) : base(connection, defaultCommandTimeout: defaultCommandTimeout)
9093
{
91-
this._raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior;
94+
_raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior;
95+
_defaultCommandTimeout = defaultCommandTimeout;
9296
}
9397

9498
// ExecuteNonQuery is optimized, and will not process any messages, so RAISERROR WITH NOWAIT will not work.
9599
// Here we override the underlying behavior, without the caller having to do it.
96100
protected override int Execute(string commandText, CommandType commandType, int? commandTimeout, ParametersVisitor parameters)
97101
{
98-
if (this._raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior.ExecuteScalar)
102+
if (_raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior.ExecuteScalar)
99103
return base.Execute(commandText, commandType, commandTimeout, parameters);
100104

101-
_ = base.Connection.ExecuteScalar(commandText, CollectParameters(parameters), transaction: null, commandTimeout, commandType);
105+
_ = base.Connection.ExecuteScalar(commandText, CollectParameters(parameters), transaction: null, _defaultCommandTimeout ?? commandTimeout, commandType);
102106
return default;
103107
}
104108
protected override async Task<int> ExecuteAsync(string commandText, CommandType commandType, int? commandTimeout, ParametersVisitor parameters, CancellationToken cancellationToken)
105109
{
106-
if (this._raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior.ExecuteScalar)
107-
return await base.ExecuteAsync(commandText, commandType, commandTimeout, parameters, cancellationToken);
110+
if (_raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior.ExecuteScalar)
111+
return await base.ExecuteAsync(commandText, commandType, commandTimeout, parameters, cancellationToken).ConfigureAwait(false);
108112

109-
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), transaction: null, commandTimeout, commandType, cancellationToken: cancellationToken);
113+
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), transaction: null, _defaultCommandTimeout ?? commandTimeout, commandType, cancellationToken: cancellationToken);
110114
_ = await base.Connection.ExecuteScalarAsync(command).ConfigureAwait(false);
111115
return default;
112116
}

0 commit comments

Comments
 (0)