using SurrealDb.Net.Models.Response; using ZB.MOM.WW.CBDDC.Persistence.Surreal; namespace ZB.MOM.WW.CBDDC.Sample.Console.Tests; public class SurrealInfrastructureReadinessTests { /// /// Verifies schema initialization runs only once for repeated calls. /// [Fact] public async Task SchemaInitializer_ShouldApplySchemaOnlyOnce() { var embeddedClient = Substitute.For(); embeddedClient.RawQueryAsync( Arg.Any(), Arg.Any>(), Arg.Any()) .Returns(Task.FromResult(default(SurrealDbResponse)!)); var options = new CBDDCSurrealEmbeddedOptions { Cdc = new CBDDCSurrealCdcOptions { CheckpointTable = "custom_checkpoint", RetentionDuration = TimeSpan.FromHours(12) } }; var initializer = new CBDDCSurrealSchemaInitializer(embeddedClient, options); await initializer.EnsureInitializedAsync(); await initializer.EnsureInitializedAsync(); await embeddedClient.Received(1).RawQueryAsync( Arg.Is(sql => sql.Contains("DEFINE TABLE OVERWRITE cbddc_oplog_entries", StringComparison.Ordinal) && sql.Contains("CHANGEFEED 12h", StringComparison.Ordinal) && sql.Contains("DEFINE TABLE OVERWRITE custom_checkpoint", StringComparison.Ordinal)), Arg.Any>(), Arg.Any()); } /// /// Verifies invalid checkpoint table identifiers are rejected. /// [Fact] public void SchemaInitializer_WhenCheckpointIdentifierIsInvalid_ThrowsArgumentException() { var embeddedClient = Substitute.For(); var options = new CBDDCSurrealEmbeddedOptions { Cdc = new CBDDCSurrealCdcOptions { CheckpointTable = "invalid-checkpoint" } }; Should.Throw(() => new CBDDCSurrealSchemaInitializer(embeddedClient, options)); } /// /// Verifies readiness returns true when schema init and health checks succeed. /// [Fact] public async Task ReadinessProbe_WhenSchemaAndHealthSucceed_ReturnsTrue() { var embeddedClient = Substitute.For(); embeddedClient.HealthAsync(Arg.Any()).Returns(true); var schemaInitializer = Substitute.For(); schemaInitializer.EnsureInitializedAsync(Arg.Any()).Returns(Task.CompletedTask); var probe = new CBDDCSurrealReadinessProbe(embeddedClient, schemaInitializer); bool isReady = await probe.IsReadyAsync(); isReady.ShouldBeTrue(); await schemaInitializer.Received(1).EnsureInitializedAsync(Arg.Any()); await embeddedClient.Received(1).HealthAsync(Arg.Any()); } /// /// Verifies readiness returns false when schema initialization fails. /// [Fact] public async Task ReadinessProbe_WhenSchemaInitializationThrows_ReturnsFalse() { var embeddedClient = Substitute.For(); var schemaInitializer = Substitute.For(); schemaInitializer.EnsureInitializedAsync(Arg.Any()) .Returns(Task.FromException(new InvalidOperationException("boom"))); var probe = new CBDDCSurrealReadinessProbe(embeddedClient, schemaInitializer); bool isReady = await probe.IsReadyAsync(); isReady.ShouldBeFalse(); await embeddedClient.DidNotReceive().HealthAsync(Arg.Any()); } }