From a6f7bd2daf34bb04b7bd0efe99423a9a16f3eafd Mon Sep 17 00:00:00 2001 From: Glen Date: Thu, 3 Sep 2026 14:11:39 +0200 Subject: [PATCH] Skip Fusion Redis tests from the test body when Redis is unreachable --- .../RedisEventStreamBrokerTests.cs | 6 ++++++ .../RedisFixture.cs | 20 ++++++++++++++++--- .../RedisSubscriptionTests.cs | 1 + 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisEventStreamBrokerTests.cs b/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisEventStreamBrokerTests.cs index 19d69f3327e..75ddd4c0944 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisEventStreamBrokerTests.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisEventStreamBrokerTests.cs @@ -12,6 +12,7 @@ public sealed class RedisEventStreamBrokerTests(RedisFixture fixture) public async Task Subscribe_Should_DeliverPublishedEvent_When_RedisBrokerPublishes() { // arrange + fixture.SkipWhenUnavailable(); var channel = fixture.NextChannel(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60)); var ready = Channel.CreateUnbounded(); @@ -44,6 +45,7 @@ public async Task Subscribe_Should_DeliverPublishedEvent_When_RedisBrokerPublish public async Task Subscribe_Should_MergeAllChannelsIntoOneStream_When_MultipleTopicsSubscribed() { // arrange + fixture.SkipWhenUnavailable(); var channelA = fixture.NextChannel(); var channelB = fixture.NextChannel(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60)); @@ -75,6 +77,7 @@ public async Task Subscribe_Should_MergeAllChannelsIntoOneStream_When_MultipleTo public async Task Subscribe_Should_DeliverEveryEventToEachSubscriber_When_TwoConcurrentSubscribers() { // arrange + fixture.SkipWhenUnavailable(); var channel = fixture.NextChannel(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60)); var ready = Channel.CreateUnbounded(); @@ -118,6 +121,7 @@ public async Task Subscribe_Should_DeliverEveryEventToEachSubscriber_When_TwoCon public async Task Subscribe_Should_ThrowInvalidCursor_When_CursorSupplied() { // arrange + fixture.SkipWhenUnavailable(); var channel = fixture.NextChannel(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60)); var services = CreateServices(); @@ -141,6 +145,7 @@ public async Task Subscribe_Should_ThrowInvalidCursor_When_CursorSupplied() public async Task Subscribe_Should_CloseConsumerCleanly_When_CancellationRequested() { // arrange + fixture.SkipWhenUnavailable(); var channel = fixture.NextChannel(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60)); var ready = Channel.CreateUnbounded(); @@ -177,6 +182,7 @@ public async Task Subscribe_Should_CloseConsumerCleanly_When_CancellationRequest public async Task DisposeAsync_Should_NotDisposeConnectionMultiplexer_When_CallerSupplied() { // arrange + fixture.SkipWhenUnavailable(); await using var multiplexer = await ConnectionMultiplexer.ConnectAsync(fixture.ConnectionString); var services = new ServiceCollection(); services.AddRedisEventStreamBroker( diff --git a/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisFixture.cs b/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisFixture.cs index 895265c8684..91394ab2987 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisFixture.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisFixture.cs @@ -8,7 +8,7 @@ namespace HotChocolate.Fusion.Subscriptions.Redis; /// /// /// The default path starts Redis through Testcontainers. Set REDIS_CONNECTION_STRING to use an -/// existing Redis instance instead. +/// existing Redis instance instead; tests skip when that instance cannot be reached. /// public sealed class RedisFixture : IAsyncLifetime { @@ -32,6 +32,8 @@ public RedisFixture() public string ConnectionString { get; private set; } = null!; + public string? SkipReason { get; private set; } + public string NextChannel() => "events-" + Guid.NewGuid().ToString("N"); @@ -45,9 +47,9 @@ public async ValueTask InitializeAsync() } catch (Exception ex) { - Assert.Skip( + SkipReason = "REDIS_CONNECTION_STRING did not point to a usable Redis instance: " - + ex.Message); + + ex.Message; } return; @@ -85,6 +87,18 @@ await subscriber .ConfigureAwait(false); } + /// + /// Skips the calling test when REDIS_CONNECTION_STRING points at an instance that could not + /// be reached. + /// + public void SkipWhenUnavailable() + { + if (SkipReason is not null) + { + Assert.Skip(SkipReason); + } + } + private async Task GetPublisherAsync() { if (_publisher is not null) diff --git a/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisSubscriptionTests.cs b/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisSubscriptionTests.cs index e7aa252d49d..84dba7ee90d 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisSubscriptionTests.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisSubscriptionTests.cs @@ -22,6 +22,7 @@ public RedisSubscriptionTests(RedisFixture fixture) public async Task Subscribe_Should_DeliverEventWithCrossSchemaData_When_RedisBrokerPublishes() { // arrange + _fixture.SkipWhenUnavailable(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60)); var channel = _fixture.NextChannel(); var ready = CreateReadyChannel();