Repository navigation
Share test containers per assembly via xUnit assembly fixtures - #10342
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
🟢 Approval recommended
The changes are internally consistent across the converted test assemblies and the new shared-resource disposal hooks cleanly manage cached clients without introducing behavioral issues in the updated tests.
Pull request overview
This PR reduces container churn in integration tests by moving container-backed resources to xUnit assembly fixtures (one container per test assembly) and by making shared container resources own and reuse their client connections safely across all tests in that assembly.
Changes:
- Convert multiple test projects from per-class
IClassFixture<T>usage to[assembly: AssemblyFixture(typeof(...))]for container-backed resources. - Add a
DisposeAsyncCorehook toContainerResource<T>and update Redis/Mongo/NATS resources to cache and dispose their client connections once per fixture. - Introduce
NatsResource.CreateStreamAsync+NatsStreamto create uniquely named, self-deleting JetStream streams and update NATS tests to use it; also scope the RedisPUBSUB CHANNELSprobe to the subscription’s own channel.
File summaries
| File | Description |
|---|---|
| src/HotChocolate/Raven/test/Data.Raven.Tests/FluentApiTests.cs | Remove per-class fixture interface in favor of assembly fixture injection. |
| src/HotChocolate/Raven/test/Data.Raven.Tests/DataExtensionsTests.cs | Remove per-class fixture interface in favor of assembly fixture injection. |
| src/HotChocolate/Raven/test/Data.Raven.Tests/Assembly.cs | Register RavenDBResource as an assembly fixture. |
| src/HotChocolate/Raven/test/Data.Raven.Tests/AnnotationBasedTests.cs | Remove per-class fixture interface; rely on injected resource. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/ServiceCollectionExtensionsTests.cs | Stop using IClassFixture<RedisResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/RequestExecutorBuilderTests.cs | Stop using IClassFixture<RedisResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/RedisOperationDocumentStorageTests.cs | Stop using IClassFixture<RedisResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/IntegrationTests.cs | Stop using IClassFixture<RedisResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.Redis.Tests/Assembly.cs | Register RedisResource as an assembly fixture. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/ServiceCollectionExtensionsTests.cs | Stop using IClassFixture<AzureStorageBlobResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/RequestExecutorBuilderTests.cs | Stop using IClassFixture<AzureStorageBlobResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/IntegrationTests.cs | Stop using IClassFixture<AzureStorageBlobResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/AzureBlobStorageOperationDocumentStorageTests.cs | Stop using IClassFixture<AzureStorageBlobResource>; rely on assembly fixture injection. |
| src/HotChocolate/PersistedOperations/test/PersistedOperations.AzureBlobStorage.Tests/Assembly.cs | Register AzureStorageBlobResource as an assembly fixture. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortVisitorStringTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortVisitorObjectTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortVisitorEnumTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortVisitorComparableTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortVisitorBooleanTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbSortCollectionTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbFindFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/MongoDbAggregateFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Sorting.Tests/Assembly.cs | Register MongoResource as an assembly fixture (sorting tests). |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/MongoDbProjectionVisitorScalarTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/MongoDbProjectionVisitorPagingTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/MongoDbProjectionVisitorIsProjectedTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/MongoDbProjectionObjectTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Projections.Tests/Assembly.cs | Register MongoResource as an assembly fixture (projections tests). |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingFindFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbOffsetPagingAggregateTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingFindFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbCursorPagingAggregateFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/Assembly.cs | Register MongoResource as an assembly fixture (paging tests). |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFindFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorTimeOnlyTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorStringTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorObjectTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorObjectIdTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorListTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorEnumTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorDateOnlyTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorComparableTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterVisitorBooleanTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbFilterCombinatorTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbCollectionTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/MongoDbAggregateFluentTests.cs | Remove IClassFixture<MongoResource>; rely on assembly fixture injection. |
| src/HotChocolate/MongoDb/test/Data.MongoDb.Filters.Tests/Assembly.cs | Register MongoResource as an assembly fixture (filters tests). |
| src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisSubscriptionTests.cs | Remove IClassFixture<RedisFixture>; rely on assembly fixture injection. |
| src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/RedisEventStreamBrokerTests.cs | Remove IClassFixture<RedisFixture>; rely on assembly fixture injection. |
| src/HotChocolate/Fusion/test/Fusion.Subscriptions.Redis.Tests/Assembly.cs | Register RedisFixture as an assembly fixture. |
| src/HotChocolate/Fusion/test/Fusion.Subscriptions.NATS.Tests/NatsSubscriptionTests.cs | Remove IClassFixture<NatsResource>; rely on assembly fixture injection. |
| src/HotChocolate/Fusion/test/Fusion.Subscriptions.NATS.Tests/NatsEventStreamBrokerTests.cs | Switch to NatsResource.CreateStreamAsync and remove per-test stream helper. |
| src/HotChocolate/Fusion/test/Fusion.Subscriptions.NATS.Tests/Assembly.cs | Register NatsResource as an assembly fixture. |
| src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Subscriptions/NatsEventStreamGatewayTests.cs | Use NatsResource.CreateStreamAsync and remove per-test stream helper. |
| src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/NatsEventStreamOverHttpTests.cs | Share NATS server via collection fixture and use self-deleting streams. |
| src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/NatsCollectionFixture.cs | Add a collection fixture to share NatsResource across selected tests. |
| src/HotChocolate/Fusion/test/Fusion.AspNetCore.Tests/EventStreamEnrichmentErrorOverHttpTests.cs | Share NATS server via collection fixture and use self-deleting streams. |
| src/HotChocolate/Core/test/Subscriptions.Redis.Tests/RedisTopicPrefixIntegrationTests.cs | Remove IClassFixture<RedisResource>; rely on assembly fixture injection. |
| src/HotChocolate/Core/test/Subscriptions.Redis.Tests/RedisIntegrationTests.cs | Scope PUBSUB CHANNELS probe to the subscription’s channel (MD5 topic hash). |
| src/HotChocolate/Core/test/Subscriptions.Redis.Tests/Assembly.cs | Register RedisResource as an assembly fixture. |
| src/HotChocolate/Core/test/Subscriptions.Postgres.Tests/ResilientNpgsqlConnectionTests.cs | Remove IClassFixture<PostgreSqlResource>; rely on assembly fixture injection. |
| src/HotChocolate/Core/test/Subscriptions.Postgres.Tests/PostgresPubSubIntegrationTests.cs | Remove IClassFixture<PostgreSqlResource>; rely on assembly fixture injection. |
| src/HotChocolate/Core/test/Subscriptions.Postgres.Tests/PostgresChannelWriterTests.cs | Remove IClassFixture<PostgreSqlResource>; rely on assembly fixture injection. |
| src/HotChocolate/Core/test/Subscriptions.Postgres.Tests/PostgresChannelTests.cs | Remove IClassFixture<PostgreSqlResource>; rely on assembly fixture injection. |
| src/HotChocolate/Core/test/Subscriptions.Postgres.Tests/Assembly.cs | Register PostgreSqlResource as an assembly fixture. |
| src/CookieCrumble/src/CookieCrumble.Resources/ContainerResource.cs | Add DisposeAsyncCore hook invoked before container disposal. |
| src/CookieCrumble/src/CookieCrumble.Resources.Redis/RedisResource.cs | Cache and dispose a single multiplexer per resource lifetime. |
| src/CookieCrumble/src/CookieCrumble.Resources.Nats/NatsStream.cs | Add disposable wrapper that deletes a JetStream stream on dispose. |
| src/CookieCrumble/src/CookieCrumble.Resources.Nats/NatsResource.cs | Add cached connection + CreateStreamAsync for unique, self-cleaning streams. |
| src/CookieCrumble/src/CookieCrumble.Resources.Nats/CookieCrumble.Resources.Nats.csproj | Add NATS client package references required for stream management. |
| src/CookieCrumble/src/CookieCrumble.Resources.Mongo/MongoResource.cs | Cache and dispose a single client per resource lifetime. |
Review details
- Files reviewed: 71/71 changed files
- Comments generated: 0
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Contributor
Patch coverage100.0% of changed lines covered (60/60)
Project coverage: 57.8% (287218/497237 lines) |
This was referenced Oct 25, 2026
Merged
This was referenced Nov 1, 2026
This was referenced Nov 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
[assembly: AssemblyFixture], so a run starts one container per assembly instead of one per test class:Data.Raven.Tests, the fourData.MongoDb.*.Testsprojects,PersistedOperations.Redis.Tests,PersistedOperations.AzureBlobStorage.Tests,Subscriptions.Postgres.Tests,Subscriptions.Redis.Tests,Fusion.Subscriptions.NATS.Tests, andFusion.Subscriptions.Redis.Tests. The two NATS-over-HTTP classes inFusion.AspNetCore.Testsshare one collection fixture instead of starting a container per test.ContainerResource<T>gains aDisposeAsyncCorehook that runs before the container is disposed.RedisResourcecaches one multiplexer andMongoResourceone client, both owned and disposed by the resource.NatsResource.CreateStreamAsyncreturns a uniquely named JetStream stream that deletes itself on dispose, replacing the per-test stream helpers in three test projects.RedisIntegrationTestsscopes itsPUBSUB CHANNELSprobe to the subscription's own channel so the unsubscribe test holds on a server shared with the topic-prefix class.Test plan
subjects overlap with an existing stream; with the self-deleting stream all eight pass.