diff --git a/src/Connectors/src/Connectors/PublicAPI.Shipped.txt b/src/Connectors/src/Connectors/PublicAPI.Shipped.txt index 85c0cffef8..75ddb6f408 100644 --- a/src/Connectors/src/Connectors/PublicAPI.Shipped.txt +++ b/src/Connectors/src/Connectors/PublicAPI.Shipped.txt @@ -112,3 +112,8 @@ Steeltoe.Connectors.SqlServer.SqlServerOptions.SqlServerOptions() -> void Steeltoe.Connectors.SqlServer.SqlServerServiceCollectionExtensions virtual Steeltoe.Connectors.ConnectorCreateConnection.Invoke(System.IServiceProvider! serviceProvider, string! serviceBindingName) -> object! virtual Steeltoe.Connectors.ConnectorCreateHealthContributor.Invoke(System.IServiceProvider! serviceProvider, string! serviceBindingName) -> Steeltoe.Common.HealthChecks.IHealthContributor! +Steeltoe.Connectors.RelationalDatabaseHealthContributor +Steeltoe.Connectors.RelationalDatabaseHealthContributor.RelationalDatabaseHealthContributor(System.Data.Common.DbConnection! connection, string? id, string? host, string? commandText, Microsoft.Extensions.Logging.ILogger! logger) -> void +Steeltoe.Connectors.RelationalDatabaseHealthContributor.RelationalDatabaseHealthContributor(System.Data.Common.DbConnection! connection, string? host, Microsoft.Extensions.Logging.ILogger! logger) -> void +Steeltoe.Connectors.RelationalDatabaseHealthContributor.CheckHealthAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +Steeltoe.Connectors.RelationalDatabaseHealthContributor.Dispose() -> void \ No newline at end of file diff --git a/src/Connectors/src/Connectors/RelationalDatabaseHealthContributor.cs b/src/Connectors/src/Connectors/RelationalDatabaseHealthContributor.cs index 04b1773a41..7e96f1fda0 100644 --- a/src/Connectors/src/Connectors/RelationalDatabaseHealthContributor.cs +++ b/src/Connectors/src/Connectors/RelationalDatabaseHealthContributor.cs @@ -10,24 +10,31 @@ namespace Steeltoe.Connectors; -internal sealed class RelationalDatabaseHealthContributor : IHealthContributor, IDisposable +public sealed class RelationalDatabaseHealthContributor : IHealthContributor, IDisposable { private readonly DbConnection _connection; private readonly ILogger _logger; + private readonly string _commandText; public string Id { get; } public string Host { get; } public string? ServiceName { get; set; } - public RelationalDatabaseHealthContributor(DbConnection connection, string? host, ILogger logger) + public RelationalDatabaseHealthContributor(DbConnection connection, string? id, string? host, string? commandText, ILogger logger) { ArgumentNullException.ThrowIfNull(connection); ArgumentNullException.ThrowIfNull(logger); _connection = connection; + _commandText = commandText ?? "SELECT 1;"; + Id = id ?? GetDatabaseType(connection); Host = host ?? string.Empty; _logger = logger; - Id = GetDatabaseType(connection); + } + + public RelationalDatabaseHealthContributor(DbConnection connection, string? host, ILogger logger): + this(connection, null, host, null, logger) + { } public async Task CheckHealthAsync(CancellationToken cancellationToken) @@ -51,7 +58,7 @@ public RelationalDatabaseHealthContributor(DbConnection connection, string? host { await _connection.OpenAsync(cancellationToken); DbCommand command = _connection.CreateCommand(); - command.CommandText = "SELECT 1;"; + command.CommandText = _commandText; await command.ExecuteScalarAsync(cancellationToken); result.Status = HealthStatus.Up; diff --git a/src/Connectors/test/Connectors.Test/RelationalDatabaseHealthContributorTest.cs b/src/Connectors/test/Connectors.Test/RelationalDatabaseHealthContributorTest.cs index 267d293dac..01aa2a7695 100644 --- a/src/Connectors/test/Connectors.Test/RelationalDatabaseHealthContributorTest.cs +++ b/src/Connectors/test/Connectors.Test/RelationalDatabaseHealthContributorTest.cs @@ -181,4 +181,46 @@ public async Task Canceled_Throws() await action.Should().ThrowExactlyAsync(); } + + [Fact] + public async Task Uses_Custom_Command_Text() + { + var commandMock = new Mock(); + commandMock.Setup(command => command.ExecuteScalarAsync(It.IsAny())).Returns(Task.FromResult(1)); + + var connectionMock = new Mock(); + connectionMock.Setup(connection => connection.Open()); + connectionMock.Protected().Setup("CreateDbCommand").Returns(() => commandMock.Object); + + using var healthContributor = + new RelationalDatabaseHealthContributor(connectionMock.Object, null, "localhost", "FOO_COMMAND", NullLogger.Instance) + { + ServiceName = "Example" + }; + + await healthContributor.CheckHealthAsync(TestContext.Current.CancellationToken); + + commandMock.VerifySet(command => command.CommandText = "FOO_COMMAND", Times.Once()); + } + + [Fact] + public async Task Uses_Default_Command_Text() + { + var commandMock = new Mock(); + commandMock.Setup(command => command.ExecuteScalarAsync(It.IsAny())).Returns(Task.FromResult(1)); + + var connectionMock = new Mock(); + connectionMock.Setup(connection => connection.Open()); + connectionMock.Protected().Setup("CreateDbCommand").Returns(() => commandMock.Object); + + using var healthContributor = + new RelationalDatabaseHealthContributor(connectionMock.Object, "localhost", NullLogger.Instance) + { + ServiceName = "Example" + }; + + await healthContributor.CheckHealthAsync(TestContext.Current.CancellationToken); + + commandMock.VerifySet(command => command.CommandText = "SELECT 1;", Times.Once()); + } }