fix: serialize database activity during playout
This commit is contained in:
@@ -17,6 +17,8 @@ public sealed class DatabaseHealthServiceTests
|
||||
Assert.Equal(DatabaseHealthState.NotConfigured, status.State);
|
||||
Assert.Equal(DataSourceKind.Oracle, status.Source);
|
||||
Assert.Equal(TimeSpan.Zero, status.Elapsed);
|
||||
Assert.Null(status.IsTransient);
|
||||
Assert.Null(status.ProviderErrorCode);
|
||||
Assert.Equal(0, executor.CallCount);
|
||||
}
|
||||
|
||||
@@ -37,6 +39,8 @@ public sealed class DatabaseHealthServiceTests
|
||||
|
||||
Assert.Equal(DatabaseHealthState.Healthy, status.State);
|
||||
Assert.Equal(source, status.Source);
|
||||
Assert.Null(status.IsTransient);
|
||||
Assert.Null(status.ProviderErrorCode);
|
||||
Assert.Equal(1, executor.CallCount);
|
||||
Assert.Equal(expectedQuery, executor.LastQuery);
|
||||
}
|
||||
@@ -48,7 +52,10 @@ public sealed class DatabaseHealthServiceTests
|
||||
var executor = new StubDataQueryExecutor
|
||||
{
|
||||
ExecuteAsyncHandler = (_, _, _, _) => Task.FromException<DataTable>(
|
||||
new DatabaseQueryException(DataSourceKind.MariaDb, isTransient: true))
|
||||
new DatabaseQueryException(
|
||||
DataSourceKind.MariaDb,
|
||||
isTransient: true,
|
||||
providerErrorCode: 1042))
|
||||
};
|
||||
var service = new DatabaseHealthService(executor, TestOptions.CreateConfigured());
|
||||
|
||||
@@ -56,6 +63,8 @@ public sealed class DatabaseHealthServiceTests
|
||||
|
||||
Assert.Equal(DatabaseHealthState.Unhealthy, status.State);
|
||||
Assert.Equal(DataSourceKind.MariaDb, status.Source);
|
||||
Assert.True(status.IsTransient);
|
||||
Assert.Equal(1042, status.ProviderErrorCode);
|
||||
Assert.DoesNotContain(host, status.UserMessage, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
@@ -73,6 +82,25 @@ public sealed class DatabaseHealthServiceTests
|
||||
|
||||
Assert.Equal(DatabaseHealthState.TimedOut, status.State);
|
||||
Assert.Equal(DataSourceKind.Oracle, status.Source);
|
||||
Assert.True(status.IsTransient);
|
||||
Assert.Null(status.ProviderErrorCode);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CheckAsync_NonOperationInfrastructureFailure_DoesNotInventDiagnostics()
|
||||
{
|
||||
var executor = new StubDataQueryExecutor
|
||||
{
|
||||
ExecuteAsyncHandler = (_, _, _, _) => Task.FromException<DataTable>(
|
||||
new DatabaseConfigurationException("safe configuration failure"))
|
||||
};
|
||||
var service = new DatabaseHealthService(executor, TestOptions.CreateConfigured());
|
||||
|
||||
var status = await service.CheckAsync(DataSourceKind.Oracle);
|
||||
|
||||
Assert.Equal(DatabaseHealthState.Unhealthy, status.State);
|
||||
Assert.Null(status.IsTransient);
|
||||
Assert.Null(status.ProviderErrorCode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -132,6 +132,15 @@ test("A database refresh fault clears only after TAKE OUT resets refresh state",
|
||||
assert.equal(safety.shouldClearRefreshError(unrelated, false), false);
|
||||
});
|
||||
|
||||
test("Database health snapshots accept only a strictly increasing native sequence", () => {
|
||||
assert.equal(safety.isNewerDatabaseStatusSequence(0, 1), true);
|
||||
assert.equal(safety.isNewerDatabaseStatusSequence(7, 8), true);
|
||||
assert.equal(safety.isNewerDatabaseStatusSequence(7, 7), false);
|
||||
assert.equal(safety.isNewerDatabaseStatusSequence(7, 6), false);
|
||||
assert.equal(safety.isNewerDatabaseStatusSequence(7, "8"), false);
|
||||
assert.equal(safety.isNewerDatabaseStatusSequence(7, null), false);
|
||||
});
|
||||
|
||||
test("Stored conditional aliases preserve the exact builder owner", () => {
|
||||
const catalog = [
|
||||
{ builderKey: "s5032", code: "5032", aliases: ["5032", "8018", "8032"] },
|
||||
|
||||
Reference in New Issue
Block a user